diff options
author | 2018-01-02 22:04:48 -0800 | |
---|---|---|
committer | 2018-01-02 22:04:48 -0800 | |
commit | 320d1b016747ba4501da9417d9ce5f99368a5768 (patch) | |
tree | 1054d96afde6022951b76cc4a09b78e1e3f05058 /http/handler/handler.go | |
parent | c39f2e1a8d2de6d412bcc673d29eb0f7a2d1f5f7 (diff) | |
download | v2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.gz v2-320d1b016747ba4501da9417d9ce5f99368a5768.tar.zst v2-320d1b016747ba4501da9417d9ce5f99368a5768.zip |
Refactor packages to have more idiomatic code base
Diffstat (limited to 'http/handler/handler.go')
-rw-r--r-- | http/handler/handler.go | 70 |
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, + } +} |