Browse Source

Simplify application HTTP middlewares

Frédéric Guillot 7 years ago
parent
commit
5cd7152ae7

+ 0 - 21
middleware/client_ip.go

@@ -1,21 +0,0 @@
-// Copyright 2018 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 middleware // import "miniflux.app/middleware"
-
-import (
-	"context"
-	"net/http"
-
-	"miniflux.app/http/request"
-)
-
-// ClientIP stores in the real client IP address in the context.
-func (m *Middleware) ClientIP(next http.Handler) http.Handler {
-	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		ctx := r.Context()
-		ctx = context.WithValue(ctx, request.ClientIPContextKey, request.FindClientIP(r))
-		next.ServeHTTP(w, r.WithContext(ctx))
-	})
-}

+ 0 - 10
middleware/doc.go

@@ -1,10 +0,0 @@
-// Copyright 2018 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 middleware contains application HTTP middlewares.
-
-*/
-package middleware // import "miniflux.app/middleware"

+ 0 - 24
middleware/header_config.go

@@ -1,24 +0,0 @@
-// Copyright 2018 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 middleware // import "miniflux.app/middleware"
-
-import (
-	"net/http"
-)
-
-// HeaderConfig changes config values according to HTTP headers.
-func (m *Middleware) HeaderConfig(next http.Handler) http.Handler {
-	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		if r.Header.Get("X-Forwarded-Proto") == "https" {
-			m.cfg.IsHTTPS = true
-		}
-
-		if m.cfg.IsHTTPS && m.cfg.HasHSTS() {
-			w.Header().Set("Strict-Transport-Security", "max-age=31536000")
-		}
-
-		next.ServeHTTP(w, r)
-	})
-}

+ 0 - 20
middleware/logging.go

@@ -1,20 +0,0 @@
-// Copyright 2018 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 middleware // import "miniflux.app/middleware"
-
-import (
-	"net/http"
-
-	"miniflux.app/http/request"
-	"miniflux.app/logger"
-)
-
-// Logging logs the HTTP request.
-func (m *Middleware) Logging(next http.Handler) http.Handler {
-	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		logger.Debug("[HTTP] %s %s %s", request.ClientIP(r), r.Method, r.RequestURI)
-		next.ServeHTTP(w, r)
-	})
-}

+ 0 - 23
middleware/middleware.go

@@ -1,23 +0,0 @@
-// Copyright 2018 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 middleware // import "miniflux.app/middleware"
-
-import (
-	"github.com/gorilla/mux"
-	"miniflux.app/config"
-	"miniflux.app/storage"
-)
-
-// Middleware handles different middleware handlers.
-type Middleware struct {
-	cfg    *config.Config
-	store  *storage.Storage
-	router *mux.Router
-}
-
-// New returns a new middleware.
-func New(cfg *config.Config, store *storage.Storage, router *mux.Router) *Middleware {
-	return &Middleware{cfg, store, router}
-}

+ 1 - 5
service/httpd/httpd.go

@@ -16,7 +16,6 @@ import (
 	"miniflux.app/config"
 	"miniflux.app/fever"
 	"miniflux.app/logger"
-	"miniflux.app/middleware"
 	"miniflux.app/reader/feed"
 	"miniflux.app/storage"
 	"miniflux.app/ui"
@@ -137,15 +136,12 @@ func startHTTPServer(server *http.Server) {
 
 func setupHandler(cfg *config.Config, store *storage.Storage, feedHandler *feed.Handler, pool *worker.Pool) *mux.Router {
 	router := mux.NewRouter()
-	middleware := middleware.New(cfg, store, router)
 
 	if cfg.BasePath() != "" {
 		router = router.PathPrefix(cfg.BasePath()).Subrouter()
 	}
 
-	router.Use(middleware.ClientIP)
-	router.Use(middleware.HeaderConfig)
-	router.Use(middleware.Logging)
+	router.Use(newMiddleware(cfg).Serve)
 
 	fever.Serve(router, cfg, store)
 	api.Serve(router, store, feedHandler)

+ 47 - 0
service/httpd/middleware.go

@@ -0,0 +1,47 @@
+// Copyright 2018 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 httpd // import "miniflux.app/service/httpd"
+
+import (
+	"context"
+	"net/http"
+
+	"miniflux.app/config"
+	"miniflux.app/http/request"
+	"miniflux.app/logger"
+)
+
+type middleware struct {
+	cfg *config.Config
+}
+
+func newMiddleware(cfg *config.Config) *middleware {
+	return &middleware{cfg}
+}
+
+func (m *middleware) Serve(next http.Handler) http.Handler {
+	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		clientIP := request.FindClientIP(r)
+		ctx := r.Context()
+		ctx = context.WithValue(ctx, request.ClientIPContextKey, clientIP)
+
+		if r.Header.Get("X-Forwarded-Proto") == "https" {
+			m.cfg.IsHTTPS = true
+		}
+
+		protocol := "HTTP"
+		if m.cfg.IsHTTPS {
+			protocol = "HTTPS"
+		}
+
+		logger.Debug("[%s] %s %s %s", protocol, clientIP, r.Method, r.RequestURI)
+
+		if m.cfg.IsHTTPS && m.cfg.HasHSTS() {
+			w.Header().Set("Strict-Transport-Security", "max-age=31536000")
+		}
+
+		next.ServeHTTP(w, r.WithContext(ctx))
+	})
+}