aboutsummaryrefslogtreecommitdiff
path: root/src/dict2rest/deflate.go
diff options
context:
space:
mode:
authorPaul Mundt <paul.mundt@adaptant.io>2016-04-03 09:25:49 +0000
committerPaul Mundt <paul.mundt@adaptant.io>2016-04-03 09:25:49 +0000
commit06e30d6e309f3f3b508b466f95fc4ce54e89bb21 (patch)
treea558295cde7ec5e59f4bb28fc7da6c7c455201ca /src/dict2rest/deflate.go
parentcbad86e777b4f0256a2e521c2ac52a9cf2340c8f (diff)
downloadgo-dict2rest-06e30d6e309f3f3b508b466f95fc4ce54e89bb21.tar.gz
go-dict2rest-06e30d6e309f3f3b508b466f95fc4ce54e89bb21.tar.bz2
Add support for deflate compression
This enables optional support for deflate compression to be used for HTTP requests. Primarily useful in cases where gzip compression is not available on the requesting client side.
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)
+ })
+}