diff options
| author | Jorropo <jorropo.pgm@gmail.com> | 2023-05-16 09:19:58 +0200 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-05-24 22:39:33 +0000 |
| commit | 543e601c118c4bffbeee65e7e9baf79a17ffdfaf (patch) | |
| tree | 9fbc403989819f847522ab335cff4af12ee5ab51 /src/net | |
| parent | 79a8997ac5592f11388d9f26ab3fff65ec876dbd (diff) | |
| download | go-543e601c118c4bffbeee65e7e9baf79a17ffdfaf.tar.xz | |
net/http: second do not force the Content-Length header if nilled
This is a second round of CL 469095 which has been fixed after
the issue discovered in the revert CL 495017.
The issue was a missing res.Body.Close() in the newly added test.
Change-Id: Ifd9d8458022e59f4486397443a2862d06383e990
Reviewed-on: https://go-review.googlesource.com/c/go/+/495115
Reviewed-by: Damien Neil <dneil@google.com>
Run-TryBot: Jorropo <jorropo.pgm@gmail.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Auto-Submit: Dmitri Shuralyov <dmitshur@golang.org>
Diffstat (limited to 'src/net')
| -rw-r--r-- | src/net/http/serve_test.go | 40 | ||||
| -rw-r--r-- | src/net/http/server.go | 2 |
2 files changed, 41 insertions, 1 deletions
diff --git a/src/net/http/serve_test.go b/src/net/http/serve_test.go index 33a7b54d5d..b712f92cb7 100644 --- a/src/net/http/serve_test.go +++ b/src/net/http/serve_test.go @@ -6825,3 +6825,43 @@ func testHeadBody(t *testing.T, mode testMode, chunked bool, method string) { } } } + +// TestDisableContentLength verifies that the Content-Length is set by default +// or disabled when the header is set to nil. +func TestDisableContentLength(t *testing.T) { run(t, testDisableContentLength) } +func testDisableContentLength(t *testing.T, mode testMode) { + if mode == http2Mode { + t.Skip("skipping until h2_bundle.go is updated; see https://go-review.googlesource.com/c/net/+/471535") + } + + noCL := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) { + w.Header()["Content-Length"] = nil // disable the default Content-Length response + fmt.Fprintf(w, "OK") + })) + + res, err := noCL.c.Get(noCL.ts.URL) + if err != nil { + t.Fatal(err) + } + if got, haveCL := res.Header["Content-Length"]; haveCL { + t.Errorf("Unexpected Content-Length: %q", got) + } + if err := res.Body.Close(); err != nil { + t.Fatal(err) + } + + withCL := newClientServerTest(t, mode, HandlerFunc(func(w ResponseWriter, r *Request) { + fmt.Fprintf(w, "OK") + })) + + res, err = withCL.c.Get(withCL.ts.URL) + if err != nil { + t.Fatal(err) + } + if got := res.Header.Get("Content-Length"); got != "2" { + t.Errorf("Content-Length: %q; want 2", got) + } + if err := res.Body.Close(); err != nil { + t.Fatal(err) + } +} diff --git a/src/net/http/server.go b/src/net/http/server.go index efdc031740..680c5f68f4 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -1320,7 +1320,7 @@ func (cw *chunkWriter) writeHeader(p []byte) { // send a Content-Length header. // Further, we don't send an automatic Content-Length if they // set a Transfer-Encoding, because they're generally incompatible. - if w.handlerDone.Load() && !trailers && !hasTE && bodyAllowedForStatus(w.status) && header.get("Content-Length") == "" && (!isHEAD || len(p) > 0) { + if w.handlerDone.Load() && !trailers && !hasTE && bodyAllowedForStatus(w.status) && !header.has("Content-Length") && (!isHEAD || len(p) > 0) { w.contentLength = int64(len(p)) setHeader.contentLength = strconv.AppendInt(cw.res.clenBuf[:0], int64(len(p)), 10) } |
