From f3af5c902029d4802dc554d0a3f5050322597960 Mon Sep 17 00:00:00 2001 From: David Ashby Date: Sat, 12 Sep 2020 17:13:58 -0400 Subject: [PATCH] add recovery handler --- main.go | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/main.go b/main.go index 4b6ccb6..a218d59 100644 --- a/main.go +++ b/main.go @@ -91,6 +91,13 @@ type geminiHandler interface { Handle(geminiResponse, geminiRequest) } +type geminiHandlerFunc func(geminiResponse, geminiRequest) + +// Handle calls f(w, r). +func (f geminiHandlerFunc) Handle(w geminiResponse, r geminiRequest) { + f(w, r) +} + // implementations type staticGeminiHandler struct { StaticString string @@ -163,6 +170,21 @@ func (h fsGeminiHandler) Handle(w geminiResponse, r geminiRequest) { io.Copy(w, source) } +func recoveryHandler(next geminiHandler) geminiHandler { + return geminiHandlerFunc(func(w geminiResponse, r geminiRequest) { + defer func() { + err := recover() + if err != nil { + log.Println(err) + w.WriteStatus(responseCodes["TEMPORARYFAILURE"], "Internal Error") + return + } + }() + + next.Handle(w, r) + }) +} + // handler for general http queries (fallthrough for certmagic) type genericHTTPHandler struct { StaticString string @@ -192,7 +214,7 @@ func handleConnection(log Logger, conn net.Conn, h geminiHandler) { r := request{ url: u, } - h.Handle(&w, r) + recoveryHandler(h).Handle(&w, r) } func main() {