fix(middleware): define middleware in a more streamlined way

This commit is contained in:
2024-11-20 09:49:48 +01:00
committed by Tim Wundenberg
parent 003ccbe035
commit 9ab78b6cc8
5 changed files with 33 additions and 13 deletions

View File

@@ -35,5 +35,9 @@ func GetHandler(d *sql.DB, serverSettings *types.ServerSettings) http.Handler {
authHandler.handle(router) authHandler.handle(router)
return middleware.Logging(middleware.ContentSecurityPolicy(middleware.EnableCors(serverSettings, router))) return middleware.Wrapper(
router,
middleware.Log,
middleware.ContentSecurityPolicy,
middleware.Cors(serverSettings))
} }

View File

@@ -5,6 +5,8 @@ import "net/http"
func ContentSecurityPolicy(next http.Handler) http.Handler { func ContentSecurityPolicy(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// While this value can be overridden, it can't be moved to after the next.ServeHTTP call,
// because if the response writer get's closed, the headers can't be set anymore
w.Header().Set("Content-Security-Policy", "default-src 'self' https://umami.me-fit.eu") w.Header().Set("Content-Security-Policy", "default-src 'self' https://umami.me-fit.eu")
next.ServeHTTP(w, r) next.ServeHTTP(w, r)

View File

@@ -6,17 +6,18 @@ import (
"net/http" "net/http"
) )
func EnableCors(serverSettings *types.ServerSettings, next http.Handler) http.Handler { func Cors(serverSettings *types.ServerSettings) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Access-Control-Allow-Origin", serverSettings.BaseUrl)
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, DELETE")
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { if r.Method == "OPTIONS" {
w.Header().Set("Access-Control-Allow-Origin", serverSettings.BaseUrl) w.WriteHeader(http.StatusOK)
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, DELETE") return
}
if r.Method == "OPTIONS" { next.ServeHTTP(w, r)
w.WriteHeader(http.StatusOK) })
return }
}
next.ServeHTTP(w, r)
})
} }

View File

@@ -30,7 +30,7 @@ func (w *WrappedWriter) WriteHeader(code int) {
w.StatusCode = code w.StatusCode = code
} }
func Logging(next http.Handler) http.Handler { func Log(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now() start := time.Now()

13
middleware/wrapper.go Normal file
View File

@@ -0,0 +1,13 @@
package middleware
import "net/http"
func Wrapper(next http.Handler, handlers ...func(http.Handler) http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
lastHandler := next
for i := len(handlers) - 1; i >= 0; i-- {
lastHandler = handlers[i](lastHandler)
}
lastHandler.ServeHTTP(w, r)
})
}