From d6421c225ffa16e7005ee743e7f30cb55da112e8 Mon Sep 17 00:00:00 2001 From: Patrick Haun Date: Sun, 13 Oct 2024 18:10:37 +0200 Subject: [PATCH] feat: add gzip --- server/middleware/cache.go | 24 +++++++++++++++++++ server/middleware/gzipmiddleware.go | 36 +++++++++++++++++++++++++++++ server/server.go | 24 +++---------------- 3 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 server/middleware/cache.go create mode 100644 server/middleware/gzipmiddleware.go diff --git a/server/middleware/cache.go b/server/middleware/cache.go new file mode 100644 index 0000000..53a246e --- /dev/null +++ b/server/middleware/cache.go @@ -0,0 +1,24 @@ +package middleware + +import ( + "net/http" + "time" +) + +func CacheWhileServerIsRunning(next http.Handler) http.Handler { + startTime := time.Now().Truncate(time.Second) + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ifModifiedSince := r.Header.Get("If-Modified-Since") + if ifModifiedSince != "" { + modTime, err := time.Parse(http.TimeFormat, ifModifiedSince) + if err == nil { + if !startTime.After(modTime) { + w.WriteHeader(http.StatusNotModified) + return + } + } + } + w.Header().Set("Last-Modified", startTime.UTC().Format(http.TimeFormat)) + next.ServeHTTP(w, r) + }) +} diff --git a/server/middleware/gzipmiddleware.go b/server/middleware/gzipmiddleware.go new file mode 100644 index 0000000..80c7fb6 --- /dev/null +++ b/server/middleware/gzipmiddleware.go @@ -0,0 +1,36 @@ +package middleware + +import ( + "compress/gzip" + "io" + "net/http" + "strings" +) + + +type gzipResponseWriter struct { + io.Writer + http.ResponseWriter +} + +func (w gzipResponseWriter) Write(b []byte) (int, error) { + return w.Writer.Write(b) +} + +func GzipMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { + next.ServeHTTP(w, r) + return + } + + w.Header().Set("Content-Encoding", "gzip") + w.Header().Add("Vary", "Accept-Encoding") + + gz := gzip.NewWriter(w) + defer gz.Close() + + gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w} + next.ServeHTTP(gzw, r) + }) +} diff --git a/server/server.go b/server/server.go index f655c87..b7ed882 100644 --- a/server/server.go +++ b/server/server.go @@ -8,11 +8,11 @@ import ( "log/slog" "net/http" "os" - "time" "github.com/brocode/neoweb/components" "github.com/brocode/neoweb/key" "github.com/brocode/neoweb/nvimwrapper" + "github.com/brocode/neoweb/server/middleware" ) //go:embed static @@ -113,31 +113,13 @@ func (s *Server) getEvents(w http.ResponseWriter, r *http.Request) { slog.Info("Events client disconnected") } -func cacheWhileServerIsRunning(next http.Handler) http.Handler { - startTime := time.Now().Truncate(time.Second) - return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ifModifiedSince := r.Header.Get("If-Modified-Since") - if ifModifiedSince != "" { - modTime, err := time.Parse(http.TimeFormat, ifModifiedSince) - if err == nil { - if !startTime.After(modTime) { - w.WriteHeader(http.StatusNotModified) - return - } - } - } - w.Header().Set("Last-Modified", startTime.UTC().Format(http.TimeFormat)) - next.ServeHTTP(w, r) - }) -} - func (s *Server) Start() { mux := http.NewServeMux() - mux.Handle("GET /static/", cacheWhileServerIsRunning(http.FileServer(http.FS(staticFs)))) + mux.Handle("GET /static/", middleware.CacheWhileServerIsRunning(middleware.GzipMiddleware(http.FileServer(http.FS(staticFs))))) - mux.HandleFunc("GET /", s.getRoot) + mux.Handle("GET /", middleware.GzipMiddleware(http.HandlerFunc(s.getRoot))) mux.HandleFunc("POST /keypress", s.postKeypress)