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 | |
| 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.
| -rw-r--r-- | README.md | 4 | ||||
| -rw-r--r-- | src/dict2rest/deflate.go | 37 | ||||
| -rw-r--r-- | src/dict2rest/main.go | 21 |
3 files changed, 57 insertions, 5 deletions
@@ -27,12 +27,14 @@ The server binary has the following options: $ dict2rest --help Usage of dict2rest: + -deflate + Support DEFLATE compression -dicthost string Dict server name (default "localhost") -dictport string Dict server port (default "2628") -gzip - Enable gzip compression + Support gzip compression -port string Listen port (default "8080") ``` 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{ |
