diff options
| -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..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{ |
