Merge pull request #101 from fossyy/staging

Add Gzip compression middleware for HTTP responses
This commit is contained in:
2024-10-22 17:10:22 +07:00
committed by GitHub

View File

@ -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))
})