Merge pull request #1005 from julienschmidt/handleRequest

shorten blocking call of h2quic.Server.handleRequest
This commit is contained in:
Marten Seemann
2017-12-08 16:16:29 +07:00
committed by GitHub

View File

@@ -164,8 +164,6 @@ func (s *Server) handleRequest(session streamCreator, headerStream quic.Stream,
return err return err
} }
req.RemoteAddr = session.RemoteAddr().String()
if utils.Debug() { if utils.Debug() {
utils.Infof("%s %s%s, on data stream %d", req.Method, req.Host, req.RequestURI, h2headersFrame.StreamID) utils.Infof("%s %s%s, on data stream %d", req.Method, req.Host, req.RequestURI, h2headersFrame.StreamID)
} else { } else {
@@ -181,20 +179,25 @@ func (s *Server) handleRequest(session streamCreator, headerStream quic.Stream,
return nil return nil
} }
var streamEnded bool // handleRequest should be as non-blocking as possible to minimize
if h2headersFrame.StreamEnded() { // head-of-line blocking. Potentially blocking code is run in a separate
dataStream.(remoteCloser).CloseRemote(0) // goroutine, enabling handleRequest to return before the code is executed.
streamEnded = true
_, _ = dataStream.Read([]byte{0}) // read the eof
}
req = req.WithContext(dataStream.Context())
reqBody := newRequestBody(dataStream)
req.Body = reqBody
responseWriter := newResponseWriter(headerStream, headerStreamMutex, dataStream, protocol.StreamID(h2headersFrame.StreamID))
go func() { go func() {
streamEnded := h2headersFrame.StreamEnded()
if streamEnded {
dataStream.(remoteCloser).CloseRemote(0)
streamEnded = true
_, _ = dataStream.Read([]byte{0}) // read the eof
}
req = req.WithContext(dataStream.Context())
reqBody := newRequestBody(dataStream)
req.Body = reqBody
req.RemoteAddr = session.RemoteAddr().String()
responseWriter := newResponseWriter(headerStream, headerStreamMutex, dataStream, protocol.StreamID(h2headersFrame.StreamID))
handler := s.Handler handler := s.Handler
if handler == nil { if handler == nil {
handler = http.DefaultServeMux handler = http.DefaultServeMux