From d31f4ef7d50566b43cfdfb3472d6a2a3299393b6 Mon Sep 17 00:00:00 2001 From: newacorn Date: Sat, 31 Aug 2024 20:41:54 +0800 Subject: [PATCH] When `StreamRequestBody` is set to `true`, we cannot safely release `br`. (#1844) For example, when using chunked encoding, it's possible that `br` has only read the request headers. --- server.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/server.go b/server.go index 7f48531..53fdebc 100644 --- a/server.go +++ b/server.go @@ -2286,8 +2286,9 @@ func (s *Server) serveConn(c net.Conn) (err error) { err = ctx.Request.readLimitBody(br, maxRequestBodySize, s.GetOnly, !s.DisablePreParseMultipartForm) } } - - if (s.ReduceMemoryUsage && br.Buffered() == 0) || err != nil { + // When StreamRequestBody is set to true, we cannot safely release br. + // For example, when using chunked encoding, it's possible that br has only read the request headers. + if (!s.StreamRequestBody && s.ReduceMemoryUsage && br.Buffered() == 0) || err != nil { releaseReader(s, br) br = nil } @@ -2358,7 +2359,7 @@ func (s *Server) serveConn(c net.Conn) (err error) { } else { err = ctx.Request.ContinueReadBody(br, maxRequestBodySize, !s.DisablePreParseMultipartForm) } - if (s.ReduceMemoryUsage && br.Buffered() == 0) || err != nil { + if (!s.StreamRequestBody && s.ReduceMemoryUsage && br.Buffered() == 0) || err != nil { releaseReader(s, br) br = nil }