From 30ae249c6ffef88cb21de72e065bb697d3575bfa Mon Sep 17 00:00:00 2001 From: Chris James Date: Tue, 3 Mar 2020 13:27:55 +0000 Subject: [PATCH] add some timeouts, have a panic handler --- Dockerfile | 2 +- main.go | 30 +++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 580ed29e..e2eca251 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM alpine:3.9.4 RUN apk add --update wget bash ca-certificates && \ - wget -O mockingjay-server https://github.com/quii/mockingjay-server/releases/download/1.11.3/linux_amd64_mockingjay-server --no-check-certificate && \ + wget -O mockingjay-server https://github.com/quii/mockingjay-server/releases/download/1.11.4/linux_amd64_mockingjay-server --no-check-certificate && \ chmod +x mockingjay-server && \ apk del wget bash && \ rm -rf /var/cache/apk/* diff --git a/main.go b/main.go index 8e18b5a0..c08dc324 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "log" "net/http" + "time" ) func main() { @@ -24,7 +25,8 @@ func main() { log.Fatal(err) } else { config.logger.Printf("Listening on port %d", config.port) - err = http.ListenAndServe(fmt.Sprintf(":%d", config.port), svr) + webServer := newServer(svr, config.port) + err = webServer.ListenAndServe() if err != nil { msg := fmt.Sprintf("There was a problem starting the mockingjay server on port %d: %s", config.port, err.Error()) config.logger.Fatal(msg) @@ -32,3 +34,29 @@ func main() { } } } + +func newServer(router http.Handler, port int) *http.Server { + return &http.Server{ + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + IdleTimeout: 30 * time.Second, + ReadHeaderTimeout: 20 * time.Second, + Handler: http.TimeoutHandler(Recovery(router), 5*time.Second, "Timed out!"), + Addr: fmt.Sprintf(":%d", port), + } +} + +func Recovery(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + defer func() { + err := recover() + if err != nil { + msg := fmt.Sprintf("Oh dear, mockingjay has had a panic %#v", err) + log.Println(msg) + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprint(w, msg) + } + }() + next.ServeHTTP(w, r) + }) +}