add middleware stack
This commit is contained in:
@@ -19,10 +19,15 @@ func main() {
|
||||
// define app
|
||||
webapp := app.NewApp(db)
|
||||
|
||||
// create middle
|
||||
stack := middleware.CreateStack(
|
||||
middleware.Logging,
|
||||
)
|
||||
|
||||
// start web server
|
||||
server := http.Server{
|
||||
Addr: ":8080",
|
||||
Handler: middleware.Logging(webapp.Routes()),
|
||||
Handler: stack(webapp.Routes()),
|
||||
}
|
||||
|
||||
log.Println("server started, listening on :8080")
|
||||
|
||||
@@ -6,14 +6,30 @@ import (
|
||||
"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.
|
||||
func Logging(next http.Handler) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
start := time.Now()
|
||||
|
||||
// Call the next handler
|
||||
next.ServeHTTP(w, r)
|
||||
wrapped := &wrappedWriter{
|
||||
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))
|
||||
})
|
||||
}
|
||||
|
||||
15
src/internal/middleware/middleware.go
Normal file
15
src/internal/middleware/middleware.go
Normal 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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user