aboutsummaryrefslogtreecommitdiff
path: root/src/dict2rest/deflate.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/dict2rest/deflate.go')
-rw-r--r--src/dict2rest/deflate.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/dict2rest/deflate.go b/src/dict2rest/deflate.go
new file mode 100644
index 0000000..7173d22
--- /dev/null
+++ b/src/dict2rest/deflate.go
@@ -0,0 +1,37 @@
+package main
+
+import (
+ "compress/flate"
+ "io"
+ "net/http"
+ "strings"
+)
+
+// DEFLATE Compression
+type flateResponseWriter struct {
+ io.Writer
+ http.ResponseWriter
+}
+
+func (w flateResponseWriter) Write(b []byte) (int, error) {
+ return w.Writer.Write(b)
+}
+
+func Deflate(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
+ if !strings.Contains(req.Header.Get("Accept-Encoding"), "deflate") {
+ // If deflate is unsupported, revert to standard handler.
+ next.ServeHTTP(w, req)
+ return
+ }
+ w.Header().Set("Content-Encoding", "deflate")
+ fl, err := flate.NewWriter(w, -1) // Use default compression level
+ if err != nil {
+ next.ServeHTTP(w, req)
+ return
+ }
+ defer fl.Close()
+ flw := flateResponseWriter{Writer: fl, ResponseWriter: w}
+ next.ServeHTTP(flw, req)
+ })
+}