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