diff --git a/core/src/main/java/pl/tkowalcz/tjahzi/http/BootstrapUtil.java b/core/src/main/java/pl/tkowalcz/tjahzi/http/BootstrapUtil.java index 6bdc356..f65d7e2 100644 --- a/core/src/main/java/pl/tkowalcz/tjahzi/http/BootstrapUtil.java +++ b/core/src/main/java/pl/tkowalcz/tjahzi/http/BootstrapUtil.java @@ -12,9 +12,6 @@ import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import pl.tkowalcz.tjahzi.stats.MonitoringModule; import javax.net.ssl.SSLException; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.Optional; public class BootstrapUtil { @@ -65,17 +62,4 @@ public class BootstrapUtil { throw new RuntimeException(e); } } - - public static Optional createAuthString(String username, String password) { - if (username == null && password == null) { - return Optional.empty(); - } - - String userPassword = username + ":" + password; - String authString = "Basic " + Base64 - .getEncoder() - .encodeToString(userPassword.getBytes(StandardCharsets.UTF_8)); - - return Optional.of(authString); - } } diff --git a/core/src/main/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactory.java b/core/src/main/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactory.java new file mode 100644 index 0000000..ea82bc0 --- /dev/null +++ b/core/src/main/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactory.java @@ -0,0 +1,48 @@ +package pl.tkowalcz.tjahzi.http; + +import io.netty.handler.codec.http.HttpHeaderNames; +import io.netty.handler.codec.http.HttpHeaders; +import io.netty.handler.codec.http.ReadOnlyHttpHeaders; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Base64; +import java.util.Optional; + +public class HttpHeadersFactory { + + public static HttpHeaders createHeaders(ClientConfiguration clientConfiguration, String[] additionalHeaders) { + ArrayList newHeaders = new ArrayList<>(Arrays.asList(additionalHeaders)); + + Optional maybeAuthString = createAuthString( + clientConfiguration.getUsername(), + clientConfiguration.getPassword() + ); + + maybeAuthString.ifPresent( + authString -> { + newHeaders.add(HttpHeaderNames.AUTHORIZATION.toString()); + newHeaders.add(authString); + } + ); + + return new ReadOnlyHttpHeaders( + true, + newHeaders.toArray(new String[0]) + ); + } + + public static Optional createAuthString(String username, String password) { + if (username == null && password == null) { + return Optional.empty(); + } + + String userPassword = username + ":" + password; + String authString = "Basic " + Base64 + .getEncoder() + .encodeToString(userPassword.getBytes(StandardCharsets.UTF_8)); + + return Optional.of(authString); + } +} diff --git a/core/src/main/java/pl/tkowalcz/tjahzi/http/NettyHttpClient.java b/core/src/main/java/pl/tkowalcz/tjahzi/http/NettyHttpClient.java index 30692ff..0cf1d6c 100644 --- a/core/src/main/java/pl/tkowalcz/tjahzi/http/NettyHttpClient.java +++ b/core/src/main/java/pl/tkowalcz/tjahzi/http/NettyHttpClient.java @@ -9,18 +9,17 @@ import pl.tkowalcz.tjahzi.stats.MonitoringModule; import java.io.Closeable; import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; public class NettyHttpClient implements Closeable { public static final String PROTOBUF_MIME_TYPE = "application/x-protobuf"; private final ClientConfiguration clientConfiguration; + private final HttpHeaders headers; + private final HttpConnection lokiConnection; private final Snappy snappy = new Snappy(); - private final HttpConnection lokiConnection; public NettyHttpClient( ClientConfiguration clientConfiguration, @@ -29,23 +28,8 @@ public class NettyHttpClient implements Closeable { ) { this.clientConfiguration = clientConfiguration; - String[] finalAdditionalHeaders = BootstrapUtil.createAuthString( - clientConfiguration.getUsername(), - clientConfiguration.getPassword() - ).map(authString -> { - ArrayList newHeaders = new ArrayList<>(Arrays.asList(additionalHeaders)); - newHeaders.add(HttpHeaderNames.AUTHORIZATION.toString()); - newHeaders.add(authString); - - return newHeaders.toArray(new String[0]); - }).orElse(additionalHeaders); - - this.headers = new ReadOnlyHttpHeaders( - true, - finalAdditionalHeaders - ); - - lokiConnection = new HttpConnection(clientConfiguration, monitoringModule); + this.headers = HttpHeadersFactory.createHeaders(clientConfiguration, additionalHeaders); + this.lokiConnection = new HttpConnection(clientConfiguration, monitoringModule); } public void log(ByteBuf dataBuffer) { diff --git a/core/src/test/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactoryTest.java b/core/src/test/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactoryTest.java new file mode 100644 index 0000000..444102b --- /dev/null +++ b/core/src/test/java/pl/tkowalcz/tjahzi/http/HttpHeadersFactoryTest.java @@ -0,0 +1,108 @@ +package pl.tkowalcz.tjahzi.http; + +import io.netty.handler.codec.http.HttpHeaders; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +class HttpHeadersFactoryTest { + + @Test + void shouldAddAuthHeaderIfCredentialsAreProvided_NoAdditionalHeaders() { + // Given + ClientConfiguration configuration = ClientConfiguration.builder() + .withUsername("foob") + .withPassword("ar") + .build(); + + String[] additionalHeaders = new String[0]; + + // When + HttpHeaders httpHeaders = HttpHeadersFactory.createHeaders( + configuration, + additionalHeaders + ); + + // Then + assertThat(httpHeaders.entries()) + .hasSize(1) + .containsExactly( + entry("authorization", "Basic Zm9vYjphcg==") + ); + } + + @Test + void shouldAddAuthHeaderIfCredentialsAreProvided_WithAdditionalHeaders() { + // Given + ClientConfiguration configuration = ClientConfiguration.builder() + .withUsername("foob") + .withPassword("ar") + .build(); + + String[] additionalHeaders = new String[]{ + "droid", "K2SO", + "not-droid", "Jyn Erso", + }; + + // When + HttpHeaders httpHeaders = HttpHeadersFactory.createHeaders( + configuration, + additionalHeaders + ); + + // Then + assertThat(httpHeaders.entries()) + .hasSize(3) + .containsExactlyInAnyOrder( + entry("authorization", "Basic Zm9vYjphcg=="), + entry("droid", "K2SO"), + entry("not-droid", "Jyn Erso") + ); + } + + @Test + void shouldNotAddAuthHeader_NoAdditionalHeaders() { + // Given + ClientConfiguration configuration = ClientConfiguration.builder() + .build(); + + String[] additionalHeaders = new String[0]; + + // When + HttpHeaders httpHeaders = HttpHeadersFactory.createHeaders( + configuration, + additionalHeaders + ); + + // Then + assertThat(httpHeaders.entries()) + .isEmpty(); + } + + @Test + void shouldNOtAddAuthHeader_WithAdditionalHeaders() { + // Given + ClientConfiguration configuration = ClientConfiguration.builder() + .build(); + + String[] additionalHeaders = new String[]{ + "droid", "K2SO", + "not-droid", "Jyn Erso", + }; + + // When + HttpHeaders httpHeaders = HttpHeadersFactory.createHeaders( + configuration, + additionalHeaders + ); + + // Then + assertThat(httpHeaders.entries()) + .hasSize(2) + .containsExactlyInAnyOrder( + entry("droid", "K2SO"), + entry("not-droid", "Jyn Erso") + ); + } +}