package gzip import ( "compress/gzip" "net/http" "strings" ) type gzipResponseWriter struct { Writer *gzip.Writer ResponseWriter http.ResponseWriter } func (gz gzipResponseWriter) Header() http.Header { return gz.ResponseWriter.Header() } func (gz gzipResponseWriter) Write(b []byte) (int, error) { return gz.Writer.Write(b) } func (gz gzipResponseWriter) WriteHeader(statusCode int) { gz.ResponseWriter.WriteHeader(statusCode) } func SetupCompression(handler http.HandlerFunc) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { handler(w, r) return } w.Header().Set("Content-Encoding", "gzip") gz := gzip.NewWriter(w) defer gz.Close() handler(gzipResponseWriter{Writer: gz, ResponseWriter: w}, r) } }