From a4dcf5efd756227450ddcedfdd6834676f42ceb8 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Tue, 16 Aug 2016 12:28:47 +0200 Subject: [PATCH] send 200 status for requests with empty http.Handlers fixes #286 --- h2quic/response_writer.go | 6 ++++++ h2quic/response_writer_test.go | 11 +++++++++++ h2quic/server.go | 1 + h2quic/server_test.go | 14 ++++++++++++++ 4 files changed, 32 insertions(+) diff --git a/h2quic/response_writer.go b/h2quic/response_writer.go index a730e34c..a1e608a0 100644 --- a/h2quic/response_writer.go +++ b/h2quic/response_writer.go @@ -68,3 +68,9 @@ func (w *responseWriter) Write(p []byte) (int, error) { } return w.dataStream.Write(p) } + +func (w *responseWriter) finish() { + if !w.headerWritten { + w.WriteHeader(200) + } +} diff --git a/h2quic/response_writer_test.go b/h2quic/response_writer_test.go index 0448c015..e93332d2 100644 --- a/h2quic/response_writer_test.go +++ b/h2quic/response_writer_test.go @@ -78,4 +78,15 @@ var _ = Describe("Response Writer", func() { 0x66, 0x6f, 0x6f, 0x62, 0x61, 0x72, })) }) + + It("writes a 200 in finish if nothing was called", func() { + w.finish() + Expect(headerStream.Bytes()).To(Equal([]byte{0x0, 0x0, 0x1, 0x1, 0x4, 0x0, 0x0, 0x0, 0x5, 0x88})) // 0x88 is 200 + }) + + It("doesn't do anything in finish if data was written before", func() { + w.WriteHeader(200) + w.finish() + Expect(headerStream.Bytes()).To(Equal([]byte{0x0, 0x0, 0x1, 0x1, 0x4, 0x0, 0x0, 0x0, 0x5, 0x88})) // 0x88 is 200 + }) }) diff --git a/h2quic/server.go b/h2quic/server.go index b7704614..07757dbd 100644 --- a/h2quic/server.go +++ b/h2quic/server.go @@ -167,6 +167,7 @@ func (s *Server) handleRequest(session streamCreator, headerStream utils.Stream, handler = http.DefaultServeMux } handler.ServeHTTP(responseWriter, req) + responseWriter.finish() if responseWriter.dataStream != nil { responseWriter.dataStream.Close() } diff --git a/h2quic/server_test.go b/h2quic/server_test.go index 00465690..55e3695c 100644 --- a/h2quic/server_test.go +++ b/h2quic/server_test.go @@ -84,6 +84,20 @@ var _ = Describe("H2 server", func() { Expect(dataStream.remoteClosed).To(BeTrue()) }) + It("returns 200 with an empty handler", func() { + s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}) + headerStream.Write([]byte{ + 0x0, 0x0, 0x11, 0x1, 0x5, 0x0, 0x0, 0x0, 0x5, + // Taken from https://http2.github.io/http2-spec/compression.html#request.examples.with.huffman.coding + 0x82, 0x86, 0x84, 0x41, 0x8c, 0xf1, 0xe3, 0xc2, 0xe5, 0xf2, 0x3a, 0x6b, 0xa0, 0xab, 0x90, 0xf4, 0xff, + }) + err := s.handleRequest(session, headerStream, &sync.Mutex{}, hpackDecoder, h2framer) + Expect(err).NotTo(HaveOccurred()) + Eventually(func() []byte { + return headerStream.Buffer.Bytes() + }).Should(Equal([]byte{0x0, 0x0, 0x1, 0x1, 0x4, 0x0, 0x0, 0x0, 0x5, 0x88})) // 0x88 is 200 + }) + It("does not close the dataStream when end of stream is not set", func() { var handlerCalled bool s.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {