forked from quic-go/quic-go
Merge pull request #1005 from julienschmidt/handleRequest
shorten blocking call of h2quic.Server.handleRequest
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user