Add sync.Pool to reuse packet conn buf object

This commit is contained in:
Kz Ho 2023-01-18 15:52:27 +08:00 committed by Huin
parent d8bd5d2d52
commit 62bd5c75d8

View File

@ -7,6 +7,7 @@ import (
"net" "net"
"net/http" "net/http"
"regexp" "regexp"
"sync"
) )
const ( const (
@ -73,20 +74,25 @@ func (srv *Server) Serve(l net.PacketConn) error {
if srv.MaxMessageBytes != 0 { if srv.MaxMessageBytes != 0 {
maxMessageBytes = srv.MaxMessageBytes maxMessageBytes = srv.MaxMessageBytes
} }
bufPool := &sync.Pool{
New: func() interface{} {
return make([]byte, maxMessageBytes)
},
}
for { for {
buf := make([]byte, maxMessageBytes) buf := bufPool.Get().([]byte)
n, peerAddr, err := l.ReadFrom(buf) n, peerAddr, err := l.ReadFrom(buf)
if err != nil { if err != nil {
return err return err
} }
buf = buf[:n] go func() {
defer bufPool.Put(buf)
go func(buf []byte, peerAddr net.Addr) {
// At least one router's UPnP implementation has added a trailing space // At least one router's UPnP implementation has added a trailing space
// after "HTTP/1.1" - trim it. // after "HTTP/1.1" - trim it.
buf = trailingWhitespaceRx.ReplaceAllLiteral(buf, crlf) reqBuf := trailingWhitespaceRx.ReplaceAllLiteral(buf[:n], crlf)
req, err := http.ReadRequest(bufio.NewReader(bytes.NewBuffer(buf))) req, err := http.ReadRequest(bufio.NewReader(bytes.NewBuffer(reqBuf)))
if err != nil { if err != nil {
log.Printf("httpu: Failed to parse request: %v", err) log.Printf("httpu: Failed to parse request: %v", err)
return return
@ -94,7 +100,7 @@ func (srv *Server) Serve(l net.PacketConn) error {
req.RemoteAddr = peerAddr.String() req.RemoteAddr = peerAddr.String()
srv.Handler.ServeMessage(req) srv.Handler.ServeMessage(req)
// No need to call req.Body.Close - underlying reader is bytes.Buffer. // No need to call req.Body.Close - underlying reader is bytes.Buffer.
}(buf, peerAddr) }()
} }
} }