|  | @@ -225,8 +225,6 @@ namespace Grpc.Core
 | 
	
		
			
				|  |  |          /// </summary>
 | 
	
		
			
				|  |  |          public class Entry
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            private static readonly Regex ValidKeyRegex = new Regex("^[.a-z0-9_-]+$");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |              readonly string key;
 | 
	
		
			
				|  |  |              readonly string value;
 | 
	
		
			
				|  |  |              readonly byte[] valueBytes;
 | 
	
	
		
			
				|  | @@ -358,10 +356,39 @@ namespace Grpc.Core
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              private static string NormalizeKey(string key)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | -                var normalized = GrpcPreconditions.CheckNotNull(key, "key").ToLowerInvariant();
 | 
	
		
			
				|  |  | -                GrpcPreconditions.CheckArgument(ValidKeyRegex.IsMatch(normalized), 
 | 
	
		
			
				|  |  | +                GrpcPreconditions.CheckNotNull(key, "key");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                GrpcPreconditions.CheckArgument(IsValidKey(key, out bool isLowercase), 
 | 
	
		
			
				|  |  |                      "Metadata entry key not valid. Keys can only contain lowercase alphanumeric characters, underscores, hyphens and dots.");
 | 
	
		
			
				|  |  | -                return normalized;
 | 
	
		
			
				|  |  | +                if (isLowercase)
 | 
	
		
			
				|  |  | +                    return key;
 | 
	
		
			
				|  |  | +                
 | 
	
		
			
				|  |  | +                return key.ToLowerInvariant();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            private static bool IsValidKey(string input, out bool isLowercase)
 | 
	
		
			
				|  |  | +            {
 | 
	
		
			
				|  |  | +                isLowercase = true;
 | 
	
		
			
				|  |  | +                for (int i = 0; i < input.Length; i++)
 | 
	
		
			
				|  |  | +                {
 | 
	
		
			
				|  |  | +                    char c = input[i];
 | 
	
		
			
				|  |  | +                    if ('a' <= c && c <= 'z' ||
 | 
	
		
			
				|  |  | +                        '0' <= c && c <= '9' ||
 | 
	
		
			
				|  |  | +                        c == '.' ||
 | 
	
		
			
				|  |  | +                        c == '_' || 
 | 
	
		
			
				|  |  | +                        c == '-' )
 | 
	
		
			
				|  |  | +                        continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    if ('A' <= c && c <= 'Z')
 | 
	
		
			
				|  |  | +                    {
 | 
	
		
			
				|  |  | +                        isLowercase = false;
 | 
	
		
			
				|  |  | +                        continue;
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                    return false;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                return true;
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              /// <summary>
 |