add middleware stack

This commit is contained in:
2025-01-11 19:28:53 +01:00
parent 20edc0f2f9
commit ddacf8e5aa
3 changed files with 40 additions and 4 deletions

View File

@@ -19,10 +19,15 @@ func main() {
// define app // define app
webapp := app.NewApp(db) webapp := app.NewApp(db)
// create middle
stack := middleware.CreateStack(
middleware.Logging,
)
// start web server // start web server
server := http.Server{ server := http.Server{
Addr: ":8080", Addr: ":8080",
Handler: middleware.Logging(webapp.Routes()), Handler: stack(webapp.Routes()),
} }
log.Println("server started, listening on :8080") log.Println("server started, listening on :8080")

View File

@@ -6,14 +6,30 @@ import (
"time" "time"
) )
type wrappedWriter struct {
http.ResponseWriter
statusCode int
}
func (w *wrappedWriter) WriteHeader(statusCode int) {
w.ResponseWriter.WriteHeader(statusCode)
w.statusCode = statusCode
}
// LoggingMiddleware logs details about each incoming HTTP request. // LoggingMiddleware logs details about each incoming HTTP request.
func Logging(next http.Handler) http.Handler { func Logging(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now() start := time.Now()
// Call the next handler wrapped := &wrappedWriter{
next.ServeHTTP(w, r) ResponseWriter: w,
statusCode: http.StatusOK,
}
log.Printf("[request] %s %s from %s (%v)", r.URL.Path, r.Method, r.RemoteAddr, time.Since(start)) // Call the next handler
next.ServeHTTP(wrapped, r)
log.Printf("[request] %d %s %s from %s (%v)",
wrapped.statusCode, r.Method, r.URL.Path, r.RemoteAddr, time.Since(start))
}) })
} }

View File

@@ -0,0 +1,15 @@
package middleware
import "net/http"
type Middleware func(http.Handler) http.Handler
func CreateStack(xs ...Middleware) Middleware {
return func(next http.Handler) http.Handler {
for i := len(xs) - 1; i >= 0; i-- {
x := xs[i]
next = x(next)
}
return next
}
}