hikan.ru/mvc/controllers/middlewares.go

44 lines
1.0 KiB
Go

package controllers
import (
"log"
"net/http"
"time"
)
type Middleware func(http.Handler) http.Handler
var (
MiddlewaresChain = CreateMiddlewaresChain(
LoggingMiddleware,
)
)
/*
Возвращает один middleware, который объединяет все переданные
CreateMiddlewaresChain(m1, m2, m3)
= func(next http.Handler) http.Handler { return m1(m2(m3(final))) }
CreateMiddlewaresChain(LoggingMiddleware)
= func(next http.Handler) http.Handler { return LoggingMiddleware(final) }
*/
func CreateMiddlewaresChain(middlewares ...Middleware) Middleware {
return func(final http.Handler) http.Handler {
for i := len(middlewares) - 1; i >= 0; i-- {
final = middlewares[i](final)
}
return final
}
}
func LoggingMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
next.ServeHTTP(w, r)
log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
})
}