diff options
author | Yotam Nachum <me@yotam.net> | 2019-12-06 21:15:28 +0200 |
---|---|---|
committer | Yotam Nachum <me@yotam.net> | 2019-12-06 21:22:18 +0200 |
commit | bbc61ff2a997b38455a68432f27182f275573ced (patch) | |
tree | a6a9e3267278ed5f5c9685bc330ceeaefea1cda8 | |
parent | Refactor main handler (diff) | |
download | shavit-bbc61ff2a997b38455a68432f27182f275573ced.tar.gz shavit-bbc61ff2a997b38455a68432f27182f275573ced.zip |
Recover from panics in the main handler
-rw-r--r-- | main.go | 2 | ||||
-rw-r--r-- | recover.go | 20 |
2 files changed, 21 insertions, 1 deletions
@@ -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) +} |