aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/dict2rest/deflate.go37
-rw-r--r--src/dict2rest/main.go21
2 files changed, 54 insertions, 4 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)
+ })
+}
diff --git a/src/dict2rest/main.go b/src/dict2rest/main.go
index 608ab8c..391f97e 100644
--- a/src/dict2rest/main.go
+++ b/src/dict2rest/main.go
@@ -21,7 +21,8 @@ func main() {
port := flag.String("port", "8080", "Listen port")
dictHost := flag.String("dicthost", "localhost", "Dict server name")
dictPort := flag.String("dictport", "2628", "Dict server port")
- gzip := flag.Bool("gzip", false, "Enable gzip compression")
+ gzip := flag.Bool("gzip", false, "Support gzip compression")
+ deflate := flag.Bool("deflate", false, "Support DEFLATE compression")
flag.Parse()
@@ -63,12 +64,24 @@ func main() {
},
})
- chain := alice.New(cors.Handler, Logger).Then(router)
+ stdChain := alice.New(cors.Handler, Logger)
if *gzip {
- chain = alice.New(cors.Handler, Logger, Gzip).Then(router)
- log.Println("Using Gzip compression")
+ stdChain = stdChain.Append(Gzip)
+ log.Println("Adding support for Gzip compression")
}
+ if *deflate {
+ // Temporary limitation until the iteration logic is fixed up
+ if *gzip {
+ log.Println("Not enabling DEFLATE, presently only one compression method can be active at a time")
+ } else {
+ stdChain = stdChain.Append(Deflate)
+ log.Println("Adding support for DEFLATE compression")
+ }
+ }
+
+ chain := stdChain.Then(router)
+
listen := ":" + *port
srv := &graceful.Server{