diff --git a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/BaggageCodec.java b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/BaggageCodec.java index 95c60f49817..71c8bd875fb 100644 --- a/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/BaggageCodec.java +++ b/api/all/src/main/java/io/opentelemetry/api/baggage/propagation/BaggageCodec.java @@ -84,8 +84,14 @@ static String decode(String value, Charset charset) { private static int digit16(byte b) { int i = Character.digit((char) b, RADIX); if (i == -1) { - throw new IllegalArgumentException( // FIXME - "Invalid URL encoding: not a valid digit (radix " + RADIX + "): " + b); + throw new NumberFormatException( + "Invalid URL encoding: not a valid digit (radix " + + RADIX + + "): byte=" + + b + + ", char='" + + (char) (b & 0xff) + + "'"); } return i; } diff --git a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/BaggageCodecTest.java b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/BaggageCodecTest.java index f65430829cb..22b23cda0c3 100644 --- a/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/BaggageCodecTest.java +++ b/api/all/src/test/java/io/opentelemetry/api/baggage/propagation/BaggageCodecTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.api.baggage.propagation; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.nio.charset.StandardCharsets; import org.junit.jupiter.api.Test; @@ -38,4 +39,12 @@ void shouldIgnoreIfMalformedData() { assertThat(BaggageCodec.decode("%", StandardCharsets.UTF_8)).isEqualTo(""); assertThat(BaggageCodec.decode("%1", StandardCharsets.UTF_8)).isEqualTo(""); } + + @Test + void shouldThrowNumberFormatExceptionForInvalidHexDigit() { + assertThatThrownBy(() -> BaggageCodec.decode("%G0", StandardCharsets.UTF_8)) + .isInstanceOf(NumberFormatException.class) + .hasMessageContaining("byte=71") + .hasMessageContaining("char='G'"); + } }