From b082c3e0482da9f875e82a57f9d01e7d2029562e Mon Sep 17 00:00:00 2001 From: Nazar Kanaev Date: Fri, 2 Apr 2021 17:28:41 +0100 Subject: [PATCH] gzip middleware --- src/server/gzip/middleware.go | 42 +++++++++++++++++++++++++++++++++++ src/server/routes.go | 4 +++- 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 src/server/gzip/middleware.go diff --git a/src/server/gzip/middleware.go b/src/server/gzip/middleware.go new file mode 100644 index 0000000..ccf971b --- /dev/null +++ b/src/server/gzip/middleware.go @@ -0,0 +1,42 @@ +package gzip + +import ( + "compress/gzip" + "net/http" + "strings" + + "github.com/nkanaev/yarr/src/server/router" +) + +type gzipResponseWriter struct { + http.ResponseWriter + + out *gzip.Writer + src http.ResponseWriter +} + +func (rw *gzipResponseWriter) Header() http.Header { + return rw.src.Header() +} + +func (rw *gzipResponseWriter) Write(x []byte) (int, error) { + return rw.out.Write(x) +} + +func (rw *gzipResponseWriter) WriteHeader(statusCode int) { + rw.src.WriteHeader(statusCode) +} + +func Middleware(c *router.Context) { + if strings.Contains(c.Req.Header.Get("Accept-Encoding"), "gzip") { + gz := &gzipResponseWriter{out: gzip.NewWriter(c.Out), src: c.Out} + defer gz.out.Close() + + c.Out.Header().Set("Content-Encoding", "gzip") + c.Out = gz + c.Next() + + return + } + c.Next() +} diff --git a/src/server/routes.go b/src/server/routes.go index a184494..245feee 100644 --- a/src/server/routes.go +++ b/src/server/routes.go @@ -14,6 +14,7 @@ import ( "github.com/nkanaev/yarr/src/content/sanitizer" "github.com/nkanaev/yarr/src/content/silo" "github.com/nkanaev/yarr/src/server/auth" + "github.com/nkanaev/yarr/src/server/gzip" "github.com/nkanaev/yarr/src/server/opml" "github.com/nkanaev/yarr/src/server/router" "github.com/nkanaev/yarr/src/storage" @@ -23,6 +24,8 @@ import ( func (s *Server) handler() http.Handler { r := router.NewRouter(s.BasePath) + r.Use(gzip.Middleware) + if s.Username != "" && s.Password != "" { a := &auth.Middleware{ BasePath: s.BasePath, @@ -62,7 +65,6 @@ func (s *Server) handleIndex(c *router.Context) { } func (s *Server) handleStatic(c *router.Context) { - // TODO: gzip? // don't serve templates dir, name := filepath.Split(c.Vars["path"]) if dir == "" && strings.HasSuffix(name, ".html") {