From ef3410470ad1deab701d2bd9745ee4371a37904c Mon Sep 17 00:00:00 2001 From: unintendedfraud Date: Thu, 7 Mar 2024 02:25:55 +0100 Subject: [PATCH] simple server with middlewares --- channels/main.go | 4 ++++ context/http.go | 2 ++ context/main.go | 38 ++++++++++++++++++++++++++++++++++++++ context/server.go | 33 +++++++++++++++++++++++++++++++++ go.mod | 3 +++ 5 files changed, 80 insertions(+) create mode 100644 channels/main.go create mode 100644 context/http.go create mode 100644 context/main.go create mode 100644 context/server.go create mode 100644 go.mod diff --git a/channels/main.go b/channels/main.go new file mode 100644 index 0000000..da29a2c --- /dev/null +++ b/channels/main.go @@ -0,0 +1,4 @@ +package main + +func main() { +} diff --git a/context/http.go b/context/http.go new file mode 100644 index 0000000..c9ecbf5 --- /dev/null +++ b/context/http.go @@ -0,0 +1,2 @@ +package main + diff --git a/context/main.go b/context/main.go new file mode 100644 index 0000000..615e675 --- /dev/null +++ b/context/main.go @@ -0,0 +1,38 @@ +package main + +import ( + "fmt" + "math/rand" + "net/http" +) + +const PORT = 8080 + +func main() { + server := Server{} + + server.Handle( + "/get-random-number", + printHello, + handleGetRandomNumber, + ) + + if err := server.Listen(PORT); err != nil { + panic(err) + } + fmt.Println("listening on :", PORT) +} + +func handleGetRandomNumber(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Println("Random number: ", rand.Int()) + }) +} + +func printHello(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + fmt.Println("hello") + + next.ServeHTTP(w, r) + }) +} diff --git a/context/server.go b/context/server.go new file mode 100644 index 0000000..a8aa1f0 --- /dev/null +++ b/context/server.go @@ -0,0 +1,33 @@ +package main + +import ( + "fmt" + "net/http" +) + +type ServerHandler func(http.Handler) http.Handler + +type Server struct { +} + +func (s Server) Handle(addr string, handlers ...ServerHandler) { + http.Handle(addr, handleMiddlewares(handlers)) +} + +func (s Server) Listen(port int) error { + if err := http.ListenAndServe(fmt.Sprintf(":%d", port), nil); err != nil { + return fmt.Errorf("server broke: %s", err.Error()) + } + + return nil +} + +func handleMiddlewares(handlers []ServerHandler) http.Handler { + var handler http.Handler + + for i := range handlers { + handler = handlers[len(handlers)-1-i](handler) + } + + return handler +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..8d8a75f --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module goplayground + +go 1.22.0