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}}