mirror of
https://github.com/golang/go
synced 2024-11-12 04:50:21 -07:00
net/http: don't send chunked encoding on 204 responses
RFC 2616: "The 204 response MUST NOT include a message-body, and thus is always terminated by the first empty line after the header fields." Previously we'd trigger chunked encoding by default on responses, and then when finishing the request we'd write the chunk trailers, which counted as a message-body. Fixes #4454 R=golang-dev CC=golang-dev https://golang.org/cl/6782139
This commit is contained in:
parent
85e451e2fe
commit
9c2f410206
@ -369,6 +369,8 @@ func (w *response) WriteHeader(code int) {
|
||||
|
||||
if w.req.Method == "HEAD" || code == StatusNotModified {
|
||||
// do nothing
|
||||
} else if code == StatusNoContent {
|
||||
w.header.Del("Transfer-Encoding")
|
||||
} else if hasCL {
|
||||
w.contentLength = contentLength
|
||||
w.header.Del("Transfer-Encoding")
|
||||
|
@ -857,6 +857,30 @@ func TestIssue3595(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// From http://golang.org/issue/4454 ,
|
||||
// "client fails to handle requests with no body and chunked encoding"
|
||||
func TestChunkedNoContent(t *testing.T) {
|
||||
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
|
||||
w.WriteHeader(StatusNoContent)
|
||||
}))
|
||||
defer ts.Close()
|
||||
|
||||
for _, closeBody := range []bool{true, false} {
|
||||
c := &Client{Transport: &Transport{}}
|
||||
const n = 4
|
||||
for i := 1; i <= n; i++ {
|
||||
res, err := c.Get(ts.URL)
|
||||
if err != nil {
|
||||
t.Errorf("closingBody=%v, req %d/%d: %v", closeBody, i, n, err)
|
||||
} else {
|
||||
if closeBody {
|
||||
res.Body.Close()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestTransportConcurrency(t *testing.T) {
|
||||
const maxProcs = 16
|
||||
const numReqs = 500
|
||||
|
Loading…
Reference in New Issue
Block a user