about summary refs log tree commit diff stats
path: root/httpmeta.go
diff options
context:
space:
mode:
Diffstat (limited to 'httpmeta.go')
-rw-r--r--httpmeta.go60
1 files changed, 60 insertions, 0 deletions
diff --git a/httpmeta.go b/httpmeta.go
new file mode 100644
index 0000000..2a733aa
--- /dev/null
+++ b/httpmeta.go
@@ -0,0 +1,60 @@
+package main
+
+import (
+	"context"
+	"log"
+	"net/http"
+	"strings"
+)
+
+// Attaches a request's IP address to the request's context
+func newCtxUserIP(ctx context.Context, r *http.Request) context.Context {
+
+	base := strings.Split(r.RemoteAddr, ":")
+	uip := base[0]
+
+	return context.WithValue(ctx, ctxKey, uip)
+}
+
+// Retrieves a request's IP address from the request's context
+func getIPFromCtx(ctx context.Context) string {
+
+	uip, ok := ctx.Value(ctxKey).(string)
+	if !ok {
+		log.Printf("Couldn't retrieve IP from request\n")
+	}
+
+	return uip
+}
+
+// Shim function to modify/pass context value to a handler
+func ipMiddleware(hop http.Handler) http.Handler {
+
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		ctx := newCtxUserIP(r.Context(), r)
+		hop.ServeHTTP(w, r.WithContext(ctx))
+	})
+}
+
+// log output for 200s
+func log200(r *http.Request) {
+
+	uip := getIPFromCtx(r.Context())
+	log.Printf("*** %v :: 200 :: %v %v\n", uip, r.Method, r.URL)
+}
+
+// log output for 404s
+func log404(w http.ResponseWriter, r *http.Request, err error) {
+
+	uip := getIPFromCtx(r.Context())
+	log.Printf("*** %v :: 404 :: %v %v :: %v\n", uip, r.Method, r.URL, err)
+	http.Error(w, err.Error(), http.StatusNotFound)
+}
+
+// log output for 500s
+func log500(w http.ResponseWriter, r *http.Request, err error) {
+
+	uip := getIPFromCtx(r.Context())
+	log.Printf("*** %v :: 500 :: %v %v :: %v\n", uip, r.Method, r.URL, err)
+	http.Error(w, err.Error(), http.StatusInternalServerError)
+}