• Brad Fitzpatrick's avatar
    net/http: fix spurious logging in Transport when server closes idle conn · 4d2ac544
    Brad Fitzpatrick authored
    In https://golang.org/3210, Transport errors occurring before
    receiving response headers were wrapped in another error type to
    indicate to the retry logic elsewhere that the request might be
    re-tryable. But a check for err == io.EOF was missed, which then became
    false once io.EOF was wrapped in the beforeRespHeaderError type.
    
    The beforeRespHeaderError was too fragile. Remove it. I tried to fix
    it in an earlier version of this CL and just broke different things
    instead.
    
    Also remove the "markBroken" method. It's redundant and confusing.
    
    Also, rename the checkTransportResend method to shouldRetryRequest and
    make it return a bool instead of an error. This also helps readability.
    
    Now the code recognizes the two main reasons we'd want to retry a
    request: because we never wrote the request in the first place (so:
    count the number of bytes we've written), or because the server hung
    up on us before we received response headers for an idempotent request.
    
    As an added bonus, this could make POST requests safely re-tryable
    since we know we haven't written anything yet. But it's too late in Go
    1.7 to enable that, so we'll do that later (filed #15723).
    
    This also adds a new internal (package http) test, since testing this
    blackbox at higher levels in transport_test wasn't possible.
    
    Fixes #15446
    
    Change-Id: I2c1dc03b1f1ebdf3f04eba81792bd5c4fb6b6b66
    Reviewed-on: https://go-review.googlesource.com/23160Reviewed-by: 's avatarAndrew Gerrand <adg@golang.org>
    Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    4d2ac544
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang.org/x/net Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...