From 88a82be2fa0ff1fcb3b7e33626b3714318cf63ee Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Fri, 29 Apr 2016 11:53:15 +0200 Subject: [PATCH] fix http2 error handling --- example/main.go | 76 ++++++++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/example/main.go b/example/main.go index 368b51844..bac20a162 100644 --- a/example/main.go +++ b/example/main.go @@ -97,46 +97,52 @@ func handleStream(session *quic.Session, headerStream utils.Stream) { go func() { for { - h2frame, err := h2framer.ReadFrame() - if err != nil { - fmt.Printf("invalid http2 frame: %s\n", err.Error()) - continue + if err := handleRequest(session, headerStream, hpackDecoder, h2framer); err != nil { + fmt.Printf("error handling h2 request: %s\n", err.Error()) + return } - h2headersFrame := h2frame.(*http2.HeadersFrame) - if !h2headersFrame.HeadersEnded() { - fmt.Printf("http2 header continuation not implemented") - continue - } - headers, err := hpackDecoder.DecodeFull(h2headersFrame.HeaderBlockFragment()) - if err != nil { - fmt.Printf("invalid http2 headers encoding: %s\n", err.Error()) - continue - } - - req, err := requestFromHeaders(headers) - if err != nil { - fmt.Printf("invalid http2 frame: %s\n", err.Error()) - continue - } - fmt.Printf("Request: %#v\n", req) - - responseWriter := &responseWriter{ - header: http.Header{}, - headerStream: headerStream, - dataStreamID: protocol.StreamID(h2headersFrame.StreamID), - session: session, - } - - go func() { - http.DefaultServeMux.ServeHTTP(responseWriter, req) - if responseWriter.dataStream != nil { - responseWriter.dataStream.Close() - } - }() } }() } +func handleRequest(session *quic.Session, headerStream utils.Stream, hpackDecoder *hpack.Decoder, h2framer *http2.Framer) error { + h2frame, err := h2framer.ReadFrame() + if err != nil { + return err + } + h2headersFrame := h2frame.(*http2.HeadersFrame) + if !h2headersFrame.HeadersEnded() { + return errors.New("http2 header continuation not implemented") + } + headers, err := hpackDecoder.DecodeFull(h2headersFrame.HeaderBlockFragment()) + if err != nil { + fmt.Printf("invalid http2 headers encoding: %s\n", err.Error()) + return err + } + + req, err := requestFromHeaders(headers) + if err != nil { + return err + } + fmt.Printf("Request: %#v\n", req) + + responseWriter := &responseWriter{ + header: http.Header{}, + headerStream: headerStream, + dataStreamID: protocol.StreamID(h2headersFrame.StreamID), + session: session, + } + + go func() { + http.DefaultServeMux.ServeHTTP(responseWriter, req) + if responseWriter.dataStream != nil { + responseWriter.dataStream.Close() + } + }() + + return nil +} + func requestFromHeaders(headers []hpack.HeaderField) (*http.Request, error) { var path, authority, method string httpHeaders := http.Header{}