gzip.go 623 B

12345678910111213141516171819202122232425262728293031
  1. package main
  2. import (
  3. "compress/gzip"
  4. "io"
  5. "net/http"
  6. "strings"
  7. )
  8. type gzipResponseWriter struct {
  9. io.Writer
  10. http.ResponseWriter
  11. }
  12. func (w gzipResponseWriter) Write(b []byte) (int, error) {
  13. return w.Writer.Write(b)
  14. }
  15. func gzipHandler(fn http.HandlerFunc) http.HandlerFunc {
  16. return func(w http.ResponseWriter, r *http.Request) {
  17. if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
  18. fn(w, r)
  19. return
  20. }
  21. w.Header().Set("Content-Encoding", "gzip")
  22. gz, _ := gzip.NewWriterLevel(w, gzip.BestSpeed)
  23. defer gz.Close()
  24. gzr := gzipResponseWriter{Writer: gz, ResponseWriter: w}
  25. fn(gzr, r)
  26. }
  27. }