Skip to content

Commit df46227

Browse files
authored
gRPC JSON transcoding — Fixed parsing string values into enum when provided string is not valid enum value (#52402)
1 parent 4a25559 commit df46227

File tree

2 files changed

+41
-7
lines changed

2 files changed

+41
-7
lines changed

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.JsonTranscoding/Internal/Json/EnumConverter.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,13 @@ public EnumConverter(JsonContext context) : base(context)
2626
{
2727
throw new InvalidOperationException($"Unable to resolve descriptor for {typeToConvert}.");
2828
}
29-
var valueDescriptor = enumDescriptor.FindValueByName(reader.GetString()!);
29+
30+
var value = reader.GetString()!;
31+
var valueDescriptor = enumDescriptor.FindValueByName(value);
32+
if (valueDescriptor == null)
33+
{
34+
throw new InvalidOperationException(@$"Error converting value ""{value}"" to enum type {typeToConvert}.");
35+
}
3036

3137
return ConvertFromInteger(valueDescriptor.Number);
3238
case JsonTokenType.Number:

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.JsonTranscoding.Tests/ConverterTests/JsonConverterReadTests.cs

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,31 @@ public void Enum_ReadNumber(int value)
187187
AssertReadJson<HelloRequest.Types.DataTypes>(json);
188188
}
189189

190+
[Theory]
191+
[InlineData("FOO")]
192+
[InlineData("BAR")]
193+
[InlineData("NEG")]
194+
public void Enum_ReadString(string value)
195+
{
196+
var serviceDescriptorRegistry = new DescriptorRegistry();
197+
serviceDescriptorRegistry.RegisterFileDescriptor(JsonTranscodingGreeter.Descriptor.File);
198+
199+
var json = @$"{{ ""singleEnum"": ""{value}"" }}";
200+
201+
AssertReadJson<HelloRequest.Types.DataTypes>(json, descriptorRegistry: serviceDescriptorRegistry);
202+
}
203+
204+
[Fact]
205+
public void Enum_ReadString_NotAllowedValue()
206+
{
207+
var serviceDescriptorRegistry = new DescriptorRegistry();
208+
serviceDescriptorRegistry.RegisterFileDescriptor(JsonTranscodingGreeter.Descriptor.File);
209+
210+
var json = @"{ ""singleEnum"": ""INVALID"" }";
211+
212+
AssertReadJsonError<HelloRequest.Types.DataTypes>(json, ex => Assert.Equal(@"Error converting value ""INVALID"" to enum type Transcoding.HelloRequest+Types+DataTypes+Types+NestedEnum.", ex.Message), descriptorRegistry: serviceDescriptorRegistry, deserializeOld: false);
213+
}
214+
190215
[Fact]
191216
public void Timestamp_Nested()
192217
{
@@ -603,7 +628,7 @@ public void JsonNamePriority_FieldNameFallback()
603628
return objectNew;
604629
}
605630

606-
private void AssertReadJsonError<TValue>(string value, Action<Exception> assertException, GrpcJsonSettings? settings = null, DescriptorRegistry? descriptorRegistry = null) where TValue : IMessage, new()
631+
private void AssertReadJsonError<TValue>(string value, Action<Exception> assertException, GrpcJsonSettings? settings = null, DescriptorRegistry? descriptorRegistry = null, bool deserializeOld = true) where TValue : IMessage, new()
607632
{
608633
var typeRegistery = TypeRegistry.FromFiles(
609634
HelloRequest.Descriptor.File,
@@ -616,12 +641,15 @@ public void JsonNamePriority_FieldNameFallback()
616641
var ex = Assert.ThrowsAny<Exception>(() => JsonSerializer.Deserialize<TValue>(value, jsonSerializerOptions));
617642
assertException(ex);
618643

619-
var formatter = new JsonParser(new JsonParser.Settings(
620-
recursionLimit: int.MaxValue,
621-
typeRegistery));
644+
if (deserializeOld)
645+
{
646+
var formatter = new JsonParser(new JsonParser.Settings(
647+
recursionLimit: int.MaxValue,
648+
typeRegistery));
622649

623-
ex = Assert.ThrowsAny<Exception>(() => formatter.Parse<TValue>(value));
624-
assertException(ex);
650+
ex = Assert.ThrowsAny<Exception>(() => formatter.Parse<TValue>(value));
651+
assertException(ex);
652+
}
625653
}
626654

627655
internal static JsonSerializerOptions CreateSerializerOptions(GrpcJsonSettings? settings, TypeRegistry? typeRegistery, DescriptorRegistry descriptorRegistry)

0 commit comments

Comments
 (0)