|
@@ -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>
|