| // Package middleware provides HTTP middleware components for the CLI Proxy API server. | |
| // This file contains correlation ID middleware for request tracing. | |
| package middleware | |
| import ( | |
| "github.com/gin-gonic/gin" | |
| "github.com/google/uuid" | |
| ) | |
| const ( | |
| // CorrelationIDHeader is the HTTP header name for correlation IDs | |
| CorrelationIDHeader = "X-Correlation-ID" | |
| // CorrelationIDContextKey is the context key for correlation IDs | |
| CorrelationIDContextKey = "correlation_id" | |
| ) | |
| // CorrelationIDMiddleware creates a Gin middleware that ensures every request | |
| // has a correlation ID for distributed tracing. It checks for an existing ID | |
| // in the request headers and generates a new one if not present. | |
| func CorrelationIDMiddleware() gin.HandlerFunc { | |
| return func(c *gin.Context) { | |
| // Check for existing correlation ID in header | |
| correlationID := c.GetHeader(CorrelationIDHeader) | |
| // Generate new ID if not present | |
| if correlationID == "" { | |
| correlationID = generateCorrelationID() | |
| } | |
| // Store in context | |
| c.Set(CorrelationIDContextKey, correlationID) | |
| // Add to response headers | |
| c.Header(CorrelationIDHeader, correlationID) | |
| c.Next() | |
| } | |
| } | |
| // GetCorrelationID retrieves the correlation ID from the Gin context. | |
| // Returns empty string if no correlation ID is found. | |
| func GetCorrelationID(c *gin.Context) string { | |
| if id, exists := c.Get(CorrelationIDContextKey); exists { | |
| if str, ok := id.(string); ok { | |
| return str | |
| } | |
| } | |
| return "" | |
| } | |
| // generateCorrelationID generates a new unique correlation ID. | |
| func generateCorrelationID() string { | |
| return uuid.New().String() | |
| } | |