diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapper.java index 9ea787b..ba42295 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapper.java @@ -1,6 +1,5 @@ package ee.bitweb.core.retrofit.logging.mappers; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import okhttp3.*; @@ -8,17 +7,21 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.*; @Slf4j -@RequiredArgsConstructor public class RetrofitRequestHeadersMapper implements RetrofitLoggingMapper { public static final String KEY = "request_headers"; private final Set redactHeaders; + public RetrofitRequestHeadersMapper(Set redactHeaders) { + this.redactHeaders = redactHeaders.stream().map(String::toLowerCase).collect(Collectors.toSet()); + } + @Override public String getValue(Request request, Response response) { try { diff --git a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java index 86caecb..0ed2fce 100644 --- a/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java +++ b/src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java @@ -1,22 +1,25 @@ package ee.bitweb.core.retrofit.logging.mappers; -import lombok.RequiredArgsConstructor; import okhttp3.*; import java.util.HashMap; import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.CONTENT_LENGTH; import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.CONTENT_TYPE; -@RequiredArgsConstructor public class RetrofitResponseHeadersMapper implements RetrofitLoggingMapper { public static final String KEY = "response_headers"; private final Set redactHeaders; + public RetrofitResponseHeadersMapper(Set redactHeaders) { + this.redactHeaders = redactHeaders.stream().map(String::toLowerCase).collect(Collectors.toSet()); + } + @Override public String getValue(Request request, Response response) { return getResponseHeadersString(response); diff --git a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapperTest.java b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapperTest.java new file mode 100644 index 0000000..1986024 --- /dev/null +++ b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapperTest.java @@ -0,0 +1,62 @@ +package ee.bitweb.core.retrofit.logging.mappers; + +import okhttp3.Headers; +import okhttp3.Request; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("unit") +@ExtendWith(MockitoExtension.class) +class RetrofitRequestHeadersMapperTest { + + @Mock + Request request; + + @Test + @DisplayName("All headers are logged") + void headersAreLogged() { + Mockito.when(request.headers()).thenReturn(createHeaders()); + Mockito.when(request.body()).thenReturn(null); + + var mapper = new RetrofitRequestHeadersMapper(Set.of()); + + assertEquals("X-Custom-Id: aBc134; Content-Length: 123; Content-Type: application/json", mapper.getValue(request, null)); + + Mockito.verify(request, Mockito.times(1)).body(); + Mockito.verify(request, Mockito.times(1)).headers(); + Mockito.verifyNoMoreInteractions(request); + } + + @Test + @DisplayName("Suppressed headers list is honoured") + void suppressedListIsHonoured() { + Mockito.when(request.headers()).thenReturn(createHeaders()); + Mockito.when(request.body()).thenReturn(null); + + var mapper = new RetrofitRequestHeadersMapper(Set.of("X-Custom-Id")); + + assertEquals("X-Custom-Id: ; Content-Length: 123; Content-Type: application/json", mapper.getValue(request, null)); + + Mockito.verify(request, Mockito.times(1)).body(); + Mockito.verify(request, Mockito.times(1)).headers(); + Mockito.verifyNoMoreInteractions(request); + } + + private Headers createHeaders() { + Headers.Builder headersBuilder = new Headers.Builder(); + headersBuilder.add("Content-Type", "application/json"); + headersBuilder.add("Content-Length", "123"); + headersBuilder.add("X-Custom-Id", "aBc134"); + + return headersBuilder.build(); + } +} diff --git a/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapperTest.java b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapperTest.java new file mode 100644 index 0000000..49b96e3 --- /dev/null +++ b/src/test/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapperTest.java @@ -0,0 +1,62 @@ +package ee.bitweb.core.retrofit.logging.mappers; + +import okhttp3.Headers; +import okhttp3.Response; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.Set; + +import static org.junit.jupiter.api.Assertions.*; + +@Tag("unit") +@ExtendWith(MockitoExtension.class) +class RetrofitResponseHeadersMapperTest { + + @Mock + Response response; + + @Test + @DisplayName("All headers are logged") + void headersAreLogged() { + Mockito.when(response.headers()).thenReturn(createHeaders()); + Mockito.when(response.body()).thenReturn(null); + + var mapper = new RetrofitResponseHeadersMapper(Set.of()); + + assertEquals("X-Custom-Id: aBc134; Content-Length: 123; Content-Type: application/json", mapper.getValue(null, response)); + + Mockito.verify(response, Mockito.times(1)).body(); + Mockito.verify(response, Mockito.times(1)).headers(); + Mockito.verifyNoMoreInteractions(response); + } + + @Test + @DisplayName("Suppressed headers list is honoured") + void suppressedListIsHonoured() { + Mockito.when(response.headers()).thenReturn(createHeaders()); + Mockito.when(response.body()).thenReturn(null); + + var mapper = new RetrofitResponseHeadersMapper(Set.of("X-Custom-Id")); + + assertEquals("X-Custom-Id: ; Content-Length: 123; Content-Type: application/json", mapper.getValue(null, response)); + + Mockito.verify(response, Mockito.times(1)).body(); + Mockito.verify(response, Mockito.times(1)).headers(); + Mockito.verifyNoMoreInteractions(response); + } + + private Headers createHeaders() { + Headers.Builder headersBuilder = new Headers.Builder(); + headersBuilder.add("Content-Type", "application/json"); + headersBuilder.add("Content-Length", "123"); + headersBuilder.add("X-Custom-Id", "aBc134"); + + return headersBuilder.build(); + } +}