Commit ac213ab8 authored by Brad Fitzpatrick's avatar Brad Fitzpatrick

http: respect Handlers setting Connection: close in their response

Fixes #2011

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/4667043
parent 8475832f
...@@ -373,11 +373,8 @@ func TestIdentityResponse(t *testing.T) { ...@@ -373,11 +373,8 @@ func TestIdentityResponse(t *testing.T) {
} }
} }
// TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive. func testTcpConnectionCloses(t *testing.T, req string, h Handler) {
func TestServeHTTP10Close(t *testing.T) { s := httptest.NewServer(h)
s := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
ServeFile(w, r, "testdata/file")
}))
defer s.Close() defer s.Close()
conn, err := net.Dial("tcp", s.Listener.Addr().String()) conn, err := net.Dial("tcp", s.Listener.Addr().String())
...@@ -386,7 +383,7 @@ func TestServeHTTP10Close(t *testing.T) { ...@@ -386,7 +383,7 @@ func TestServeHTTP10Close(t *testing.T) {
} }
defer conn.Close() defer conn.Close()
_, err = fmt.Fprint(conn, "GET / HTTP/1.0\r\n\r\n") _, err = fmt.Fprint(conn, req)
if err != nil { if err != nil {
t.Fatal("print error:", err) t.Fatal("print error:", err)
} }
...@@ -414,6 +411,27 @@ func TestServeHTTP10Close(t *testing.T) { ...@@ -414,6 +411,27 @@ func TestServeHTTP10Close(t *testing.T) {
success <- true success <- true
} }
// TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive.
func TestServeHTTP10Close(t *testing.T) {
testTcpConnectionCloses(t, "GET / HTTP/1.0\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
ServeFile(w, r, "testdata/file")
}))
}
// TestHandlersCanSetConnectionClose verifies that handlers can force a connection to close,
// even for HTTP/1.1 requests.
func TestHandlersCanSetConnectionClose11(t *testing.T) {
testTcpConnectionCloses(t, "GET / HTTP/1.1\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
w.Header().Set("Connection", "close")
}))
}
func TestHandlersCanSetConnectionClose10(t *testing.T) {
testTcpConnectionCloses(t, "GET / HTTP/1.0\r\nConnection: keep-alive\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
w.Header().Set("Connection", "close")
}))
}
func TestSetsRemoteAddr(t *testing.T) { func TestSetsRemoteAddr(t *testing.T) {
ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) { ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {
fmt.Fprintf(w, "%s", r.RemoteAddr) fmt.Fprintf(w, "%s", r.RemoteAddr)
......
...@@ -315,6 +315,10 @@ func (w *response) WriteHeader(code int) { ...@@ -315,6 +315,10 @@ func (w *response) WriteHeader(code int) {
w.closeAfterReply = true w.closeAfterReply = true
} }
if w.header.Get("Connection") == "close" {
w.closeAfterReply = true
}
// Cannot use Content-Length with non-identity Transfer-Encoding. // Cannot use Content-Length with non-identity Transfer-Encoding.
if w.chunking { if w.chunking {
w.header.Del("Content-Length") w.header.Del("Content-Length")
......
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