]> Cypherpunks repositories - gostls13.git/commitdiff
http: don't send a 400 Bad Request after a client shutdown
authorBrad Fitzpatrick <bradfitz@golang.org>
Wed, 28 Sep 2011 16:27:11 +0000 (09:27 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 28 Sep 2011 16:27:11 +0000 (09:27 -0700)
Fixes #2312

R=golang-dev, dsymonds
CC=golang-dev
https://golang.org/cl/5143049

src/pkg/http/serve_test.go
src/pkg/http/server.go

index 1bb748c3c9ec6d43912e2e85a4af606ce1e68d5d..dfe4278ca38995732626200a98bb356e04572058 100644 (file)
@@ -987,6 +987,38 @@ func TestRequestBodyLimit(t *testing.T) {
        }
 }
 
+// TestClientWriteShutdown tests that if the client shuts down the write
+// side of their TCP connection, the server doesn't send a 400 Bad Request.
+func TestClientWriteShutdown(t *testing.T) {
+       ts := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {}))
+       defer ts.Close()
+       conn, err := net.Dial("tcp", ts.Listener.Addr().String())
+       if err != nil {
+               t.Fatalf("Dial: %v", err)
+       }
+       err = conn.(*net.TCPConn).CloseWrite()
+       if err != nil {
+               t.Fatalf("Dial: %v", err)
+       }
+       donec := make(chan bool)
+       go func() {
+               defer close(donec)
+               bs, err := ioutil.ReadAll(conn)
+               if err != nil {
+                       t.Fatalf("ReadAll: %v", err)
+               }
+               got := string(bs)
+               if got != "" {
+                       t.Errorf("read %q from server; want nothing", got)
+               }
+       }()
+       select {
+       case <-donec:
+       case <-time.After(10e9):
+               t.Fatalf("timeout")
+       }
+}
+
 type errorListener struct {
        errs []os.Error
 }
index 6be3611f0f5c7c94d9b057f8195439cc72f78fd7..8326ff8be1c39052fe0ce7f6832ddb820f883c0c 100644 (file)
@@ -572,6 +572,8 @@ func (c *conn) serve() {
                                // while they're still writing their
                                // request.  Undefined behavior.
                                msg = "413 Request Entity Too Large"
+                       } else if err == io.ErrUnexpectedEOF {
+                               break // Don't reply
                        } else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
                                break // Don't reply
                        }