From d0897fa0b347ce9214dede60e16636e364b6e535 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 22 May 2018 13:46:44 +0800 Subject: [PATCH] ignore HTTP2 PRIORITY frames in the server --- h2quic/server.go | 12 ++++++++++-- h2quic/server_test.go | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/h2quic/server.go b/h2quic/server.go index 857211d2e..0f3ad6dc2 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 5217a7253..28597594e 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,