From 4fdf8052f5aed236401a8ab775531717dcebed20 Mon Sep 17 00:00:00 2001 From: Eric Urban Date: Tue, 30 Mar 2021 10:36:54 -0500 Subject: [PATCH] Add some error handling & what not --- Dockerfile | 5 +++++ internal/server/server.go | 22 ++++++++++++++++++---- internal/server/templates/error.tmpl | 4 ++++ internal/server/templates/showPaste.tmpl | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 Dockerfile create mode 100644 internal/server/templates/error.tmpl diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..5a8ee21 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM alpine:3.13 +RUN apk add --no-cache libc6-compat +WORKDIR /app +COPY ./goosebin . +CMD ["/app/goosebin"] diff --git a/internal/server/server.go b/internal/server/server.go index 8fa7b82..458cd78 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -72,6 +72,7 @@ func (rh *requestHandler) createPaste(rw http.ResponseWriter, req *http.Request) val, err := rh.client.SetNX(req.Context(), k.redisKey(), paste, rh.pasteTtl).Result() if err != nil { fmt.Printf("%s %s error on redis setnx: %v\n", req.Method, req.URL.Path, err) + rh.serveError(rw, req, http.StatusInternalServerError, err) return } @@ -83,7 +84,6 @@ func (rh *requestHandler) createPaste(rw http.ResponseWriter, req *http.Request) } vars["title"] = "Paste created" - rw.WriteHeader(http.StatusOK) vars["pastePath"] = k.path() rh.serveTemplate(rw, req, "createPaste", vars, http.StatusOK) } @@ -117,8 +117,8 @@ func (rh *requestHandler) rawPaste(rw http.ResponseWriter, req *http.Request) { func loadPaste(ctx context.Context, client *redis.Client, pk pasteKey) (string, time.Duration, error) { val, err := client.Get(ctx, pk.redisKey()).Result() - if err == redis.Nil { - return "", time.Duration(0), redis.Nil + if err != nil { + return "", time.Duration(0), err } ttl, err := client.TTL(ctx, pk.redisKey()).Result() @@ -149,8 +149,8 @@ func (rh *requestHandler) showPaste(rw http.ResponseWriter, req *http.Request) { } if err != nil { - rw.WriteHeader(http.StatusInternalServerError) fmt.Printf("%s %s error getting key from redis: %v\n", req.Method, req.URL.Path, err) + rh.serveError(rw, req, http.StatusInternalServerError, err) return } @@ -267,6 +267,20 @@ func newRequestHandler() (*requestHandler, error) { return result, nil } +func (rh *requestHandler) serveError(rw http.ResponseWriter, req *http.Request, code int, err error){ + fmt.Printf("%s %s failed: %v\n", req.Method, req.URL.Path, err) + rw.Header().Add("Cache-Control", "no-store, max-age=0") + rw.WriteHeader(code) + vars := make(map[string]interface{}) + vars["title"] = "Server Error" + vars["code"] = code + vars["path"] = req.URL.Path + err = rh.t.ExecuteTemplate(rw, "error", vars) + if err != nil { + fmt.Printf("Could not render error template: %v\n", err) + } +} + func (rh *requestHandler) serveTemplate(rw http.ResponseWriter, req *http.Request, name string, vars map[string]interface{}, status int) { rw.Header().Add("Content-Type", "text/html; charset=UTF-8") rw.WriteHeader(status) diff --git a/internal/server/templates/error.tmpl b/internal/server/templates/error.tmpl new file mode 100644 index 0000000..7635f8b --- /dev/null +++ b/internal/server/templates/error.tmpl @@ -0,0 +1,4 @@ +{{define "error"}}{{template "head" .}} +

{{.code}} {{.path}}

+

A server error has occurred

+{{end}} \ No newline at end of file diff --git a/internal/server/templates/showPaste.tmpl b/internal/server/templates/showPaste.tmpl index 3f76ae9..6757262 100644 --- a/internal/server/templates/showPaste.tmpl +++ b/internal/server/templates/showPaste.tmpl @@ -6,6 +6,6 @@
  • View as raw
  • -

    {{.paste}}

    +

    {{.paste}}

    {{end}} \ No newline at end of file