mirror of
https://github.com/golang/go.git
synced 2025-05-20 14:53:23 +00:00
net/http: enable Transfer-Encoding: identity without Content-Length for HTTP 1.1.
Use case is SSE recommended configuration: http://www.w3.org/TR/eventsource/#notes Removes a TODO. LGTM=bradfitz R=golang-codereviews, bradfitz, tommi.virtanen CC=golang-codereviews https://golang.org/cl/100000044
This commit is contained in:
parent
705c1f5cd4
commit
2da734189d
@ -778,6 +778,35 @@ func TestChunkedResponseHeaders(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIdentityResponseHeaders(t *testing.T) {
|
||||||
|
defer afterTest(t)
|
||||||
|
log.SetOutput(ioutil.Discard) // is noisy otherwise
|
||||||
|
defer log.SetOutput(os.Stderr)
|
||||||
|
|
||||||
|
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
|
||||||
|
w.Header().Set("Transfer-Encoding", "identity")
|
||||||
|
w.(Flusher).Flush()
|
||||||
|
fmt.Fprintf(w, "I am an identity response.")
|
||||||
|
}))
|
||||||
|
defer ts.Close()
|
||||||
|
|
||||||
|
res, err := Get(ts.URL)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("Get error: %v", err)
|
||||||
|
}
|
||||||
|
defer res.Body.Close()
|
||||||
|
|
||||||
|
if g, e := res.TransferEncoding, []string(nil); !reflect.DeepEqual(g, e) {
|
||||||
|
t.Errorf("expected TransferEncoding of %v; got %v", e, g)
|
||||||
|
}
|
||||||
|
if _, haveCL := res.Header["Content-Length"]; haveCL {
|
||||||
|
t.Errorf("Unexpected Content-Length")
|
||||||
|
}
|
||||||
|
if !res.Close {
|
||||||
|
t.Errorf("expected Connection: close; got %v", res.Close)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Test304Responses verifies that 304s don't declare that they're
|
// Test304Responses verifies that 304s don't declare that they're
|
||||||
// chunking in their response headers and aren't allowed to produce
|
// chunking in their response headers and aren't allowed to produce
|
||||||
// output.
|
// output.
|
||||||
|
@ -839,13 +839,20 @@ func (cw *chunkWriter) writeHeader(p []byte) {
|
|||||||
} else if hasCL {
|
} else if hasCL {
|
||||||
delHeader("Transfer-Encoding")
|
delHeader("Transfer-Encoding")
|
||||||
} else if w.req.ProtoAtLeast(1, 1) {
|
} else if w.req.ProtoAtLeast(1, 1) {
|
||||||
// HTTP/1.1 or greater: use chunked transfer encoding
|
// HTTP/1.1 or greater: Transfer-Encoding has been set to identity, and no
|
||||||
// to avoid closing the connection at EOF.
|
// content-length has been provided. The connection must be closed after the
|
||||||
// TODO: this blows away any custom or stacked Transfer-Encoding they
|
// reply is written, and no chunking is to be done. This is the setup
|
||||||
// might have set. Deal with that as need arises once we have a valid
|
// recommended in the Server-Sent Events candidate recommendation 11,
|
||||||
// use case.
|
// section 8.
|
||||||
cw.chunking = true
|
if hasTE && te == "identity" {
|
||||||
setHeader.transferEncoding = "chunked"
|
cw.chunking = false
|
||||||
|
w.closeAfterReply = true
|
||||||
|
} else {
|
||||||
|
// HTTP/1.1 or greater: use chunked transfer encoding
|
||||||
|
// to avoid closing the connection at EOF.
|
||||||
|
cw.chunking = true
|
||||||
|
setHeader.transferEncoding = "chunked"
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// HTTP version < 1.1: cannot do chunked transfer
|
// HTTP version < 1.1: cannot do chunked transfer
|
||||||
// encoding and we don't know the Content-Length so
|
// encoding and we don't know the Content-Length so
|
||||||
|
Loading…
x
Reference in New Issue
Block a user