-
Notifications
You must be signed in to change notification settings - Fork 1
/
gzip.go
32 lines (27 loc) · 936 Bytes
/
gzip.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package middleware
import (
"compress/gzip"
"net/http"
"github.com/Nigel2392/router/v3"
"github.com/Nigel2392/router/v3/request"
"github.com/Nigel2392/router/v3/request/writer"
)
// GZIP compresses the response using gzip compression.
func GZIP(next router.Handler) router.Handler {
return router.HandleFunc(func(r *request.Request) {
r.Response.Header().Set("Content-Encoding", "gzip")
// Compress the response
var gz = gzip.NewWriter(r.Response)
defer gz.Close()
// Create gzip response writer
var gzw = gzipResponseWriter{ResponseWriter: r.Response, Writer: gz}
r.Response = writer.NewClearable(gzw)
next.ServeHTTP(r)
})
}
type gzipResponseWriter struct {
http.ResponseWriter
*gzip.Writer
}
func (w gzipResponseWriter) Write(b []byte) (int, error) { return w.Writer.Write(b) }
func (w gzipResponseWriter) Header() http.Header { return w.ResponseWriter.Header() }