Commit 3d03ec88 authored by Russ Cox's avatar Russ Cox

undo CL 6112054 / 2eec2501961c

Now that we've fixed the Expect: test, this CL should be okay.

««« original CL description
net/http: revert 97d027b3aa68

Revert the following change set:

        changeset:   13018:97d027b3aa68
        user:        Gustavo Niemeyer <gustavo@niemeyer.net>
        date:        Mon Apr 23 22:00:16 2012 -0300
        summary:     net/http: allow clients to disable keep-alive

This broke a test on Windows 64 and somebody else
will have to check.

R=golang-dev, r
CC=golang-dev
https://golang.org/cl/6112054
»»»

Fixes #3540.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6228046
parent 77f00e5e
...@@ -732,12 +732,24 @@ func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, e ...@@ -732,12 +732,24 @@ func (r *Request) FormFile(key string) (multipart.File, *multipart.FileHeader, e
} }
func (r *Request) expectsContinue() bool { func (r *Request) expectsContinue() bool {
return strings.ToLower(r.Header.Get("Expect")) == "100-continue" return hasToken(r.Header.Get("Expect"), "100-continue")
} }
func (r *Request) wantsHttp10KeepAlive() bool { func (r *Request) wantsHttp10KeepAlive() bool {
if r.ProtoMajor != 1 || r.ProtoMinor != 0 { if r.ProtoMajor != 1 || r.ProtoMinor != 0 {
return false return false
} }
return strings.Contains(strings.ToLower(r.Header.Get("Connection")), "keep-alive") return hasToken(r.Header.Get("Connection"), "keep-alive")
}
func (r *Request) wantsClose() bool {
return hasToken(r.Header.Get("Connection"), "close")
}
func hasToken(s, token string) bool {
if s == "" {
return false
}
// TODO This is a poor implementation of the RFC. See http://golang.org/issue/3535
return strings.Contains(strings.ToLower(s), token)
} }
...@@ -370,7 +370,7 @@ func TestIdentityResponse(t *testing.T) { ...@@ -370,7 +370,7 @@ func TestIdentityResponse(t *testing.T) {
}) })
} }
func testTcpConnectionCloses(t *testing.T, req string, h Handler) { func testTCPConnectionCloses(t *testing.T, req string, h Handler) {
s := httptest.NewServer(h) s := httptest.NewServer(h)
defer s.Close() defer s.Close()
...@@ -410,21 +410,28 @@ func testTcpConnectionCloses(t *testing.T, req string, h Handler) { ...@@ -410,21 +410,28 @@ func testTcpConnectionCloses(t *testing.T, req string, h Handler) {
// TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive. // TestServeHTTP10Close verifies that HTTP/1.0 requests won't be kept alive.
func TestServeHTTP10Close(t *testing.T) { func TestServeHTTP10Close(t *testing.T) {
testTcpConnectionCloses(t, "GET / HTTP/1.0\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) { testTCPConnectionCloses(t, "GET / HTTP/1.0\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
ServeFile(w, r, "testdata/file") ServeFile(w, r, "testdata/file")
})) }))
} }
// TestClientCanClose verifies that clients can also force a connection to close.
func TestClientCanClose(t *testing.T) {
testTCPConnectionCloses(t, "GET / HTTP/1.1\r\nConnection: close\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
// Nothing.
}))
}
// TestHandlersCanSetConnectionClose verifies that handlers can force a connection to close, // TestHandlersCanSetConnectionClose verifies that handlers can force a connection to close,
// even for HTTP/1.1 requests. // even for HTTP/1.1 requests.
func TestHandlersCanSetConnectionClose11(t *testing.T) { func TestHandlersCanSetConnectionClose11(t *testing.T) {
testTcpConnectionCloses(t, "GET / HTTP/1.1\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) { testTCPConnectionCloses(t, "GET / HTTP/1.1\r\n\r\n", HandlerFunc(func(w ResponseWriter, r *Request) {
w.Header().Set("Connection", "close") w.Header().Set("Connection", "close")
})) }))
} }
func TestHandlersCanSetConnectionClose10(t *testing.T) { 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) { 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") w.Header().Set("Connection", "close")
})) }))
} }
......
...@@ -303,8 +303,7 @@ func (w *response) WriteHeader(code int) { ...@@ -303,8 +303,7 @@ func (w *response) WriteHeader(code int) {
if !connectionHeaderSet { if !connectionHeaderSet {
w.header.Set("Connection", "keep-alive") w.header.Set("Connection", "keep-alive")
} }
} else if !w.req.ProtoAtLeast(1, 1) { } else if !w.req.ProtoAtLeast(1, 1) || w.req.wantsClose() {
// Client did not ask to keep connection alive.
w.closeAfterReply = true w.closeAfterReply = true
} }
......
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