]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: return appropriate errors from ReadRequest
authorBrad Fitzpatrick <bradfitz@golang.org>
Mon, 12 Mar 2012 17:42:25 +0000 (10:42 -0700)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 12 Mar 2012 17:42:25 +0000 (10:42 -0700)
Fixes #3298

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5783080

src/pkg/net/http/request.go
src/pkg/net/http/request_test.go
src/pkg/net/http/server.go

index 5277657805d1df6615f76a2511b31ac0166a28e6..f5bc6eb9100fb9aeca4d92e94f70e29fcc138c1e 100644 (file)
@@ -455,11 +455,13 @@ func ReadRequest(b *bufio.Reader) (req *Request, err error) {
        // First line: GET /index.html HTTP/1.0
        var s string
        if s, err = tp.ReadLine(); err != nil {
+               return nil, err
+       }
+       defer func() {
                if err == io.EOF {
                        err = io.ErrUnexpectedEOF
                }
-               return nil, err
-       }
+       }()
 
        var f []string
        if f = strings.SplitN(s, " ", 3); len(f) < 3 {
index 7a3556d03674c0ed057eed03ee2dfb29e19dd8b3..6e00b9bfd394ed2e875b0967b2ea6abc12315175 100644 (file)
@@ -5,6 +5,7 @@
 package http_test
 
 import (
+       "bufio"
        "bytes"
        "fmt"
        "io"
@@ -177,6 +178,24 @@ func TestRequestMultipartCallOrder(t *testing.T) {
        }
 }
 
+var readRequestErrorTests = []struct {
+       in  string
+       err error
+}{
+       {"GET / HTTP/1.1\r\nheader:foo\r\n\r\n", nil},
+       {"GET / HTTP/1.1\r\nheader:foo\r\n", io.ErrUnexpectedEOF},
+       {"", io.EOF},
+}
+
+func TestReadRequestErrors(t *testing.T) {
+       for i, tt := range readRequestErrorTests {
+               _, err := ReadRequest(bufio.NewReader(strings.NewReader(tt.in)))
+               if err != tt.err {
+                       t.Errorf("%d. got error = %v; want %v", i, err, tt.err)
+               }
+       }
+}
+
 func testMissingFile(t *testing.T, req *Request) {
        f, fh, err := req.FormFile("missing")
        if f != nil {
index fa0df54a236c2dfef8b9ddc99638e1e1b8fcac30..228ac401968182fe6b4c2a42588892b322f0fec7 100644 (file)
@@ -601,7 +601,7 @@ func (c *conn) serve() {
                                // while they're still writing their
                                // request.  Undefined behavior.
                                msg = "413 Request Entity Too Large"
-                       } else if err == io.ErrUnexpectedEOF {
+                       } else if err == io.EOF {
                                break // Don't reply
                        } else if neterr, ok := err.(net.Error); ok && neterr.Timeout() {
                                break // Don't reply