]> Cypherpunks.ru repositories - gostls13.git/commit
net/http: make Client use Request.Cancel for timeouts instead of CancelRequest
authorBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Jan 2016 04:59:05 +0000 (20:59 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Jan 2016 22:55:22 +0000 (22:55 +0000)
commit7de71c8526d9055be9da99a9ef2a09eb16363d6a
tree5e2e101b63d4851b8c61aa70b0e432ec3c4b9b2b
parent212bdd95e00c1b02ae4e797d1d38ac7dcb6d131a
net/http: make Client use Request.Cancel for timeouts instead of CancelRequest

In the beginning, there was no way to cancel an HTTP request.

We later added Transport.CancelRequest to cancel an in-flight HTTP
request by breaking its underlying TCP connection, but it was hard to
use correctly and didn't work in all cases. And its error messages
were terrible. Some of those issues were fixed over time, but the most
unfixable problem was that it didn't compose well. All RoundTripper
implementations had to choose to whether to implement CancelRequest
and both decisions had negative consequences.

In Go 1.5 we added Request.Cancel, which composed well, worked in all
phases, had nice error messages, etc. But we forgot to use it in the
implementation of Client.Timeout (a timeout which spans multiple
requests and reading request bodies).

In Go 1.6 (upcoming), we added HTTP/2 support, but now Client.Timeout
didn't work because the http2.Transport didn't have a CancelRequest
method.

Rather than add a CancelRequest method to http2, officially deprecate
it and update the only caller (Client, for Client.Cancel) to use
Request.Cancel instead.

The http2 Client timeout tests are enabled now.

For compatibility, we still use CancelRequest in Client if we don't
recognize the RoundTripper type. But documentation has been updated to
tell people that CancelRequest is deprecated.

Fixes #13540

Change-Id: I15546b90825bb8b54905e17563eca55ea2642075
Reviewed-on: https://go-review.googlesource.com/18260
Reviewed-by: Andrew Gerrand <adg@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/net/http/client.go
src/net/http/client_test.go
src/net/http/header.go
src/net/http/transport.go