aboutsummaryrefslogtreecommitdiff
path: root/http/handler/handler.go
diff options
context:
space:
mode:
Diffstat (limited to 'http/handler/handler.go')
-rw-r--r--http/handler/handler.go70
1 files changed, 70 insertions, 0 deletions
diff --git a/http/handler/handler.go b/http/handler/handler.go
new file mode 100644
index 00000000..3dd1d1b1
--- /dev/null
+++ b/http/handler/handler.go
@@ -0,0 +1,70 @@
+// Copyright 2017 Frédéric Guillot. All rights reserved.
+// Use of this source code is governed by the Apache 2.0
+// license that can be found in the LICENSE file.
+
+package handler
+
+import (
+ "net/http"
+ "time"
+
+ "github.com/miniflux/miniflux/config"
+ "github.com/miniflux/miniflux/http/middleware"
+ "github.com/miniflux/miniflux/locale"
+ "github.com/miniflux/miniflux/logger"
+ "github.com/miniflux/miniflux/storage"
+ "github.com/miniflux/miniflux/template"
+ "github.com/miniflux/miniflux/timer"
+
+ "github.com/gorilla/mux"
+ "github.com/tomasen/realip"
+)
+
+// ControllerFunc is an application HTTP handler.
+type ControllerFunc func(ctx *Context, request *Request, response *Response)
+
+// Handler manages HTTP handlers and middlewares.
+type Handler struct {
+ cfg *config.Config
+ store *storage.Storage
+ translator *locale.Translator
+ template *template.Engine
+ router *mux.Router
+ middleware *middleware.Chain
+}
+
+// Use is a wrapper around an HTTP handler.
+func (h *Handler) Use(f ControllerFunc) http.Handler {
+ return h.middleware.WrapFunc(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ defer timer.ExecutionTime(time.Now(), r.URL.Path)
+ logger.Debug("[HTTP] %s %s %s", realip.RealIP(r), r.Method, r.URL.Path)
+
+ if r.Header.Get("X-Forwarded-Proto") == "https" {
+ h.cfg.IsHTTPS = true
+ }
+
+ ctx := NewContext(r, h.store, h.router, h.translator)
+ request := NewRequest(r)
+ response := NewResponse(w, r, h.template)
+
+ if ctx.IsAuthenticated() {
+ h.template.SetLanguage(ctx.UserLanguage())
+ } else {
+ h.template.SetLanguage("en_US")
+ }
+
+ f(ctx, request, response)
+ }))
+}
+
+// NewHandler returns a new Handler.
+func NewHandler(cfg *config.Config, store *storage.Storage, router *mux.Router, template *template.Engine, translator *locale.Translator, middleware *middleware.Chain) *Handler {
+ return &Handler{
+ cfg: cfg,
+ store: store,
+ translator: translator,
+ router: router,
+ template: template,
+ middleware: middleware,
+ }
+}