Skip to content

Commit 9d56c18

Browse files
bradfitzrsc
authored andcommitted
net/http: make Transport return proper error on cancel before response headers
Fixes #11020 Change-Id: I52760a01420a11f3c979f678812b3775a3af61e4 Reviewed-on: https://go-review.googlesource.com/12545 Reviewed-by: Russ Cox <[email protected]>
1 parent 0c2d3f7 commit 9d56c18

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

src/net/http/transport.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,6 +1205,9 @@ WaitResponse:
12051205
}
12061206
default:
12071207
re = responseAndError{err: errClosed}
1208+
if pc.isCanceled() {
1209+
re = responseAndError{err: errRequestCanceled}
1210+
}
12081211
}
12091212
break WaitResponse
12101213
case <-respHeaderTimer:

src/net/http/transport_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,6 +1552,47 @@ func TestCancelRequestWithChannelBeforeDo(t *testing.T) {
15521552
}
15531553
}
15541554

1555+
// Issue 11020. The returned error message should be errRequestCanceled
1556+
func TestTransportCancelBeforeResponseHeaders(t *testing.T) {
1557+
defer afterTest(t)
1558+
1559+
serverConnCh := make(chan net.Conn, 1)
1560+
tr := &Transport{
1561+
Dial: func(network, addr string) (net.Conn, error) {
1562+
cc, sc := net.Pipe()
1563+
serverConnCh <- sc
1564+
return cc, nil
1565+
},
1566+
}
1567+
defer tr.CloseIdleConnections()
1568+
errc := make(chan error, 1)
1569+
req, _ := NewRequest("GET", "http://example.com/", nil)
1570+
go func() {
1571+
_, err := tr.RoundTrip(req)
1572+
errc <- err
1573+
}()
1574+
1575+
sc := <-serverConnCh
1576+
verb := make([]byte, 3)
1577+
if _, err := io.ReadFull(sc, verb); err != nil {
1578+
t.Errorf("Error reading HTTP verb from server: %v", err)
1579+
}
1580+
if string(verb) != "GET" {
1581+
t.Errorf("server received %q; want GET", verb)
1582+
}
1583+
defer sc.Close()
1584+
1585+
tr.CancelRequest(req)
1586+
1587+
err := <-errc
1588+
if err == nil {
1589+
t.Fatalf("unexpected success from RoundTrip")
1590+
}
1591+
if err != ExportErrRequestCanceled {
1592+
t.Errorf("RoundTrip error = %v; want ExportErrRequestCanceled", err)
1593+
}
1594+
}
1595+
15551596
// golang.org/issue/3672 -- Client can't close HTTP stream
15561597
// Calling Close on a Response.Body used to just read until EOF.
15571598
// Now it actually closes the TCP connection.

0 commit comments

Comments
 (0)