From f2b1e44aaa8625242e1eb74257a599198ca33b57 Mon Sep 17 00:00:00 2001 From: Pedro Correa Date: Fri, 16 May 2025 16:24:00 -0300 Subject: [PATCH] :sparkles: middleware to validate query param and create request id --- go.mod | 2 ++ go.sum | 2 ++ main.go | 8 ++++++-- middleware.go | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 middleware.go diff --git a/go.mod b/go.mod index e5b9489..b755574 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module github.com/Tulkdan/go-sse go 1.24.2 + +require github.com/google/uuid v1.6.0 diff --git a/go.sum b/go.sum index e69de29..7790d7c 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= diff --git a/main.go b/main.go index b49661e..bc9c432 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "log" "net/http" ) @@ -9,11 +10,14 @@ func main() { pubsub := NewPubSub() r := &http.ServeMux{} - r.HandleFunc("GET /subscribe", pubsub.HandleSubscribe) - r.HandleFunc("POST /publish", pubsub.HandlePublish) + r.HandleFunc("GET /subscribe", middlewareRequestId(middlewareTopicQueryParam(pubsub.HandleSubscribe))) + r.HandleFunc("POST /publish", middlewareRequestId(middlewareTopicQueryParam(pubsub.HandlePublish))) server := http.Server{Addr: ":8000", Handler: r} + fmt.Println("Starting server on 0.0.0.0:8000") if err := server.ListenAndServe(); err != nil { log.Fatal(err) + } else { + fmt.Println("Killing server") } } diff --git a/middleware.go b/middleware.go new file mode 100644 index 0000000..014e483 --- /dev/null +++ b/middleware.go @@ -0,0 +1,32 @@ +package main + +import ( + "context" + "errors" + "net/http" + + "github.com/google/uuid" +) + +func middlewareTopicQueryParam(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + topicName := r.URL.Query().Get("topic") + if topicName == "" { + http.Error(w, errors.New("Missing 'topic' query param").Error(), http.StatusBadRequest) + return + } + + next.ServeHTTP(w, r) + } +} + +func middlewareRequestId(next http.HandlerFunc) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + id, _ := uuid.NewV7() + + ctx := context.WithValue(r.Context(), "REQUEST_ID", id.String()) + r = r.WithContext(ctx) + + next.ServeHTTP(w, r) + } +} -- 2.51.2