diff --git a/h2quic/server.go b/h2quic/server.go index 857211d2..0f3ad6dc 100644 --- a/h2quic/server.go +++ b/h2quic/server.go @@ -154,10 +154,18 @@ func (s *Server) handleRequest(session streamCreator, headerStream quic.Stream, if err != nil { return qerr.Error(qerr.HeadersStreamDataDecompressFailure, "cannot read frame") } - h2headersFrame, ok := h2frame.(*http2.HeadersFrame) - if !ok { + var h2headersFrame *http2.HeadersFrame + switch f := h2frame.(type) { + case *http2.PriorityFrame: + // ignore PRIORITY frames + s.logger.Debugf("Ignoring H2 PRIORITY frame: %#v", f) + return nil + case *http2.HeadersFrame: + h2headersFrame = f + default: return qerr.Error(qerr.InvalidHeadersStreamData, "expected a header frame") } + if !h2headersFrame.HeadersEnded() { return errors.New("http2 header continuation not implemented") } diff --git a/h2quic/server_test.go b/h2quic/server_test.go index 5217a725..28597594 100644 --- a/h2quic/server_test.go +++ b/h2quic/server_test.go @@ -259,6 +259,24 @@ var _ = Describe("H2 server", func() { Expect(dataStream.reset).To(BeFalse()) }) + It("ignores PRIORITY frames", func() { + handlerCalled := make(chan struct{}) + s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + close(handlerCalled) + }) + buf := &bytes.Buffer{} + framer := http2.NewFramer(buf, nil) + err := framer.WritePriority(10, http2.PriorityParam{Weight: 42}) + Expect(err).ToNot(HaveOccurred()) + Expect(buf.Bytes()).ToNot(BeEmpty()) + headerStream.dataToRead.Write(buf.Bytes()) + err = s.handleRequest(session, headerStream, &sync.Mutex{}, hpackDecoder, h2framer) + Expect(err).ToNot(HaveOccurred()) + Consistently(handlerCalled).ShouldNot(BeClosed()) + Expect(dataStream.reset).To(BeFalse()) + Expect(dataStream.closed).To(BeFalse()) + }) + It("errors when non-header frames are received", func() { headerStream.dataToRead.Write([]byte{ 0x0, 0x0, 0x06, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5,