aboutsummaryrefslogtreecommitdiff
path: root/pkg/api/server/handler_panic.go
diff options
context:
space:
mode:
authorOpenShift Merge Robot <openshift-merge-robot@users.noreply.github.com>2021-09-12 02:07:36 -0400
committerGitHub <noreply@github.com>2021-09-12 02:07:36 -0400
commitf785d8d1940a6cf3ac76f4c333d157bd9d4c76b7 (patch)
tree215fcf8cac010819b632cc4c564025413b93728c /pkg/api/server/handler_panic.go
parent72662f790bad0a3dc26a6a1498b6daa936702bb6 (diff)
parentdeaf9692432bb6a9353fe56cecb6cddf0401a78c (diff)
downloadpodman-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.go32
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)
+ })
+ }
+}