From 0385e601901f60531913f592dbb2be5e5d4fac9a Mon Sep 17 00:00:00 2001 From: Matt Jaffee Date: Tue, 18 Jul 2017 16:41:43 -0700 Subject: [PATCH] add recovery in top level handler --- handler.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/handler.go b/handler.go index bffb36947..d6b9c4d0c 100644 --- a/handler.go +++ b/handler.go @@ -29,6 +29,7 @@ import ( "net/http" _ "net/http/pprof" "os" + "runtime/debug" "strconv" "strings" "time" @@ -138,6 +139,16 @@ func (h *Handler) methodNotAllowedHandler(w http.ResponseWriter, r *http.Request // ServeHTTP handles an HTTP request. func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + defer func() { + if err := recover(); err != nil { + w.WriteHeader(http.StatusInternalServerError) + stack := debug.Stack() + msg := "PANIC: %s\n%s" + fmt.Fprintf(h.LogOutput, msg, err, stack) + fmt.Fprintf(w, msg, err, stack) + } + }() + t := time.Now() h.Router.ServeHTTP(w, r) dif := time.Since(t)