Add sync.Pool to reuse packet conn buf object
This commit is contained in:
parent
d8bd5d2d52
commit
62bd5c75d8
@ -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)
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user