Skip to content

Commit 663c505

Browse files
authored
core: normalize service config number values (grpc#12826)
This updates default service config validation to accept numeric values represented as `Number`, not only `Double`. Common JSON parsers may deserialize integer-looking JSON values such as `maxAttempts: 4` and `backoffMultiplier: 2` as `Integer`, which previously caused `defaultServiceConfig()` to fail with `IllegalArgumentException`. The values are normalized to `Double` when copied into the validated service config, preserving the existing internal representation expected by the service config parsing code. Fixes grpc#12815
1 parent 10d901d commit 663c505

2 files changed

Lines changed: 27 additions & 5 deletions

File tree

core/src/main/java/io/grpc/internal/ManagedChannelImplBuilder.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -582,8 +582,8 @@ public ManagedChannelImplBuilder defaultServiceConfig(@Nullable Map<String, ?> s
582582
parsedMap.put(key, checkListEntryTypes((List<?>) value));
583583
} else if (value instanceof String) {
584584
parsedMap.put(key, value);
585-
} else if (value instanceof Double) {
586-
parsedMap.put(key, value);
585+
} else if (value instanceof Number) {
586+
parsedMap.put(key, ((Number) value).doubleValue());
587587
} else if (value instanceof Boolean) {
588588
parsedMap.put(key, value);
589589
} else {
@@ -606,8 +606,8 @@ private static List<?> checkListEntryTypes(List<?> list) {
606606
parsedList.add(checkListEntryTypes((List<?>) value));
607607
} else if (value instanceof String) {
608608
parsedList.add(value);
609-
} else if (value instanceof Double) {
610-
parsedList.add(value);
609+
} else if (value instanceof Number) {
610+
parsedList.add(((Number) value).doubleValue());
611611
} else if (value instanceof Boolean) {
612612
parsedList.add(value);
613613
} else {

core/src/test/java/io/grpc/internal/ManagedChannelImplBuilderTest.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -735,9 +735,31 @@ public void defaultServiceConfig_intKey() {
735735
@Test
736736
public void defaultServiceConfig_intValue() {
737737
Map<String, Object> config = new HashMap<>();
738+
738739
config.put("key", 3);
739740

740-
assertThrows(IllegalArgumentException.class, () -> builder.defaultServiceConfig(config));
741+
builder.defaultServiceConfig(config);
742+
743+
assertThat(builder.defaultServiceConfig).containsEntry("key", 3D);
744+
}
745+
746+
@Test
747+
public void defaultServiceConfig_nestedIntValue() {
748+
Map<String, Object> config = new HashMap<>();
749+
List<Object> list = new ArrayList<>();
750+
Map<String, Object> nested = new HashMap<>();
751+
752+
list.add(123);
753+
nested.put("key", 456);
754+
list.add(nested);
755+
config.put("list", list);
756+
757+
builder.defaultServiceConfig(config);
758+
759+
assertThat(builder.defaultServiceConfig)
760+
.containsEntry(
761+
"list",
762+
Arrays.asList(123D, Collections.singletonMap("key", 456D)));
741763
}
742764

743765
@Test

0 commit comments

Comments
 (0)