add recovery handler
This commit is contained in:
parent
cb3282304b
commit
f3af5c9020
24
main.go
24
main.go
@ -91,6 +91,13 @@ type geminiHandler interface {
|
|||||||
Handle(geminiResponse, geminiRequest)
|
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
|
// implementations
|
||||||
type staticGeminiHandler struct {
|
type staticGeminiHandler struct {
|
||||||
StaticString string
|
StaticString string
|
||||||
@ -163,6 +170,21 @@ func (h fsGeminiHandler) Handle(w geminiResponse, r geminiRequest) {
|
|||||||
io.Copy(w, source)
|
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)
|
// handler for general http queries (fallthrough for certmagic)
|
||||||
type genericHTTPHandler struct {
|
type genericHTTPHandler struct {
|
||||||
StaticString string
|
StaticString string
|
||||||
@ -192,7 +214,7 @@ func handleConnection(log Logger, conn net.Conn, h geminiHandler) {
|
|||||||
r := request{
|
r := request{
|
||||||
url: u,
|
url: u,
|
||||||
}
|
}
|
||||||
h.Handle(&w, r)
|
recoveryHandler(h).Handle(&w, r)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
Loading…
Reference in New Issue
Block a user