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) }) } type MiddlewareFunc func(next http.Handler) http.Handler // https://www.jvt.me/posts/2023/09/01/golang-nethttp-global-middleware/ func UseMiddleware(r HtmxServer, middlewares ...MiddlewareFunc) http.Handler { var s http.Handler s = r.GetHttpServer() 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) }) }