aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2016-04-05 12:40:19 +0000
committerFelix Hanley <felix@userspace.com.au>2016-04-05 12:40:19 +0000
commit97772eae62e655b3d44228f5e8785c7721fa5f14 (patch)
treed30a2683d4706ab8cd6f7b8707370a6e147b757f /src
parent7da4815b9fe209a54bb3a0db2456970e6bde9d75 (diff)
parent3b21f2506a212425403e0b0ce932b73a1f976b86 (diff)
downloadgo-dict2rest-97772eae62e655b3d44228f5e8785c7721fa5f14.tar.gz
go-dict2rest-97772eae62e655b3d44228f5e8785c7721fa5f14.tar.bz2
Merge branch 'deflate' of https://github.com/pmundt/go-dict2rest into pmundt-deflate
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..b8ce5d6
--- /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
+ }
+ fl, err := flate.NewWriter(w, -1) // Use default compression level
+ if err != nil {
+ next.ServeHTTP(w, req)
+ return
+ }
+ w.Header().Set("Content-Encoding", "deflate")
+ 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{