Skip to content

Instantly share code, notes, and snippets.

@utkuozdemir
Created April 9, 2025 08:25
Show Gist options
  • Save utkuozdemir/95a0f5d9321c17de7d4a2f4831936006 to your computer and use it in GitHub Desktop.
Save utkuozdemir/95a0f5d9321c17de7d4a2f4831936006 to your computer and use it in GitHub Desktop.
First MUX, then middlewares
package main
import (
"log"
"net/http"
)
func main() {
if err := rightWay(); err != nil {
panic(err)
}
}
func wrongWay() error {
middleware1 := func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
log.Printf("middleware 1: %s", request.PathValue("user"))
next.ServeHTTP(writer, request)
})
}
middleware2 := func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
log.Printf("middleware 2: %s", request.PathValue("user"))
next.ServeHTTP(writer, request)
})
}
mux := http.NewServeMux()
mux.Handle("/hello/{user}", http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("Hello, " + request.PathValue("user")))
}))
return http.ListenAndServe(":8080", middleware1(middleware2(mux)))
}
func rightWay() error {
middleware1 := func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
log.Printf("middleware 1: %s", request.PathValue("user"))
next.ServeHTTP(writer, request)
})
}
middleware2 := func(next http.Handler) http.Handler {
return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
log.Printf("middleware 2: %s", request.PathValue("user"))
next.ServeHTTP(writer, request)
})
}
buildHandlerWithMiddlewares := func(fn func(writer http.ResponseWriter, request *http.Request)) http.Handler {
return middleware1(middleware2(http.HandlerFunc(fn)))
}
mux := http.NewServeMux()
mux.Handle("/hello/{user}", buildHandlerWithMiddlewares(func(writer http.ResponseWriter, request *http.Request) {
writer.Write([]byte("Hello, " + request.PathValue("user")))
}))
return http.ListenAndServe(":8080", mux)
}
@utkuozdemir
Copy link
Author

Test with

curl localhost:8080/hello/utku

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment