Skip to content

Commit 24d29e8

Browse files
committed
net/http: make Transport.RoundTrip check context.Done earlier
Fixes #25852 Change-Id: I35c630367c8f1934dcffc0b0e08891d55a903518 Reviewed-on: https://go-review.googlesource.com/118560 Run-TryBot: Brad Fitzpatrick <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Andrew Bonventre <[email protected]>
1 parent a2f72cc commit 24d29e8

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

src/net/http/transport.go

+7
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,13 @@ func (t *Transport) roundTrip(req *Request) (*Response, error) {
370370
}
371371

372372
for {
373+
select {
374+
case <-ctx.Done():
375+
req.closeBody()
376+
return nil, ctx.Err()
377+
default:
378+
}
379+
373380
// treq gets modified by roundTrip, so we need to recreate for each retry.
374381
treq := &transportRequest{Request: req, trace: trace}
375382
cm, err := t.connectMethodForRequest(treq)

src/net/http/transport_test.go

+25
Original file line numberDiff line numberDiff line change
@@ -4544,3 +4544,28 @@ func TestNoBodyOnChunked304Response(t *testing.T) {
45444544
type funcWriter func([]byte) (int, error)
45454545

45464546
func (f funcWriter) Write(p []byte) (int, error) { return f(p) }
4547+
4548+
type doneContext struct {
4549+
context.Context
4550+
err error
4551+
}
4552+
4553+
func (doneContext) Done() <-chan struct{} {
4554+
c := make(chan struct{})
4555+
close(c)
4556+
return c
4557+
}
4558+
4559+
func (d doneContext) Err() error { return d.err }
4560+
4561+
// Issue 25852: Transport should check whether Context is done early.
4562+
func TestTransportCheckContextDoneEarly(t *testing.T) {
4563+
tr := &Transport{}
4564+
req, _ := NewRequest("GET", "http://fake.example/", nil)
4565+
wantErr := errors.New("some error")
4566+
req = req.WithContext(doneContext{context.Background(), wantErr})
4567+
_, err := tr.RoundTrip(req)
4568+
if err != wantErr {
4569+
t.Errorf("error = %v; want %v", err, wantErr)
4570+
}
4571+
}

0 commit comments

Comments
 (0)