aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJP Appel <jeanpierre.appel01@gmail.com>2024-10-09 16:03:12 -0400
committerJP Appel <jeanpierre.appel01@gmail.com>2024-10-09 16:03:12 -0400
commit17e269202ba01e8467a87163395a1e6ac8261e02 (patch)
tree38a4698f8789268a935c133d004f2bb9f7b0d81a
parenta1af12ca8bf93a14b3017aa463a9463eaa4f1188 (diff)
Refactor middleware to separate package
-rw-r--r--middleware/gzip.go56
-rw-r--r--middleware/middleware.go12
-rw-r--r--middleware/timeout.go17
-rw-r--r--nonsense-time.go67
4 files changed, 88 insertions, 64 deletions
diff --git a/middleware/gzip.go b/middleware/gzip.go
new file mode 100644
index 0000000..2ceb77e
--- /dev/null
+++ b/middleware/gzip.go
@@ -0,0 +1,56 @@
+package middleware
+
+import (
+ "compress/gzip"
+ "net/http"
+ "strings"
+)
+
+type gzipResponseWriter struct {
+ gzip.Writer
+ http.ResponseWriter
+}
+
+func newGzipResponseWriter(w http.ResponseWriter) *gzipResponseWriter {
+ gzrw := new(gzipResponseWriter)
+ gzrw.Writer = *gzip.NewWriter(w)
+ gzrw.ResponseWriter = w
+
+ return gzrw
+}
+
+func (gzrw *gzipResponseWriter) Close() error {
+ return gzrw.Writer.Close()
+}
+
+func (gzrw *gzipResponseWriter) Header() http.Header {
+ return gzrw.ResponseWriter.Header()
+}
+
+func (gzrw *gzipResponseWriter) Write(p []byte) (int, error) {
+ n, err := gzrw.Writer.Write(p)
+ return n, err
+}
+
+func (gzrw *gzipResponseWriter) WriteHeader(statuscode int) {
+ gzrw.ResponseWriter.WriteHeader(statuscode)
+}
+
+// Middleware to conditionally gzip a response
+func Gzip(next http.Handler) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ acceptedEncodings := r.Header.Get("Accept-Encoding")
+
+ if !strings.Contains(acceptedEncodings, "gzip") {
+ Logger.DebugContext(r.Context(), "Using gzip middleware but client does not support gzip encoding")
+ next.ServeHTTP(w, r)
+ return
+ }
+
+ w.Header().Add("Content-Encoding", "gzip")
+ gzrw := newGzipResponseWriter(w)
+ defer gzrw.Close()
+
+ next.ServeHTTP(gzrw, r)
+ })
+}
diff --git a/middleware/middleware.go b/middleware/middleware.go
new file mode 100644
index 0000000..b1f3b52
--- /dev/null
+++ b/middleware/middleware.go
@@ -0,0 +1,12 @@
+package middleware
+
+import (
+ "log/slog"
+ "os"
+)
+
+var Logger *slog.Logger
+
+func init(){
+ Logger = slog.New(slog.NewTextHandler(os.Stdout, nil))
+}
diff --git a/middleware/timeout.go b/middleware/timeout.go
new file mode 100644
index 0000000..6a3f5de
--- /dev/null
+++ b/middleware/timeout.go
@@ -0,0 +1,17 @@
+package middleware
+
+import (
+ "context"
+ "net/http"
+ "time"
+)
+
+// Middleware to timeout requests after a given duration
+func Timeout(next http.Handler, duration time.Duration) http.Handler {
+ return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ ctx, cancel := context.WithTimeout(r.Context(), duration)
+ defer cancel()
+
+ next.ServeHTTP(w, r.WithContext(ctx))
+ })
+}
diff --git a/nonsense-time.go b/nonsense-time.go
index 4bb1067..f148266 100644
--- a/nonsense-time.go
+++ b/nonsense-time.go
@@ -1,79 +1,18 @@
package main
import (
- "compress/gzip"
- "context"
"flag"
"fmt"
"log/slog"
"net/http"
"nonsense-time/api"
+ "nonsense-time/middleware"
"os"
- "strings"
"time"
)
var logger *slog.Logger
-// Middleware to timeout requests after a given duration
-func timeoutMiddleware(next http.Handler, duration time.Duration) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- ctx, cancel := context.WithTimeout(r.Context(), duration)
- defer cancel()
-
- next.ServeHTTP(w, r.WithContext(ctx))
- })
-}
-
-type gzipResponseWriter struct {
- gzip.Writer
- http.ResponseWriter
-}
-
-func newGzipResponseWriter(w http.ResponseWriter) *gzipResponseWriter {
- gzrw := new(gzipResponseWriter)
- gzrw.Writer = *gzip.NewWriter(w)
- gzrw.ResponseWriter = w
-
- return gzrw
-}
-
-func (gzrw *gzipResponseWriter) Close() error {
- return gzrw.Writer.Close()
-}
-
-func (gzrw *gzipResponseWriter) Header() http.Header {
- return gzrw.ResponseWriter.Header()
-}
-
-func (gzrw *gzipResponseWriter) Write(p []byte) (int, error) {
- n, err := gzrw.Writer.Write(p)
- return n, err
-}
-
-func (gzrw *gzipResponseWriter) WriteHeader(statuscode int) {
- gzrw.ResponseWriter.WriteHeader(statuscode)
-}
-
-// Middleware to conditionally gzip a response
-func gzipMiddleware(next http.Handler) http.Handler {
- return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- acceptedEncodings := r.Header.Get("Accept-Encoding")
-
- if !strings.Contains(acceptedEncodings, "gzip") {
- logger.DebugContext(r.Context(), "Using gzip middleware but client does not support gzip encoding")
- next.ServeHTTP(w, r)
- return
- }
-
- w.Header().Add("Content-Encoding", "gzip")
- gzrw := newGzipResponseWriter(w)
- defer gzrw.Close()
-
- next.ServeHTTP(gzrw, r)
- })
-}
-
func main() {
port := flag.Int("p", 8080, "the port to listen on")
@@ -111,8 +50,8 @@ func main() {
api.Logger = logger
- vtt := timeoutMiddleware(http.HandlerFunc(api.VttOnline), *waitTime)
- vttLogs := gzipMiddleware(http.HandlerFunc(api.VttLogs))
+ vtt := middleware.Timeout(http.HandlerFunc(api.VttOnline), *waitTime)
+ vttLogs := middleware.Gzip(http.HandlerFunc(api.VttLogs))
mux.Handle("GET /vtt/status", vtt)
mux.HandleFunc("GET /vtt", api.VttRedirect)