From 8ff876d64eda493d9f269fe66fc7d774180c8bf5 Mon Sep 17 00:00:00 2001 From: Bagas Aulia Rezki Date: Tue, 22 Oct 2024 17:09:50 +0700 Subject: [PATCH] Add Gzip compression middleware for HTTP responses --- middleware/middleware.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/middleware/middleware.go b/middleware/middleware.go index e8e3d57..dc1130c 100644 --- a/middleware/middleware.go +++ b/middleware/middleware.go @@ -1,6 +1,7 @@ package middleware import ( + "compress/gzip" "context" "fmt" "github.com/fossyy/filekeeper/app" @@ -18,6 +19,15 @@ type wrapper struct { statusCode int } +type gzipResponseWriter struct { + http.ResponseWriter + Writer *gzip.Writer +} + +func (w gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + func (w *wrapper) WriteHeader(code int) { w.statusCode = code @@ -85,6 +95,17 @@ func Handler(next http.Handler) http.Handler { writer.Header().Set("Access-Control-Allow-Methods", fmt.Sprintf("%s, OPTIONS", utils.Getenv("CORS_METHODS"))) writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization") + + if strings.Contains(request.Header.Get("Accept-Encoding"), "gzip") { + writer.Header().Set("Content-Encoding", "gzip") + gz := gzip.NewWriter(writer) + defer gz.Close() + + gzWriter := gzipResponseWriter{Writer: gz, ResponseWriter: writer} + next.ServeHTTP(gzWriter, request) + return + } + next.ServeHTTP(wrappedWriter, request) app.Server.Logger.Info(fmt.Sprintf("%s %s %s %v", utils.ClientIP(request), request.Method, request.RequestURI, wrappedWriter.statusCode)) })