]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.3] net/http: fix double Content-Length in response
authorRuss Cox <rsc@golang.org>
Wed, 11 Jun 2014 21:02:43 +0000 (17:02 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 11 Jun 2014 21:02:43 +0000 (17:02 -0400)
««« CL 105040043 / ef8878dbed3b
net/http: fix double Content-Length in response

Fixes #8180

LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/105040043
»»»

TBR=bradfitz
R=golang-codereviews
CC=bradfitz, golang-codereviews, iant
https://golang.org/cl/102300046

src/pkg/net/http/response.go
src/pkg/net/http/responsewrite_test.go
src/pkg/net/http/transfer.go

index 59491912704bbc24d496362ccb519623ae98256d..5d2c39080e4b9176b10c69e8f50a27431107e494 100644 (file)
@@ -266,7 +266,10 @@ func (r *Response) Write(w io.Writer) error {
                return err
        }
 
-       if r1.ContentLength == 0 && !chunked(r1.TransferEncoding) {
+       // contentLengthAlreadySent may have been already sent for
+       // POST/PUT requests, even if zero length. See Issue 8180.
+       contentLengthAlreadySent := tw.shouldSendContentLength()
+       if r1.ContentLength == 0 && !chunked(r1.TransferEncoding) && !contentLengthAlreadySent {
                if _, err := io.WriteString(w, "Content-Length: 0\r\n"); err != nil {
                        return err
                }
index 381199202aded7aa393895f4cd7c689442d187fc..585b13b8504191f2c4db333f39712e54cfca9f53 100644 (file)
@@ -191,6 +191,22 @@ func TestResponseWrite(t *testing.T) {
                                "Foo: Bar Baz\r\n" +
                                "\r\n",
                },
+
+               // Want a single Content-Length header. Fixing issue 8180 where
+               // there were two.
+               {
+                       Response{
+                               StatusCode:       StatusOK,
+                               ProtoMajor:       1,
+                               ProtoMinor:       1,
+                               Request:          &Request{Method: "POST"},
+                               Header:           Header{},
+                               ContentLength:    0,
+                               TransferEncoding: nil,
+                               Body:             nil,
+                       },
+                       "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n",
+               },
        }
 
        for i := range respWriteTests {
index 0f2b7854f5511cc4e9c7d419b261e798be8e5b62..7f63686528aae75edca37ffbf3cdde4745e63b6c 100644 (file)
@@ -155,7 +155,9 @@ func (t *transferWriter) WriteHeader(w io.Writer) error {
        // function of the sanitized field triple (Body, ContentLength,
        // TransferEncoding)
        if t.shouldSendContentLength() {
-               io.WriteString(w, "Content-Length: ")
+               if _, err := io.WriteString(w, "Content-Length: "); err != nil {
+                       return err
+               }
                if _, err := io.WriteString(w, strconv.FormatInt(t.ContentLength, 10)+"\r\n"); err != nil {
                        return err
                }