diff options
| author | Paul Mundt <paul.mundt@adaptant.io> | 2016-04-03 09:25:49 +0000 |
|---|---|---|
| committer | Paul Mundt <paul.mundt@adaptant.io> | 2016-04-03 09:25:49 +0000 |
| commit | 06e30d6e309f3f3b508b466f95fc4ce54e89bb21 (patch) | |
| tree | a558295cde7ec5e59f4bb28fc7da6c7c455201ca /src/dict2rest/deflate.go | |
| parent | cbad86e777b4f0256a2e521c2ac52a9cf2340c8f (diff) | |
| download | go-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.go | 37 |
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) + }) +} |
