middlewares system added

master
serr 2025-04-05 22:13:37 +03:00
parent 3a31598602
commit 0b354f22d3
2 changed files with 46 additions and 3 deletions

11
main.go
View File

@ -50,15 +50,20 @@ func setupRoutesAndRun(a *models.App) error {
func setupRoutes(a *models.App) *http.ServeMux {
router := http.NewServeMux()
// middlewares
m := controllers.MiddlewaresChain(
controllers.LoggingMiddleware,
)
// Обработка статических файлов с кэшированием
router.Handle(a.Config.AssetsPath, controllers.StaticHandler())
router.Handle(a.Config.AssetsPath, m(controllers.StaticHandler()))
// Странички
{
// Обработка главной страницы (русская версия)
router.Handle("/ru/", controllers_pages.MainRuPageHandler(a))
router.Handle("/ru/", m(controllers_pages.MainRuPageHandler(a)))
// Обработка главной страницы
router.Handle("/", controllers_pages.MainPageHandler(a))
router.Handle("/", m(controllers_pages.MainPageHandler(a)))
}
return router

View File

@ -0,0 +1,38 @@
package controllers
import (
"log"
"net/http"
"time"
)
type Middleware func(http.Handler) http.Handler
/*
Возвращает один middleware, который объединяет все переданные
MiddlewaresChain(m1, m2, m3)
= func(next http.Handler) http.Handler { return m1(m2(m3(final))) }
MiddlewaresChain(LoggingMiddleware)
= func(next http.Handler) http.Handler { return LoggingMiddleware(final http.Handler) }
*/
func MiddlewaresChain(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()
log.Printf("Started %s %s", r.Method, r.URL.Path)
next.ServeHTTP(w, r)
log.Printf("Completed %s in %v", r.URL.Path, time.Since(start))
})
}