aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/middleware/gzip.go
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2024-10-09 16:03:12 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2024-10-09 16:03:12 -0400
commit17e269202ba01e8467a87163395a1e6ac8261e02 (patch)
tree38a4698f8789268a935c133d004f2bb9f7b0d81a /middleware/gzip.go
parenta1af12ca8bf93a14b3017aa463a9463eaa4f1188 (diff)
Refactor middleware to separate package
Diffstat (limited to 'middleware/gzip.go')
-rw-r--r--middleware/gzip.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/middleware/gzip.go b/middleware/gzip.go
new file mode 100644
index 0000000..2ceb77e
--- /dev/null
+++ b/middleware/gzip.go
@@ -0,0 +1,56 @@
+package middleware
+
+import (
+ "compress/gzip"
+ "net/http"
+ "strings"
+)
+
+type gzipResponseWriter struct {
+ gzip.Writer
+ http.ResponseWriter
+}
+
+func newGzipResponseWriter(w http.ResponseWriter) *gzipResponseWriter {
+ gzrw := new(gzipResponseWriter)
+ gzrw.Writer = *gzip.NewWriter(w)
+ gzrw.ResponseWriter = w
+
+ return gzrw
+}
+
+func (gzrw *gzipResponseWriter) Close() error {
+ return gzrw.Writer.Close()
+}
+
+func (gzrw *gzipResponseWriter) Header() http.Header {
+ return gzrw.ResponseWriter.Header()
+}
+
+func (gzrw *gzipResponseWriter) Write(p []byte) (int, error) {
+ n, err := gzrw.Writer.Write(p)
+ return n, err
+}
+
+func (gzrw *gzipResponseWriter) WriteHeader(statuscode int) {
+ gzrw.ResponseWriter.WriteHeader(statuscode)
+}
+
+// Middleware to conditionally gzip a response
+func Gzip(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ acceptedEncodings := r.Header.Get("Accept-Encoding")
+
+ if !strings.Contains(acceptedEncodings, "gzip") {
+ Logger.DebugContext(r.Context(), "Using gzip middleware but client does not support gzip encoding")
+ next.ServeHTTP(w, r)
+ return
+ }
+
+ w.Header().Add("Content-Encoding", "gzip")
+ gzrw := newGzipResponseWriter(w)
+ defer gzrw.Close()
+
+ next.ServeHTTP(gzrw, r)
+ })
+}