package middleware import ( "context" "net/http" "github.com/gin-gonic/gin" ) // GetRequestIDFromContext extrait le request_id depuis le contexte Gin ou Go // Essaie d'abord le contexte Gin, puis le contexte Go standard func GetRequestIDFromContext(c *gin.Context) string { // Essayer depuis le contexte Gin if requestID, exists := c.Get("request_id"); exists { if id, ok := requestID.(string); ok && id != "" { return id } } return "" } // GetRequestIDFromGoContext extrait le request_id depuis un contexte Go standard func GetRequestIDFromGoContext(ctx context.Context) string { // Le request_id peut être stocké dans le contexte Go avec une clé spécifique if requestID := ctx.Value("request_id"); requestID != nil { if id, ok := requestID.(string); ok { return id } } return "" } // PropagateRequestID ajoute le header X-Request-ID à une requête HTTP sortante // si le request_id est disponible dans le contexte func PropagateRequestID(c *gin.Context, req *http.Request) { requestID := GetRequestIDFromContext(c) if requestID != "" { req.Header.Set("X-Request-ID", requestID) } // Propager aussi le trace_id si disponible if traceID := GetTraceID(c); traceID != "" { req.Header.Set("X-Trace-ID", traceID) } // Propager aussi le span_id si disponible if spanID := GetSpanID(c); spanID != "" { req.Header.Set("X-Span-ID", spanID) } } // PropagateRequestIDFromContext ajoute le header X-Request-ID à une requête HTTP sortante // depuis un contexte Go standard func PropagateRequestIDFromContext(ctx context.Context, req *http.Request) { requestID := GetRequestIDFromGoContext(ctx) if requestID != "" { req.Header.Set("X-Request-ID", requestID) } // Propager aussi le trace_id si disponible (via tracing package) // Note: Cette fonctionnalité nécessiterait l'import du package tracing // Pour l'instant, on se concentre sur le request_id }