From 15c2dcc46fcfd289a3309f6f86c1a31a2af0da8f Mon Sep 17 00:00:00 2001 From: Haelnorr Date: Thu, 13 Feb 2025 22:23:35 +1100 Subject: [PATCH] Added gzip middleware --- middleware/gzip.go | 31 +++++++++++++++++++++++++++++++ server/server.go | 3 +++ 2 files changed, 34 insertions(+) create mode 100644 middleware/gzip.go diff --git a/middleware/gzip.go b/middleware/gzip.go new file mode 100644 index 0000000..cc9ae92 --- /dev/null +++ b/middleware/gzip.go @@ -0,0 +1,31 @@ +package middleware + +import ( + "compress/gzip" + "io" + "net/http" + "strings" +) + +func Gzip(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + next.ServeHTTP(w, r) + return + } + w.Header().Set("Content-Encoding", "gzip") + gz := gzip.NewWriter(w) + defer gz.Close() + gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w} + next.ServeHTTP(gzw, r) + }) +} + +type gzipResponseWriter struct { + io.Writer + http.ResponseWriter +} + +func (w gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} diff --git a/server/server.go b/server/server.go index c43b225..c86490b 100644 --- a/server/server.go +++ b/server/server.go @@ -33,6 +33,9 @@ func NewServer( handler = middleware.ExcludedFiles(handler) handler = middleware.Favicon(handler) + // Gzip + handler = middleware.Gzip(handler) + // Start the timer for the request chain so logger can have accurate info handler = middleware.StartTimer(handler) return handler