net/http: return appropriate errors from ReadRequest

Fixes #3298

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5783080
This commit is contained in:
Brad Fitzpatrick 2012-03-12 10:42:25 -07:00
parent da8efae9fe
commit e8deb3f828
3 changed files with 24 additions and 3 deletions

View 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 {

View 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 {

View 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