aboutsummaryrefslogtreecommitdiff
path: root/recover.go
diff options
context:
space:
mode:
authorYotam Nachum <me@yotam.net>2019-12-06 21:15:28 +0200
committerYotam Nachum <me@yotam.net>2019-12-06 21:22:18 +0200
commitbbc61ff2a997b38455a68432f27182f275573ced (patch)
treea6a9e3267278ed5f5c9685bc330ceeaefea1cda8 /recover.go
parentRefactor main handler (diff)
downloadshavit-bbc61ff2a997b38455a68432f27182f275573ced.tar.gz
shavit-bbc61ff2a997b38455a68432f27182f275573ced.zip
Recover from panics in the main handler
Diffstat (limited to 'recover.go')
-rw-r--r--recover.go20
1 files changed, 20 insertions, 0 deletions
diff --git a/recover.go b/recover.go
new file mode 100644
index 0000000..b4a82e7
--- /dev/null
+++ b/recover.go
@@ -0,0 +1,20 @@
+package main
+
+import (
+ gemini "git.sr.ht/~yotam/go-gemini"
+)
+
+// RecovererHandler wrap a Gemini handler and recover from panics
+type RecovererHandler struct {
+ handler gemini.Handler
+}
+
+// Handle implement the gemini.Handler interface by recovering inner handler
+func (h RecovererHandler) Handle(req gemini.Request) (res gemini.Response) {
+ defer func() {
+ if r := recover(); r != nil {
+ res = gemini.Response{Status: gemini.StatusTemporaryFailure, Meta: "Internal server error", Body: nil}
+ }
+ }()
+ return h.handler.Handle(req)
+}