From f97c9bf88cd10ea6738a7f7e69c7da56f5f820b5 Mon Sep 17 00:00:00 2001 From: WeidiDeng Date: Thu, 13 Jul 2023 00:32:33 +0800 Subject: [PATCH] http3: don't write response headers if the handler panicked (#3950) --- http3/server.go | 7 +++---- http3/server_test.go | 6 ++---- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/http3/server.go b/http3/server.go index f2027429d..5c39ec042 100644 --- a/http3/server.go +++ b/http3/server.go @@ -594,7 +594,6 @@ func (s *Server) handleRequest(conn quic.Connection, str quic.Stream, decoder *q ctx = context.WithValue(ctx, http.LocalAddrContextKey, conn.LocalAddr()) req = req.WithContext(ctx) r := newResponseWriter(str, conn, s.logger) - defer r.Flush() handler := s.Handler if handler == nil { handler = http.DefaultServeMux @@ -622,10 +621,10 @@ func (s *Server) handleRequest(conn quic.Connection, str quic.Stream, decoder *q return requestError{err: errHijacked} } - if panicked { - r.WriteHeader(http.StatusInternalServerError) - } else { + // only write response when there is no panic + if !panicked { r.WriteHeader(http.StatusOK) + r.Flush() } // If the EOF was read by the handler, CancelRead() is a no-op. str.CancelRead(quic.StreamErrorCode(ErrCodeNoError)) diff --git a/http3/server_test.go b/http3/server_test.go index 9a362c6ce..f180ef0d5 100644 --- a/http3/server_test.go +++ b/http3/server_test.go @@ -193,8 +193,7 @@ var _ = Describe("Server", func() { serr := s.handleRequest(conn, str, qpackDecoder, nil) Expect(serr.err).ToNot(HaveOccurred()) - hfs := decodeHeader(responseBuf) - Expect(hfs).To(HaveKeyWithValue(":status", []string{"500"})) + Expect(responseBuf.Bytes()).To(HaveLen(0)) }) It("handles a panicking handler", func() { @@ -210,8 +209,7 @@ var _ = Describe("Server", func() { serr := s.handleRequest(conn, str, qpackDecoder, nil) Expect(serr.err).ToNot(HaveOccurred()) - hfs := decodeHeader(responseBuf) - Expect(hfs).To(HaveKeyWithValue(":status", []string{"500"})) + Expect(responseBuf.Bytes()).To(HaveLen(0)) }) Context("hijacking bidirectional streams", func() {