// Package headers Middleware based on https://github.com/unrolled/secure. package headers import ( "context" "errors" "net/http" "github.com/traefik/traefik/v3/pkg/config/dynamic" "github.com/traefik/traefik/v3/pkg/middlewares" "github.com/traefik/traefik/v3/pkg/middlewares/connectionheader" "go.opentelemetry.io/otel/trace" ) const ( typeName = "Headers" ) type headers struct { name string handler http.Handler } // New creates a Headers middleware. func New(ctx context.Context, next http.Handler, cfg dynamic.Headers, name string) (http.Handler, error) { // HeaderMiddleware -> SecureMiddleWare -> next logger := middlewares.GetLogger(ctx, name, typeName) logger.Debug().Msg("Creating middleware") hasSecureHeaders := cfg.HasSecureHeadersDefined() hasCustomHeaders := cfg.HasCustomHeadersDefined() hasCorsHeaders := cfg.HasCorsHeadersDefined() if !hasSecureHeaders && !hasCustomHeaders && !hasCorsHeaders { return nil, errors.New("headers configuration not valid") } var handler http.Handler nextHandler := next if hasSecureHeaders { logger.Debug().Msgf("Setting up secureHeaders from %v", cfg) handler = newSecure(next, cfg, name) nextHandler = handler } if hasCustomHeaders || hasCorsHeaders { logger.Debug().Msgf("Setting up customHeaders/Cors from %v", cfg) h, err := NewHeader(nextHandler, cfg) if err != nil { return nil, err } handler = connectionheader.Remover(h) } return &headers{ handler: handler, name: name, }, nil } func (h *headers) GetTracingInformation() (string, string, trace.SpanKind) { return h.name, typeName, trace.SpanKindInternal } func (h *headers) ServeHTTP(rw http.ResponseWriter, req *http.Request) { h.handler.ServeHTTP(rw, req) }