gzip.go 706 B

1234567891011121314151617181920212223242526272829303132333435
  1. package internal
  2. import (
  3. "compress/gzip"
  4. "net/http"
  5. "strings"
  6. )
  7. func GzipMiddleware(level int, next http.Handler) http.Handler {
  8. return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  9. if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
  10. next.ServeHTTP(w, r)
  11. return
  12. }
  13. w.Header().Set("Content-Encoding", "gzip")
  14. gz, err := gzip.NewWriterLevel(w, level)
  15. if err != nil {
  16. panic(err)
  17. }
  18. defer gz.Close()
  19. grw := gzipResponseWriter{ResponseWriter: w, sink: gz}
  20. next.ServeHTTP(grw, r)
  21. })
  22. }
  23. type gzipResponseWriter struct {
  24. http.ResponseWriter
  25. sink *gzip.Writer
  26. }
  27. func (w gzipResponseWriter) Write(b []byte) (int, error) {
  28. return w.sink.Write(b)
  29. }