• Daniel Morsing's avatar
    net/http: handle close/response race more gracefully · 39377013
    Daniel Morsing authored
    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/1787Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    39377013
transport.go 34.1 KB