Add Gzip compression middleware for HTTP responses
This commit is contained in:
@ -1,6 +1,7 @@
|
|||||||
package middleware
|
package middleware
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"compress/gzip"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/fossyy/filekeeper/app"
|
"github.com/fossyy/filekeeper/app"
|
||||||
@ -18,6 +19,15 @@ type wrapper struct {
|
|||||||
statusCode int
|
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) {
|
func (w *wrapper) WriteHeader(code int) {
|
||||||
w.statusCode = code
|
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-Methods", fmt.Sprintf("%s, OPTIONS", utils.Getenv("CORS_METHODS")))
|
||||||
writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")
|
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)
|
next.ServeHTTP(wrappedWriter, request)
|
||||||
app.Server.Logger.Info(fmt.Sprintf("%s %s %s %v", utils.ClientIP(request), request.Method, request.RequestURI, wrappedWriter.statusCode))
|
app.Server.Logger.Info(fmt.Sprintf("%s %s %s %v", utils.ClientIP(request), request.Method, request.RequestURI, wrappedWriter.statusCode))
|
||||||
})
|
})
|
||||||
|
Reference in New Issue
Block a user