From 3943897ae62cc82ab8e44eb55c330fd300eb6aba Mon Sep 17 00:00:00 2001 From: Achim Rohn Date: Wed, 13 Aug 2025 15:31:01 +0200 Subject: [PATCH] Add middleware that also gzips html content --- middleware.go | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 middleware.go diff --git a/middleware.go b/middleware.go new file mode 100644 index 0000000..7553b9c --- /dev/null +++ b/middleware.go @@ -0,0 +1,58 @@ +package ersteller_lib + +import ( + "compress/gzip" + "io" + "net/http" + "strings" +) + +type gzipResponseWriter struct { + io.Writer + http.ResponseWriter +} + +func (w gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + +// https://gist.github.com/the42/1956518 +func MakeGzipHandler(fn http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + fn.ServeHTTP(w, r) + return + } + w.Header().Set("Content-Encoding", "gzip") + gz := gzip.NewWriter(w) + defer gz.Close() + gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w} + fn.ServeHTTP(gzr, r) + }) +} + +// https://www.jvt.me/posts/2023/09/01/golang-nethttp-global-middleware/ +func UseMiddleware(r *http.ServeMux, middlewares ...func(next http.Handler) http.Handler) http.Handler { + var s http.Handler + s = r + + for _, mw := range middlewares { + s = mw(s) + } + + return s +} + +func LoggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + Debug("Path ", r.URL.String()) + next.ServeHTTP(w, r) + }) +} + +func AcceptHeaderMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + Debug("Accept: %v", r.Header.Get("Accept")) + next.ServeHTTP(w, r) + }) +}