From 3b8052afab35d2e97eb0cb2322c120d9809feeeb Mon Sep 17 00:00:00 2001 From: Yousuk Seung Date: Fri, 11 Apr 2025 10:05:55 -0700 Subject: [PATCH] ringhash: normalize uppercase in requestHashHeader from service config With gRFC A76 (#8159), when requestHashHeader is specified from the service config it fails the validation since MD keys with uppercase letters are normalized to lowercase. We should normalize the parsed value before validation. --- xds/internal/balancer/ringhash/config.go | 1 + xds/internal/balancer/ringhash/config_test.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/xds/internal/balancer/ringhash/config.go b/xds/internal/balancer/ringhash/config.go index eaa6ca233d45..044d698a27bc 100644 --- a/xds/internal/balancer/ringhash/config.go +++ b/xds/internal/balancer/ringhash/config.go @@ -73,6 +73,7 @@ func parseConfig(c json.RawMessage) (*LBConfig, error) { cfg.RequestHashHeader = "" } if cfg.RequestHashHeader != "" { + cfg.RequestHashHeader = strings.ToLower(cfg.RequestHashHeader) // See rules in https://github.com/grpc/proposal/blob/master/A76-ring-hash-improvements.md#explicitly-setting-the-request-hash-key if err := metadata.ValidateKey(cfg.RequestHashHeader); err != nil { return nil, fmt.Errorf("invalid requestHashHeader %q: %v", cfg.RequestHashHeader, err) diff --git a/xds/internal/balancer/ringhash/config_test.go b/xds/internal/balancer/ringhash/config_test.go index 9588a8984c6e..b3772e4574d7 100644 --- a/xds/internal/balancer/ringhash/config_test.go +++ b/xds/internal/balancer/ringhash/config_test.go @@ -118,6 +118,16 @@ func (s) TestParseConfig(t *testing.T) { RequestHashHeader: "x-foo", }, }, + { + name: "request metadata key set with uppercase letters", + js: `{"requestHashHeader": "x-FOO"}`, + requestHeaderEnvVar: true, + want: &LBConfig{ + MinRingSize: defaultMinSize, + MaxRingSize: defaultMaxSize, + RequestHashHeader: "x-foo", + }, + }, { name: "invalid request hash header", js: `{"requestHashHeader": "!invalid"}`,