diff --git a/transport/grpc/headers.go b/transport/grpc/headers.go index 4b1436f81..da514de23 100644 --- a/transport/grpc/headers.go +++ b/transport/grpc/headers.go @@ -145,8 +145,7 @@ func metadataToTransportRequest(md metadata.MD) (*transport.Request, error) { default: return nil, yarpcerrors.InvalidArgumentErrorf("header has more than one value: %s:%v", header, values) } - header = transport.CanonicalizeHeaderKey(header) - // skip routing header + // gRPC metadata keys are already lowercase. if routingHeaders[header] { continue } @@ -221,7 +220,7 @@ func getApplicationHeaders(md metadata.MD) (transport.Headers, error) { } headers := transport.NewHeadersWithCapacity(md.Len()) for header, values := range md { - header = transport.CanonicalizeHeaderKey(header) + // gRPC metadata keys are already lowercase. if isReserved(header) { continue } diff --git a/transport/grpc/headers_test.go b/transport/grpc/headers_test.go index 9fb3c6e3a..f244a305d 100644 --- a/transport/grpc/headers_test.go +++ b/transport/grpc/headers_test.go @@ -253,7 +253,7 @@ func TestGetApplicationHeaders(t *testing.T) { "rpc-service": []string{"foo"}, // reserved header "test-header-empty": []string{}, // no value "test-header-valid-1": []string{"test-value-1"}, - "test-Header-Valid-2": []string{"test-value-2"}, + "test-header-valid-2": []string{"test-value-2"}, }, wantHeaders: map[string]string{ "test-header-valid-1": "test-value-1", @@ -404,3 +404,45 @@ func BenchmarkIsReserved(b *testing.B) { }) } } + +func BenchmarkMetadataToTransportRequest(b *testing.B) { + md := metadata.Pairs( + CallerHeader, "example-caller", + ServiceHeader, "example-service", + ShardKeyHeader, "example-shard-key", + RoutingKeyHeader, "example-routing-key", + RoutingDelegateHeader, "example-routing-delegate", + EncodingHeader, "raw", + CallerProcedureHeader, "example-caller-procedure", + "x-uber-source", "service-a", + "x-request-id", "abc-123", + "x-trace-id", "trace-456", + "x-custom-1", "val1", + "x-custom-2", "val2", + ) + + b.ResetTimer() + for range b.N { + _, _ = metadataToTransportRequest(md) + } +} + +func BenchmarkGetApplicationHeaders(b *testing.B) { + md := metadata.MD{ + "rpc-caller": []string{"example-caller"}, + "rpc-service": []string{"example-service"}, + "rpc-encoding": []string{"raw"}, + "x-uber-source": []string{"service-a"}, + "x-request-id": []string{"abc-123"}, + "x-trace-id": []string{"trace-456"}, + "x-custom-1": []string{"val1"}, + "x-custom-2": []string{"val2"}, + "x-custom-3": []string{"val3"}, + "x-custom-4": []string{"val4"}, + } + + b.ResetTimer() + for range b.N { + _, _ = getApplicationHeaders(md) + } +}