mirror of
https://github.com/golang/go
synced 2024-11-11 19:21:37 -07:00
net/http: make Server validate HTTP method
Fixes #18319 Change-Id: If88e60a86828f60d8d93fc291932c19bab19e8dc Reviewed-on: https://go-review.googlesource.com/34470 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
90de5e817c
commit
bb41b4d599
@ -930,6 +930,9 @@ func readRequest(b *bufio.Reader, deleteHostHeader bool) (req *Request, err erro
|
||||
if !ok {
|
||||
return nil, &badStringError{"malformed HTTP request", s}
|
||||
}
|
||||
if !validMethod(req.Method) {
|
||||
return nil, &badStringError{"invalid method", req.Method}
|
||||
}
|
||||
rawurl := req.RequestURI
|
||||
if req.ProtoMajor, req.ProtoMinor, ok = ParseHTTPVersion(req.Proto); !ok {
|
||||
return nil, &badStringError{"malformed HTTP version", req.Proto}
|
||||
|
@ -5312,3 +5312,30 @@ func TestServerHijackGetsBackgroundByte_big(t *testing.T) {
|
||||
t.Error("timeout")
|
||||
}
|
||||
}
|
||||
|
||||
// Issue 18319: test that the Server validates the request method.
|
||||
func TestServerValidatesMethod(t *testing.T) {
|
||||
tests := []struct {
|
||||
method string
|
||||
want int
|
||||
}{
|
||||
{"GET", 200},
|
||||
{"GE(T", 400},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
conn := &testConn{closec: make(chan bool, 1)}
|
||||
io.WriteString(&conn.readBuf, tt.method+" / HTTP/1.1\r\nHost: foo.example\r\n\r\n")
|
||||
|
||||
ln := &oneConnListener{conn}
|
||||
go Serve(ln, serve(200))
|
||||
<-conn.closec
|
||||
res, err := ReadResponse(bufio.NewReader(&conn.writeBuf), nil)
|
||||
if err != nil {
|
||||
t.Errorf("For %s, ReadResponse: %v", tt.method, res)
|
||||
continue
|
||||
}
|
||||
if res.StatusCode != tt.want {
|
||||
t.Errorf("For %s, Status = %d; want %d", tt.method, res.StatusCode, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user