mirror of
https://github.com/warmbly/warmbly.git
synced 2026-08-19 16:01:16 +00:00
48 lines
1.0 KiB
Go
48 lines
1.0 KiB
Go
package middleware
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
const (
|
|
RequestIDContextKey = "request_id"
|
|
RequestIDHeader = "X-Request-Id"
|
|
)
|
|
|
|
// RequestIDMiddleware attaches a stable request ID to every request and
|
|
// response. Clients may provide one for cross-system tracing; invalid or
|
|
// oversized values are replaced so logs and responses stay safe.
|
|
func RequestIDMiddleware() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
requestID := sanitizeRequestID(c.GetHeader(RequestIDHeader))
|
|
if requestID == "" {
|
|
requestID = uuid.NewString()
|
|
}
|
|
|
|
c.Set(RequestIDContextKey, requestID)
|
|
c.Header(RequestIDHeader, requestID)
|
|
c.Next()
|
|
}
|
|
}
|
|
|
|
func sanitizeRequestID(value string) string {
|
|
value = strings.TrimSpace(value)
|
|
if value == "" || len(value) > 128 {
|
|
return ""
|
|
}
|
|
for _, r := range value {
|
|
switch {
|
|
case r >= 'a' && r <= 'z':
|
|
case r >= 'A' && r <= 'Z':
|
|
case r >= '0' && r <= '9':
|
|
case r == '-' || r == '_' || r == '.' || r == ':':
|
|
default:
|
|
return ""
|
|
}
|
|
}
|
|
return value
|
|
}
|