]> Cypherpunks repositories - gostls13.git/commitdiff
net/http/httputil: Keep response headers when response ContentLength is 0.
authorHarshavardhana <hrshvardhana@gmail.com>
Wed, 13 Jan 2016 23:52:54 +0000 (15:52 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 23 Feb 2016 15:16:39 +0000 (15:16 +0000)
Current code does not print any response headers from httputil.DumpResponse().

   PUT /miniocloud/new-file HTTP/1.1
   Host: s3.amazonaws.com
   User-Agent: Go-http-client/1.1
   Content-Length: 11
   Accept-Encoding: gzip

   HTTP/1.1 200 OK

With this fix we get an appropriate output for httputil.DumpResponse().

   PUT /miniocloud/new-file HTTP/1.1
   Host: s3.amazonaws.com
   User-Agent: Go-http-client/1.1
   Content-Length: 11
   Accept-Encoding: gzip

   HTTP/1.1 200 OK
   Content-Length: 0
   Date: Thu, 14 Jan 2016 03:04:42 GMT
   Etag: "3e25960a79dbc69b674cd4ec67a72c62"
   Server: AmazonS3
   X-Amz-Id-2: qnXyH6sknlovV0Myy3emFAXTNtI/sQIcu1ZXNq/6wd17K32tQ7WNGB1qb3nzCpW2DhfeZ/MbWfw=
   X-Amz-Request-Id: 8422EACB0CC492BD

Fixes #13942

Change-Id: Ida063cc3524a96170d8a837893f7c9f49b6cf98e
Reviewed-on: https://go-review.googlesource.com/18624
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/httputil/dump.go
src/net/http/httputil/dump_test.go

index e22cc66dbfccfee8e211832226e2e009e995eb79..245eed0b21b7a10e85a75e2fa1601d685df6a672 100644 (file)
@@ -264,19 +264,20 @@ func DumpRequest(req *http.Request, body bool) (dump []byte, err error) {
        return
 }
 
-// errNoBody is a sentinel error value used by failureToReadBody so we can detect
-// that the lack of body was intentional.
+// errNoBody is a sentinel error value used by failureToReadBody so we
+// can detect that the lack of body was intentional.
 var errNoBody = errors.New("sentinel error value")
 
 // failureToReadBody is a io.ReadCloser that just returns errNoBody on
-// Read.  It's swapped in when we don't actually want to consume the
-// body, but need a non-nil one, and want to distinguish the error
-// from reading the dummy body.
+// Read.  It's swapped in when we don't actually want to consume
+// the body, but need a non-nil one, and want to distinguish the
+// error from reading the dummy body.
 type failureToReadBody struct{}
 
 func (failureToReadBody) Read([]byte) (int, error) { return 0, errNoBody }
 func (failureToReadBody) Close() error             { return nil }
 
+// emptyBody is an instance of empty reader.
 var emptyBody = ioutil.NopCloser(strings.NewReader(""))
 
 // DumpResponse is like DumpRequest but dumps a response.
@@ -286,7 +287,13 @@ func DumpResponse(resp *http.Response, body bool) (dump []byte, err error) {
        savecl := resp.ContentLength
 
        if !body {
-               resp.Body = failureToReadBody{}
+               // For content length of zero. Make sure the body is an empty
+               // reader, instead of returning error through failureToReadBody{}.
+               if resp.ContentLength == 0 {
+                       resp.Body = emptyBody
+               } else {
+                       resp.Body = failureToReadBody{}
+               }
        } else if resp.Body == nil {
                resp.Body = emptyBody
        } else {
index 46bf521723afbfc88098c17a913edc8426819057..fc884347a6e945d592c04577332123b7539499a3 100644 (file)
@@ -288,6 +288,27 @@ Transfer-Encoding: chunked
 foo
 0`,
        },
+       {
+               res: &http.Response{
+                       Status:        "200 OK",
+                       StatusCode:    200,
+                       Proto:         "HTTP/1.1",
+                       ProtoMajor:    1,
+                       ProtoMinor:    1,
+                       ContentLength: 0,
+                       Header: http.Header{
+                               // To verify if headers are not filtered out.
+                               "Foo1": []string{"Bar1"},
+                               "Foo2": []string{"Bar2"},
+                       },
+                       Body: nil,
+               },
+               body: false, // to verify we see 0, not empty.
+               want: `HTTP/1.1 200 OK
+Foo1: Bar1
+Foo2: Bar2
+Content-Length: 0`,
+       },
 }
 
 func TestDumpResponse(t *testing.T) {