package middleware import ( "compress/gzip" "io" "net/http" "strings" "spend-sparrow/log" ) type gzipResponseWriter struct { io.Writer http.ResponseWriter } func (w gzipResponseWriter) Write(b []byte) (int, error) { return w.Writer.Write(b) } 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) wrapper := gzipResponseWriter{Writer: gz, ResponseWriter: w} next.ServeHTTP(wrapper, r) err := gz.Close() if err != nil && err != http.ErrBodyNotAllowed { // if err != nil { log.Error("Gzip: could not close Writer: %v", err) } }) }