Commit 4ded58bd authored by Harshavardhana's avatar Harshavardhana Committed by Brad Fitzpatrick

net/http/httputil: Keep response headers when response ContentLength is 0.

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/18624Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 58ec5839
...@@ -264,19 +264,20 @@ func DumpRequest(req *http.Request, body bool) (dump []byte, err error) { ...@@ -264,19 +264,20 @@ func DumpRequest(req *http.Request, body bool) (dump []byte, err error) {
return return
} }
// errNoBody is a sentinel error value used by failureToReadBody so we can detect // errNoBody is a sentinel error value used by failureToReadBody so we
// that the lack of body was intentional. // can detect that the lack of body was intentional.
var errNoBody = errors.New("sentinel error value") var errNoBody = errors.New("sentinel error value")
// failureToReadBody is a io.ReadCloser that just returns errNoBody on // failureToReadBody is a io.ReadCloser that just returns errNoBody on
// Read. It's swapped in when we don't actually want to consume the // Read. It's swapped in when we don't actually want to consume
// body, but need a non-nil one, and want to distinguish the error // the body, but need a non-nil one, and want to distinguish the
// from reading the dummy body. // error from reading the dummy body.
type failureToReadBody struct{} type failureToReadBody struct{}
func (failureToReadBody) Read([]byte) (int, error) { return 0, errNoBody } func (failureToReadBody) Read([]byte) (int, error) { return 0, errNoBody }
func (failureToReadBody) Close() error { return nil } func (failureToReadBody) Close() error { return nil }
// emptyBody is an instance of empty reader.
var emptyBody = ioutil.NopCloser(strings.NewReader("")) var emptyBody = ioutil.NopCloser(strings.NewReader(""))
// DumpResponse is like DumpRequest but dumps a response. // DumpResponse is like DumpRequest but dumps a response.
...@@ -286,7 +287,13 @@ func DumpResponse(resp *http.Response, body bool) (dump []byte, err error) { ...@@ -286,7 +287,13 @@ func DumpResponse(resp *http.Response, body bool) (dump []byte, err error) {
savecl := resp.ContentLength savecl := resp.ContentLength
if !body { 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 { } else if resp.Body == nil {
resp.Body = emptyBody resp.Body = emptyBody
} else { } else {
......
...@@ -288,6 +288,27 @@ Transfer-Encoding: chunked ...@@ -288,6 +288,27 @@ Transfer-Encoding: chunked
foo foo
0`, 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) { func TestDumpResponse(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment