http2: disable Content-Length when nilled
Change-Id: Iefef8dc1004a8e889d0e9f7243f594ae7b727a07
Reviewed-on: https://go-review.googlesource.com/c/net/+/471535
Reviewed-by: Damien Neil <dneil@google.com>
Auto-Submit: Damien Neil <dneil@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Heschi Kreinick <heschi@google.com>
Run-TryBot: Damien Neil <dneil@google.com>
diff --git a/http2/server.go b/http2/server.go
index 396d53b..033b6e6 100644
--- a/http2/server.go
+++ b/http2/server.go
@@ -2569,7 +2569,8 @@
clen = ""
}
}
- if clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
+ _, hasContentLength := rws.snapHeader["Content-Length"]
+ if !hasContentLength && clen == "" && rws.handlerDone && bodyAllowedForStatus(rws.status) && (len(p) > 0 || !isHeadResp) {
clen = strconv.Itoa(len(p))
}
_, hasContentType := rws.snapHeader["Content-Type"]
diff --git a/http2/server_test.go b/http2/server_test.go
index 40ab750..cd73291 100644
--- a/http2/server_test.go
+++ b/http2/server_test.go
@@ -3555,6 +3555,30 @@
}
}
+func TestServerContentLengthCanBeDisabled(t *testing.T) {
+ st := newServerTester(t, func(w http.ResponseWriter, r *http.Request) {
+ w.Header()["Content-Length"] = nil
+ fmt.Fprintf(w, "OK")
+ })
+ defer st.Close()
+ st.greet()
+ st.writeHeaders(HeadersFrameParam{
+ StreamID: 1,
+ BlockFragment: st.encodeHeader(),
+ EndStream: true,
+ EndHeaders: true,
+ })
+ h := st.wantHeaders()
+ headers := st.decodeHeader(h.HeaderBlockFragment())
+ want := [][2]string{
+ {":status", "200"},
+ {"content-type", "text/plain; charset=utf-8"},
+ }
+ if !reflect.DeepEqual(headers, want) {
+ t.Errorf("Headers mismatch.\n got: %q\nwant: %q\n", headers, want)
+ }
+}
+
func disableGoroutineTracking() (restore func()) {
old := DebugGoroutines
DebugGoroutines = false