2022-07-17 12:37:23 +08:00
|
|
|
package internal
|
2022-07-16 14:11:34 +08:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"net/http"
|
|
|
|
|
"strings"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
metadataHeaderPrefix = "Grpc-Metadata-"
|
|
|
|
|
metadataPrefix = "gateway-"
|
|
|
|
|
)
|
|
|
|
|
|
2025-10-25 12:16:31 +08:00
|
|
|
// OpenTelemetry trace propagation headers that need to be forwarded to gRPC metadata.
|
|
|
|
|
// These headers are used by the W3C Trace Context standard for distributed tracing.
|
|
|
|
|
var traceHeaders = map[string]bool{
|
|
|
|
|
"traceparent": true,
|
|
|
|
|
"tracestate": true,
|
|
|
|
|
"baggage": true,
|
|
|
|
|
}
|
|
|
|
|
|
2022-07-17 23:21:19 +08:00
|
|
|
// ProcessHeaders builds the headers for the gateway from HTTP headers.
|
2025-10-25 12:16:31 +08:00
|
|
|
// It forwards both custom metadata headers (with Grpc-Metadata- prefix)
|
|
|
|
|
// and OpenTelemetry trace propagation headers (traceparent, tracestate, baggage)
|
|
|
|
|
// to ensure distributed tracing works correctly across the gateway.
|
2022-07-17 23:21:19 +08:00
|
|
|
func ProcessHeaders(header http.Header) []string {
|
2022-07-16 14:11:34 +08:00
|
|
|
var headers []string
|
|
|
|
|
|
|
|
|
|
for k, v := range header {
|
2025-10-25 12:16:31 +08:00
|
|
|
// Forward OpenTelemetry trace propagation headers
|
|
|
|
|
// These must be lowercase per gRPC metadata conventions
|
|
|
|
|
if lowerKey := strings.ToLower(k); traceHeaders[lowerKey] {
|
|
|
|
|
for _, vv := range v {
|
|
|
|
|
headers = append(headers, lowerKey+":"+vv)
|
|
|
|
|
}
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Forward custom metadata headers with Grpc-Metadata- prefix
|
2022-07-16 14:11:34 +08:00
|
|
|
if !strings.HasPrefix(k, metadataHeaderPrefix) {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
|
2025-10-25 12:16:31 +08:00
|
|
|
// gRPC metadata keys are case-insensitive and stored as lowercase,
|
|
|
|
|
// so we lowercase the key to match gRPC conventions
|
|
|
|
|
trimmedKey := strings.TrimPrefix(k, metadataHeaderPrefix)
|
|
|
|
|
key := strings.ToLower(fmt.Sprintf("%s%s", metadataPrefix, trimmedKey))
|
2022-07-16 14:11:34 +08:00
|
|
|
for _, vv := range v {
|
|
|
|
|
headers = append(headers, key+":"+vv)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return headers
|
|
|
|
|
}
|