aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/middleware
diff options
context:
space:
mode:
Diffstat (limited to 'middleware')
-rw-r--r--middleware/gzip.go56
-rw-r--r--middleware/middleware.go12
-rw-r--r--middleware/timeout.go17
3 files changed, 85 insertions, 0 deletions
diff --git a/middleware/gzip.go b/middleware/gzip.go
new file mode 100644
index 0000000..2ceb77e
--- /dev/null
+++ b/middleware/gzip.go
@@ -0,0 +1,56 @@
+package middleware
+
+import (
+ "compress/gzip"
+ "net/http"
+ "strings"
+)
+
+type gzipResponseWriter struct {
+ gzip.Writer
+ http.ResponseWriter
+}
+
+func newGzipResponseWriter(w http.ResponseWriter) *gzipResponseWriter {
+ gzrw := new(gzipResponseWriter)
+ gzrw.Writer = *gzip.NewWriter(w)
+ gzrw.ResponseWriter = w
+
+ return gzrw
+}
+
+func (gzrw *gzipResponseWriter) Close() error {
+ return gzrw.Writer.Close()
+}
+
+func (gzrw *gzipResponseWriter) Header() http.Header {
+ return gzrw.ResponseWriter.Header()
+}
+
+func (gzrw *gzipResponseWriter) Write(p []byte) (int, error) {
+ n, err := gzrw.Writer.Write(p)
+ return n, err
+}
+
+func (gzrw *gzipResponseWriter) WriteHeader(statuscode int) {
+ gzrw.ResponseWriter.WriteHeader(statuscode)
+}
+
+// Middleware to conditionally gzip a response
+func Gzip(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ acceptedEncodings := r.Header.Get("Accept-Encoding")
+
+ if !strings.Contains(acceptedEncodings, "gzip") {
+ Logger.DebugContext(r.Context(), "Using gzip middleware but client does not support gzip encoding")
+ next.ServeHTTP(w, r)
+ return
+ }
+
+ w.Header().Add("Content-Encoding", "gzip")
+ gzrw := newGzipResponseWriter(w)
+ defer gzrw.Close()
+
+ next.ServeHTTP(gzrw, r)
+ })
+}
diff --git a/middleware/middleware.go b/middleware/middleware.go
new file mode 100644
index 0000000..b1f3b52
--- /dev/null
+++ b/middleware/middleware.go
@@ -0,0 +1,12 @@
+package middleware
+
+import (
+ "log/slog"
+ "os"
+)
+
+var Logger *slog.Logger
+
+func init(){
+ Logger = slog.New(slog.NewTextHandler(os.Stdout, nil))
+}
diff --git a/middleware/timeout.go b/middleware/timeout.go
new file mode 100644
index 0000000..6a3f5de
--- /dev/null
+++ b/middleware/timeout.go
@@ -0,0 +1,17 @@
+package middleware
+
+import (
+ "context"
+ "net/http"
+ "time"
+)
+
+// Middleware to timeout requests after a given duration
+func Timeout(next http.Handler, duration time.Duration) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ ctx, cancel := context.WithTimeout(r.Context(), duration)
+ defer cancel()
+
+ next.ServeHTTP(w, r.WithContext(ctx))
+ })
+}