aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/server.go
diff options
context:
space:
mode:
authorEmmanuel T Odeke <emmanuel@orijtech.com>2019-10-10 19:11:54 -0400
committerEmmanuel Odeke <emm.odeke@gmail.com>2019-10-21 18:38:15 +0000
commitff4e0e42d8f662529c3e6ac5af6591d31805ae2f (patch)
treec88af9cc68f632316759a9e1d3a9a965c3d07f38 /src/net/http/server.go
parent03978a97e5336c0ef46cec9b4f0733e9d897d083 (diff)
downloadgo-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.go32
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