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