]> Cypherpunks repositories - gostls13.git/commitdiff
net/http: make Transport.roundTrip close body on invalid method
authorLuke Young <bored-engineer@users.noreply.github.com>
Sun, 20 Oct 2019 06:03:55 +0000 (06:03 +0000)
committerEmmanuel Odeke <emm.odeke@gmail.com>
Sun, 20 Oct 2019 06:25:35 +0000 (06:25 +0000)
Updates #35015

Change-Id: Ibfe8f72ed3887ca88ce9c1d8a29dacda72f3fe17
GitHub-Last-Rev: 4bfc56e71660ad9624ac5eb594b3afd0d221c99d
GitHub-Pull-Request: golang/go#35014
Reviewed-on: https://go-review.googlesource.com/c/go/+/202237
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/net/http/transport.go
src/net/http/transport_test.go

index af48eaa9f0568bbec4b13488122f912b2cc2d912..bd9717ea1501e414e6456a066f2b11de6ca87701 100644 (file)
@@ -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 == "" {
index d7eef0d94cc51bcf3e0d7f72b8264fb6443b00d7..0fe1283d97e8afda17358dcff1d747e9fbec4a59 100644 (file)
@@ -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")
+       }
+}