diff options
author | OpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com> | 2021-09-12 02:07:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-12 02:07:36 -0400 |
commit | f785d8d1940a6cf3ac76f4c333d157bd9d4c76b7 (patch) | |
tree | 215fcf8cac010819b632cc4c564025413b93728c /pkg/api/server/handler_panic.go | |
parent | 72662f790bad0a3dc26a6a1498b6daa936702bb6 (diff) | |
parent | deaf9692432bb6a9353fe56cecb6cddf0401a78c (diff) | |
download | podman-f785d8d1940a6cf3ac76f4c333d157bd9d4c76b7.tar.gz podman-f785d8d1940a6cf3ac76f4c333d157bd9d4c76b7.tar.bz2 podman-f785d8d1940a6cf3ac76f4c333d157bd9d4c76b7.zip |
Merge pull request #11517 from jwhonce/issues/10053
Refactor API server emphasis on logging
Diffstat (limited to 'pkg/api/server/handler_panic.go')
-rw-r--r-- | pkg/api/server/handler_panic.go | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/pkg/api/server/handler_panic.go b/pkg/api/server/handler_panic.go new file mode 100644 index 000000000..f643db79a --- /dev/null +++ b/pkg/api/server/handler_panic.go @@ -0,0 +1,32 @@ +package server + +import ( + "fmt" + "net/http" + "runtime" + + "github.com/containers/podman/v3/pkg/api/handlers/utils" + "github.com/gorilla/mux" + "github.com/sirupsen/logrus" +) + +// panicHandler captures panics from endpoint handlers and logs stack trace +func panicHandler() mux.MiddlewareFunc { + return func(h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // http.Server hides panics from handlers, we want to record them and fix the cause + defer func() { + err := recover() + if err != nil { + buf := make([]byte, 1<<20) + n := runtime.Stack(buf, true) + logrus.Warnf("Recovering from API service endpoint handler panic: %v, %s", err, buf[:n]) + // Try to inform client things went south... won't work if handler already started writing response body + utils.InternalServerError(w, fmt.Errorf("%v", err)) + } + }() + + h.ServeHTTP(w, r) + }) + } +} |