add middleware stack
This commit is contained in:
@@ -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")
|
||||||
|
|||||||
@@ -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))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
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