aboutsummaryrefslogtreecommitdiff
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
parentRefactor main handler (diff)
downloadshavit-bbc61ff2a997b38455a68432f27182f275573ced.tar.gz
shavit-bbc61ff2a997b38455a68432f27182f275573ced.zip
Recover from panics in the main handler
-rw-r--r--main.go2
-rw-r--r--recover.go20
2 files changed, 21 insertions, 1 deletions
diff --git a/main.go b/main.go
index 37d9725..5a7da06 100644
--- a/main.go
+++ b/main.go
@@ -21,7 +21,7 @@ func main() {
log.Fatal(err)
}
- handler := LoggingHandler{Handler{cfg}}
+ handler := LoggingHandler{RecovererHandler{Handler{cfg}}}
err = gemini.ListenAndServe("", cfg.TLSCert, cfg.TLSKey, handler)
if err != nil {
log.Fatal(err)
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)
+}