]> Cypherpunks repositories - gostls13.git/commit
net/http: handle close/response race more gracefully
authorDaniel Morsing <daniel.morsing@gmail.com>
Thu, 18 Dec 2014 14:05:48 +0000 (15:05 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Thu, 9 Apr 2015 13:46:50 +0000 (13:46 +0000)
commit39377013cb9b49b39e55c83a5b221547f14d04dd
tree2e5f3b56d333fd01e6d6a83af1b3f88e1da47f02
parenta2d12201adb3143c8f1f3d1528c1c0ab961ab98d
net/http: handle close/response race more gracefully

There was a logical race in Transport.RoundTrip where a roundtrip with
a pending response would race with the channel for the connection
closing. This usually happened for responses with connection: close
and no body.

We handled this race by reading the close channel, setting a timer
for 100ms and if no response was returned before then, we would then
return an error.

This put a lower bound on how fast a connection could fail. We couldn't
fail a request faster than 100ms.

Reordering the channel operations gets rid of the logical race. If
the readLoop causes the connection to be closed, it would have put
its response into the return channel already and we can fetch it with
a non-blocking receive.

Change-Id: Idf09e48d7a0453d7de0120d3055d0ce5893a5428
Reviewed-on: https://go-review.googlesource.com/1787
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/http/export_test.go
src/net/http/transport.go
src/net/http/transport_test.go