diff --git a/src/net/http/transport.go b/src/net/http/transport.go index af48eaa9f0568b..bd9717ea1501e4 100644 --- a/src/net/http/transport.go +++ b/src/net/http/transport.go @@ -492,6 +492,7 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) { return nil, &badStringError{"unsupported protocol scheme", scheme} } if req.Method != "" && !validMethod(req.Method) { + req.closeBody() return nil, fmt.Errorf("net/http: invalid method %q", req.Method) } if req.URL.Host == "" { diff --git a/src/net/http/transport_test.go b/src/net/http/transport_test.go index d7eef0d94cc51b..0fe1283d97e8af 100644 --- a/src/net/http/transport_test.go +++ b/src/net/http/transport_test.go @@ -5719,3 +5719,32 @@ func TestInvalidHeaderResponse(t *testing.T) { t.Errorf(`bad "Foo " header value: %q, want %q`, v, "bar") } } + +type bodyCloser bool + +func (bc *bodyCloser) Close() error { + *bc = true + return nil +} +func (bc *bodyCloser) Read(b []byte) (n int, err error) { + return 0, io.EOF +} + +func TestInvalidMethodClosesBody(t *testing.T) { + cst := httptest.NewServer(HandlerFunc(func(w ResponseWriter, r *Request) {})) + defer cst.Close() + var bc bodyCloser + u, _ := url.Parse(cst.URL) + req := &Request{ + Method: " ", + URL: u, + Body: &bc, + } + _, err := DefaultClient.Do(req) + if err == nil { + t.Fatal("Expected an error") + } + if !bc { + t.Fatal("Expected body to have been closed") + } +}