diff --git a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/EndpointUtil.java b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/EndpointUtil.java index c347d738edd..5f634ee9e15 100644 --- a/exporters/common/src/main/java/io/opentelemetry/exporter/internal/EndpointUtil.java +++ b/exporters/common/src/main/java/io/opentelemetry/exporter/internal/EndpointUtil.java @@ -30,6 +30,10 @@ public static URI validateEndpoint(String endpoint) { throw new IllegalArgumentException( "Invalid endpoint, must start with http:// or https://: " + uri); } + if (uri.getHost() == null) { + throw new IllegalArgumentException( + "Invalid endpoint, must start with http:// or https://: " + uri); + } return uri; } diff --git a/exporters/common/src/test/java/io/opentelemetry/exporter/internal/EndpointUtilTest.java b/exporters/common/src/test/java/io/opentelemetry/exporter/internal/EndpointUtilTest.java new file mode 100644 index 00000000000..1c81213c416 --- /dev/null +++ b/exporters/common/src/test/java/io/opentelemetry/exporter/internal/EndpointUtilTest.java @@ -0,0 +1,48 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.exporter.internal; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.net.URI; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +class EndpointUtilTest { + + @ParameterizedTest + @MethodSource("validEndpoints") + void validateEndpoint_valid(String endpoint) { + assertThat(EndpointUtil.validateEndpoint(endpoint)).isEqualTo(URI.create(endpoint)); + } + + private static Stream validEndpoints() { + return Stream.of( + Arguments.argumentSet("http", "http://localhost:4318"), + Arguments.argumentSet("https", "https://localhost:4317"), + Arguments.argumentSet("path", "http://localhost:4318/v1/traces"), + Arguments.argumentSet("userinfo", "http://foo:bar@localhost:4317/path")); + } + + @ParameterizedTest + @MethodSource("invalidEndpoints") + void validateEndpoint_invalid(String endpoint) { + assertThatThrownBy(() -> EndpointUtil.validateEndpoint(endpoint)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("must start with http:// or https://"); + } + + private static Stream invalidEndpoints() { + return Stream.of( + Arguments.argumentSet("opaque, no host", "http:localhost:4317"), + Arguments.argumentSet("single slash, no host", "https:/foo"), + Arguments.argumentSet("no scheme", "localhost"), + Arguments.argumentSet("wrong scheme", "gopher://localhost")); + } +}