diff options
| author | Emmanuel T Odeke <emmanuel@orijtech.com> | 2019-10-10 19:11:54 -0400 |
|---|---|---|
| committer | Emmanuel Odeke <emm.odeke@gmail.com> | 2019-10-21 18:38:15 +0000 |
| commit | ff4e0e42d8f662529c3e6ac5af6591d31805ae2f (patch) | |
| tree | c88af9cc68f632316759a9e1d3a9a965c3d07f38 /src/net/http/server.go | |
| parent | 03978a97e5336c0ef46cec9b4f0733e9d897d083 (diff) | |
| download | go-ff4e0e42d8f662529c3e6ac5af6591d31805ae2f.tar.xz | |
net/http: make TimeoutHandler log spurious WriteHeader calls
Makes TimeoutHandler consistent with other handlers, by
logging any spurious WriteHeader calls.
Fixes #30803
Change-Id: I693fbdf8378f31bca13d579eece8e8e00eb175bf
Reviewed-on: https://go-review.googlesource.com/c/go/+/200518
Run-TryBot: Emmanuel Odeke <emm.odeke@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/net/http/server.go')
| -rw-r--r-- | src/net/http/server.go | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/net/http/server.go b/src/net/http/server.go index 5a006c6a67..f87e339dde 100644 --- a/src/net/http/server.go +++ b/src/net/http/server.go @@ -3227,8 +3227,9 @@ func (h *timeoutHandler) ServeHTTP(w ResponseWriter, r *Request) { r = r.WithContext(ctx) done := make(chan struct{}) tw := &timeoutWriter{ - w: w, - h: make(Header), + w: w, + h: make(Header), + req: r, } panicChan := make(chan interface{}, 1) go func() { @@ -3268,6 +3269,7 @@ type timeoutWriter struct { w ResponseWriter h Header wbuf bytes.Buffer + req *Request mu sync.Mutex timedOut bool @@ -3294,24 +3296,32 @@ func (tw *timeoutWriter) Write(p []byte) (int, error) { return 0, ErrHandlerTimeout } if !tw.wroteHeader { - tw.writeHeader(StatusOK) + tw.writeHeaderLocked(StatusOK) } return tw.wbuf.Write(p) } -func (tw *timeoutWriter) WriteHeader(code int) { +func (tw *timeoutWriter) writeHeaderLocked(code int) { checkWriteHeaderCode(code) - tw.mu.Lock() - defer tw.mu.Unlock() - if tw.timedOut || tw.wroteHeader { + + switch { + case tw.timedOut: return + case tw.wroteHeader: + if tw.req != nil { + caller := relevantCaller() + logf(tw.req, "http: superfluous response.WriteHeader call from %s (%s:%d)", caller.Function, path.Base(caller.File), caller.Line) + } + default: + tw.wroteHeader = true + tw.code = code } - tw.writeHeader(code) } -func (tw *timeoutWriter) writeHeader(code int) { - tw.wroteHeader = true - tw.code = code +func (tw *timeoutWriter) WriteHeader(code int) { + tw.mu.Lock() + defer tw.mu.Unlock() + tw.writeHeaderLocked(code) } // onceCloseListener wraps a net.Listener, protecting it from |
