diff options
| author | Harshavardhana <hrshvardhana@gmail.com> | 2016-01-13 15:52:54 -0800 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2016-02-23 15:16:39 +0000 |
| commit | 4ded58bd5a00f9f751bfc02cc1b7dd5970632a02 (patch) | |
| tree | 1a50a05a5f41295ecf9e4cddfffaf8ed3a3aba7f /src/net/http | |
| parent | 58ec5839cd9c210dc7ad727a6b1f743ea6233ddf (diff) | |
| download | go-4ded58bd5a00f9f751bfc02cc1b7dd5970632a02.tar.xz | |
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/18624
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/net/http')
| -rw-r--r-- | src/net/http/httputil/dump.go | 19 | ||||
| -rw-r--r-- | src/net/http/httputil/dump_test.go | 21 |
2 files changed, 34 insertions, 6 deletions
diff --git a/src/net/http/httputil/dump.go b/src/net/http/httputil/dump.go index e22cc66dbf..245eed0b21 100644 --- a/src/net/http/httputil/dump.go +++ b/src/net/http/httputil/dump.go @@ -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 { diff --git a/src/net/http/httputil/dump_test.go b/src/net/http/httputil/dump_test.go index 46bf521723..fc884347a6 100644 --- a/src/net/http/httputil/dump_test.go +++ b/src/net/http/httputil/dump_test.go @@ -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) { |
