in app.go [161:221]
func (a *theApp) buildHandlerPipeline() (http.Handler, error) {
// Handlers should be applied in a reverse order
handler := slowlogs.LogHandlerTiming(a.serveFileOrNotFoundHandler(), "serveFileOrNotFound")
handler = slowlogs.LogHandlerTiming(uniquedomain.NewMiddleware(handler), "UniqueDomain")
handler = slowlogs.LogHandlerTiming(primarydomain.NewMiddleware(handler), "PrimaryDomain")
handler = slowlogs.LogHandlerTiming(a.Auth.AuthorizationMiddleware(handler), "Authorization")
handler = slowlogs.LogHandlerTiming(handlers.ArtifactMiddleware(handler, a.Handlers), "Artifacts")
handler = slowlogs.LogHandlerTiming(a.Auth.AuthenticationMiddleware(handler, a.source), "Authentication")
handler = slowlogs.LogHandlerTiming(routing.NewMiddleware(handler, a.source), "Routing")
handler = slowlogs.LogHandlerTiming(handlers.AcmeMiddleware(handler, a.source, a.config.GitLab.PublicServer), "Acme")
if !a.config.General.DisableCrossOriginRequests {
handler = slowlogs.LogHandlerTiming(corsHandler.Handler(handler), "cors")
}
// Add auto redirect
handler = slowlogs.LogHandlerTiming(handlers.HTTPSRedirectMiddleware(handler, a.config.General.RedirectHTTP), "HTTPSRedirect")
handler = slowlogs.LogHandlerTiming(handlers.NewRateLimiterHandler(context.Background(), handler, &a.config.RateLimit), "RateLimiter")
// Health Check
handler = slowlogs.LogHandlerTiming(health.NewMiddleware(handler, a.config.General.StatusPath), "HealthCheck")
// Custom response headers
handler = slowlogs.LogHandlerTiming(customheaders.NewMiddleware(handler, a.config.General.CustomHeaders), "CustomHeaders")
// Access logs and metrics
handler, err := logging.BasicAccessLogger(handler, a.config.Log.Format)
if err != nil {
return nil, err
}
metricsMiddleware := labmetrics.NewHandlerFactory(labmetrics.WithNamespace("gitlab_pages"))
handler = slowlogs.LogHandlerTiming(metricsMiddleware(handler), "Metrics")
handler = slowlogs.NewMiddleware(handler, logging.LogRequest, slowlogs.SlowRequestTimeThreshold)
// Correlation ID injection middleware
var correlationOpts []correlation.InboundHandlerOption
correlationOpts = append(correlationOpts, correlation.WithSetResponseHeader())
if a.config.General.PropagateCorrelationID {
correlationOpts = append(correlationOpts, correlation.WithPropagation())
}
handler = correlation.InjectCorrelationID(handler, correlationOpts...)
handler = handlePanicMiddleware(handler)
// These middlewares MUST be added in the end.
// Being last means they will be evaluated first
// preventing any operation on bogus requests.
handler = urilimiter.NewMiddleware(handler, a.config.General.MaxURILength)
if a.config.General.NamespaceInPath {
handler = namespaceinpath.NewMiddleware(handler, a.config.General.Domain, a.config.Authentication.RedirectURI)
}
handler = rejectmethods.NewMiddleware(handler)
return handler, nil
}