forked from quic-go/quic-go
only open streams if we have a response body, fixes problems with 404s
This commit is contained in:
@@ -40,8 +40,9 @@ func main() {
|
|||||||
type responseWriter struct {
|
type responseWriter struct {
|
||||||
header http.Header
|
header http.Header
|
||||||
headerStream *quic.Stream
|
headerStream *quic.Stream
|
||||||
dataStream *quic.Stream
|
session *quic.Session
|
||||||
status int
|
status int
|
||||||
|
dataStreamID protocol.StreamID
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *responseWriter) Header() http.Header {
|
func (w *responseWriter) Header() http.Header {
|
||||||
@@ -69,13 +70,21 @@ func (w *responseWriter) Write(p []byte) (int, error) {
|
|||||||
|
|
||||||
h2framer := http2.NewFramer(w.headerStream, nil)
|
h2framer := http2.NewFramer(w.headerStream, nil)
|
||||||
h2framer.WriteHeaders(http2.HeadersFrameParam{
|
h2framer.WriteHeaders(http2.HeadersFrameParam{
|
||||||
StreamID: uint32(w.dataStream.StreamID),
|
StreamID: uint32(w.dataStreamID),
|
||||||
EndHeaders: true,
|
EndHeaders: true,
|
||||||
BlockFragment: headers.Bytes(),
|
BlockFragment: headers.Bytes(),
|
||||||
})
|
})
|
||||||
|
|
||||||
defer w.dataStream.Close()
|
if len(p) != 0 {
|
||||||
return w.dataStream.Write(p)
|
dataStream, err := w.session.NewStream(w.dataStreamID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, fmt.Errorf("error creating data stream: %s\n", err.Error())
|
||||||
|
}
|
||||||
|
defer dataStream.Close()
|
||||||
|
return dataStream.Write(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleStream(session *quic.Session, headerStream *quic.Stream) {
|
func handleStream(session *quic.Session, headerStream *quic.Stream) {
|
||||||
@@ -99,16 +108,11 @@ func handleStream(session *quic.Session, headerStream *quic.Stream) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
dataStream, err := session.NewStream(protocol.StreamID(h2frame.Header().StreamID))
|
|
||||||
if err != nil {
|
|
||||||
fmt.Printf("error creating headerStream: %s\n", err.Error())
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
responseWriter := &responseWriter{
|
responseWriter := &responseWriter{
|
||||||
header: http.Header{},
|
header: http.Header{},
|
||||||
headerStream: headerStream,
|
headerStream: headerStream,
|
||||||
dataStream: dataStream,
|
dataStreamID: protocol.StreamID(h2headersFrame.StreamID),
|
||||||
|
session: session,
|
||||||
}
|
}
|
||||||
|
|
||||||
go http.DefaultServeMux.ServeHTTP(responseWriter, req)
|
go http.DefaultServeMux.ServeHTTP(responseWriter, req)
|
||||||
|
|||||||
Reference in New Issue
Block a user