diff --git a/internal/server/handler.go b/internal/server/handler.go index 874cd995..4788e4e5 100644 --- a/internal/server/handler.go +++ b/internal/server/handler.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/server/middlewares/log" ) func newHandler(ctx context.Context, logger infoWarner, logging bool, @@ -17,7 +18,7 @@ func newHandler(ctx context.Context, logger infoWarner, logging bool, publicIPLooper PublicIPLoop, storage Storage, ipv6Supported bool, -) http.Handler { +) (httpHandler http.Handler) { handler := &handler{} vpn := newVPNHandler(ctx, vpnLooper, storage, ipv6Supported, logger) @@ -29,16 +30,19 @@ func newHandler(ctx context.Context, logger infoWarner, logging bool, handler.v0 = newHandlerV0(ctx, logger, vpnLooper, dnsLooper, updaterLooper) handler.v1 = newHandlerV1(logger, buildInfo, vpn, openvpn, dns, updater, publicip) - handlerWithLog := withLogMiddleware(handler, logger, logging) - handler.setLogEnabled = handlerWithLog.setEnabled - - return handlerWithLog + middlewares := []func(http.Handler) http.Handler{ + log.New(logger, logging), + } + httpHandler = handler + for _, middleware := range middlewares { + httpHandler = middleware(httpHandler) + } + return httpHandler } type handler struct { - v0 http.Handler - v1 http.Handler - setLogEnabled func(enabled bool) + v0 http.Handler + v1 http.Handler } func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { diff --git a/internal/server/middlewares/log/interfaces.go b/internal/server/middlewares/log/interfaces.go new file mode 100644 index 00000000..6a6c62dc --- /dev/null +++ b/internal/server/middlewares/log/interfaces.go @@ -0,0 +1,5 @@ +package log + +type Logger interface { + Info(message string) +} diff --git a/internal/server/log.go b/internal/server/middlewares/log/middleware.go similarity index 80% rename from internal/server/log.go rename to internal/server/middlewares/log/middleware.go index c70dce46..adfa9196 100644 --- a/internal/server/log.go +++ b/internal/server/middlewares/log/middleware.go @@ -1,4 +1,4 @@ -package server +package log import ( "net/http" @@ -7,18 +7,21 @@ import ( "time" ) -func withLogMiddleware(childHandler http.Handler, logger infoer, enabled bool) *logMiddleware { - return &logMiddleware{ - childHandler: childHandler, - logger: logger, - timeNow: time.Now, - enabled: enabled, +func New(logger Logger, enabled bool) ( + middleware func(http.Handler) http.Handler) { + return func(handler http.Handler) http.Handler { + return &logMiddleware{ + childHandler: handler, + logger: logger, + timeNow: time.Now, + enabled: enabled, + } } } type logMiddleware struct { childHandler http.Handler - logger infoer + logger Logger timeNow func() time.Time enabled bool enabledMu sync.RWMutex @@ -39,7 +42,7 @@ func (m *logMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { r.RemoteAddr + " in " + duration.String()) } -func (m *logMiddleware) setEnabled(enabled bool) { +func (m *logMiddleware) SetEnabled(enabled bool) { m.enabledMu.Lock() defer m.enabledMu.Unlock() m.enabled = enabled