From 0b354f22d389d59f63755c30fee17e961f5fd3c7 Mon Sep 17 00:00:00 2001 From: serr Date: Sat, 5 Apr 2025 22:13:37 +0300 Subject: [PATCH] middlewares system added --- main.go | 11 +++++++--- mvc/controllers/middlewares.go | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 mvc/controllers/middlewares.go diff --git a/main.go b/main.go index d2f7edf..656ab99 100644 --- a/main.go +++ b/main.go @@ -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 diff --git a/mvc/controllers/middlewares.go b/mvc/controllers/middlewares.go new file mode 100644 index 0000000..0078a86 --- /dev/null +++ b/mvc/controllers/middlewares.go @@ -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)) + }) +}