From 0e2717dc3cc05907dc23096ef3a9086ea93f567f Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Thu, 10 Nov 2016 23:13:32 +0000 Subject: [PATCH] http2: conditionally log stacks from panics in Server Handlers like net/http Updates golang/go#17790 Change-Id: I7bc596d9a80490d545ad3d1de5859efce34714f6 Reviewed-on: https://go-review.googlesource.com/33102 TryBot-Result: Gobot Gobot Run-TryBot: Brad Fitzpatrick Reviewed-by: Joe Tsai --- http2/go18.go | 4 ++++ http2/not_go18.go | 4 ++++ http2/server.go | 12 +++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/http2/go18.go b/http2/go18.go index e0002036..8c0dd250 100644 --- a/http2/go18.go +++ b/http2/go18.go @@ -35,3 +35,7 @@ func configureServer18(h1 *http.Server, h2 *Server) error { } return nil } + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil && panicValue != http.ErrAbortHandler +} diff --git a/http2/not_go18.go b/http2/not_go18.go index c1fa5910..2e600dc3 100644 --- a/http2/not_go18.go +++ b/http2/not_go18.go @@ -12,3 +12,7 @@ func configureServer18(h1 *http.Server, h2 *Server) error { // No IdleTimeout to sync prior to Go 1.8. return nil } + +func shouldLogPanic(panicValue interface{}) bool { + return panicValue != nil +} diff --git a/http2/server.go b/http2/server.go index ca77d71d..ea260da1 100644 --- a/http2/server.go +++ b/http2/server.go @@ -1856,15 +1856,17 @@ func (sc *serverConn) runHandler(rw *responseWriter, req *http.Request, handler rw.rws.stream.cancelCtx() if didPanic { e := recover() - // Same as net/http: - const size = 64 << 10 - buf := make([]byte, size) - buf = buf[:runtime.Stack(buf, false)] sc.writeFrameFromHandler(FrameWriteRequest{ write: handlerPanicRST{rw.rws.stream.id}, stream: rw.rws.stream, }) - sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + // Same as net/http: + if shouldLogPanic(e) { + const size = 64 << 10 + buf := make([]byte, size) + buf = buf[:runtime.Stack(buf, false)] + sc.logf("http2: panic serving %v: %v\n%s", sc.conn.RemoteAddr(), e, buf) + } return } rw.handlerDone()