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"}`,