mirror of https://github.com/golang/go.git
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>
This commit is contained in:
parent
58ec5839cd
commit
4ded58bd5a
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue