package main import ( "compress/gzip" "io" "log" "net/http" "strings" ) type gzipWriter struct { http.ResponseWriter Writer io.Writer } func (w gzipWriter) Write(b []byte) (int, error) { // w.Writer будет отвечать за gzip-сжатие, поэтому пишем в него return w.Writer.Write(b) } func gzipHandle(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // проверяем, что клиент поддерживает gzip-сжатие if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { // если gzip не поддерживается, передаём управление // дальше без изменений log.Println("no support") next.ServeHTTP(w, r) return } // создаём gzip.Writer поверх текущего w gz, err := gzip.NewWriterLevel(w, gzip.BestSpeed) if err != nil { log.Println("erroe") io.WriteString(w, err.Error()) return } defer gz.Close() w.Header().Set("Content-Encoding", "gzip") // передаём обработчику страницы переменную типа gzipWriter для вывода данных next.ServeHTTP(gzipWriter{ResponseWriter: w, Writer: gz}, r) }) } func main() { mux := http.NewServeMux() mux.HandleFunc("/", defaultHandle()) http.ListenAndServe(":3000", gzipHandle(mux)) } // HandlerSetURL - создаем запись для url func defaultHandle() http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { // заголов ответа json w.Header().Set("Content-Type", "application/json") // заголов ответа 201 w.WriteHeader(http.StatusCreated) w.Write([]byte("привет")) } }
https://gist.github.com/evgensr/e048f2a85ec77c2effc4d5a3d84be3f4