Skip to content

Commit 5acf658

Browse files
committed
Convert suppressed headers to lowercase before comparing
1 parent d35695b commit 5acf658

4 files changed

Lines changed: 134 additions & 4 deletions

File tree

src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitRequestHeadersMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
package ee.bitweb.core.retrofit.logging.mappers;
22

3-
import lombok.RequiredArgsConstructor;
43
import lombok.extern.slf4j.Slf4j;
54
import okhttp3.*;
65

76
import java.io.IOException;
87
import java.util.HashMap;
98
import java.util.Map;
109
import java.util.Set;
10+
import java.util.stream.Collectors;
1111

1212
import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.*;
1313

1414
@Slf4j
15-
@RequiredArgsConstructor
1615
public class RetrofitRequestHeadersMapper implements RetrofitLoggingMapper {
1716

1817
public static final String KEY = "request_headers";
1918

2019
private final Set<String> redactHeaders;
2120

21+
public RetrofitRequestHeadersMapper(Set<String> redactHeaders) {
22+
this.redactHeaders = redactHeaders.stream().map(String::toLowerCase).collect(Collectors.toSet());
23+
}
24+
2225
@Override
2326
public String getValue(Request request, Response response) {
2427
try {

src/main/java/ee/bitweb/core/retrofit/logging/mappers/RetrofitResponseHeadersMapper.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,25 @@
11
package ee.bitweb.core.retrofit.logging.mappers;
22

3-
import lombok.RequiredArgsConstructor;
43
import okhttp3.*;
54

65
import java.util.HashMap;
76
import java.util.Map;
87
import java.util.Set;
8+
import java.util.stream.Collectors;
99

1010
import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.CONTENT_LENGTH;
1111
import static ee.bitweb.core.retrofit.logging.mappers.RetrofitHeadersMapperHelper.CONTENT_TYPE;
1212

13-
@RequiredArgsConstructor
1413
public class RetrofitResponseHeadersMapper implements RetrofitLoggingMapper {
1514

1615
public static final String KEY = "response_headers";
1716

1817
private final Set<String> redactHeaders;
1918

19+
public RetrofitResponseHeadersMapper(Set<String> redactHeaders) {
20+
this.redactHeaders = redactHeaders.stream().map(String::toLowerCase).collect(Collectors.toSet());
21+
}
22+
2023
@Override
2124
public String getValue(Request request, Response response) {
2225
return getResponseHeadersString(response);
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package ee.bitweb.core.retrofit.logging.mappers;
2+
3+
import okhttp3.Headers;
4+
import okhttp3.Request;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.ExtendWith;
9+
import org.mockito.Mock;
10+
import org.mockito.Mockito;
11+
import org.mockito.junit.jupiter.MockitoExtension;
12+
13+
import java.util.Set;
14+
15+
import static org.junit.jupiter.api.Assertions.*;
16+
17+
@Tag("unit")
18+
@ExtendWith(MockitoExtension.class)
19+
class RetrofitRequestHeadersMapperTest {
20+
21+
@Mock
22+
Request request;
23+
24+
@Test
25+
@DisplayName("All headers are logged")
26+
void headersAreLogged() {
27+
Mockito.when(request.headers()).thenReturn(createHeaders());
28+
Mockito.when(request.body()).thenReturn(null);
29+
30+
var mapper = new RetrofitRequestHeadersMapper(Set.of());
31+
32+
assertEquals("X-Custom-Id: aBc134; Content-Length: 123; Content-Type: application/json", mapper.getValue(request, null));
33+
34+
Mockito.verify(request, Mockito.times(1)).body();
35+
Mockito.verify(request, Mockito.times(1)).headers();
36+
Mockito.verifyNoMoreInteractions(request);
37+
}
38+
39+
@Test
40+
@DisplayName("Suppressed headers list is honoured")
41+
void suppressedListIsHonoured() {
42+
Mockito.when(request.headers()).thenReturn(createHeaders());
43+
Mockito.when(request.body()).thenReturn(null);
44+
45+
var mapper = new RetrofitRequestHeadersMapper(Set.of("X-Custom-Id"));
46+
47+
assertEquals("X-Custom-Id: ; Content-Length: 123; Content-Type: application/json", mapper.getValue(request, null));
48+
49+
Mockito.verify(request, Mockito.times(1)).body();
50+
Mockito.verify(request, Mockito.times(1)).headers();
51+
Mockito.verifyNoMoreInteractions(request);
52+
}
53+
54+
private Headers createHeaders() {
55+
Headers.Builder headersBuilder = new Headers.Builder();
56+
headersBuilder.add("Content-Type", "application/json");
57+
headersBuilder.add("Content-Length", "123");
58+
headersBuilder.add("X-Custom-Id", "aBc134");
59+
60+
return headersBuilder.build();
61+
}
62+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package ee.bitweb.core.retrofit.logging.mappers;
2+
3+
import okhttp3.Headers;
4+
import okhttp3.Response;
5+
import org.junit.jupiter.api.DisplayName;
6+
import org.junit.jupiter.api.Tag;
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.ExtendWith;
9+
import org.mockito.Mock;
10+
import org.mockito.Mockito;
11+
import org.mockito.junit.jupiter.MockitoExtension;
12+
13+
import java.util.Set;
14+
15+
import static org.junit.jupiter.api.Assertions.*;
16+
17+
@Tag("unit")
18+
@ExtendWith(MockitoExtension.class)
19+
class RetrofitResponseHeadersMapperTest {
20+
21+
@Mock
22+
Response response;
23+
24+
@Test
25+
@DisplayName("All headers are logged")
26+
void headersAreLogged() {
27+
Mockito.when(response.headers()).thenReturn(createHeaders());
28+
Mockito.when(response.body()).thenReturn(null);
29+
30+
var mapper = new RetrofitResponseHeadersMapper(Set.of());
31+
32+
assertEquals("X-Custom-Id: aBc134; Content-Length: 123; Content-Type: application/json", mapper.getValue(null, response));
33+
34+
Mockito.verify(response, Mockito.times(1)).body();
35+
Mockito.verify(response, Mockito.times(1)).headers();
36+
Mockito.verifyNoMoreInteractions(response);
37+
}
38+
39+
@Test
40+
@DisplayName("Suppressed headers list is honoured")
41+
void suppressedListIsHonoured() {
42+
Mockito.when(response.headers()).thenReturn(createHeaders());
43+
Mockito.when(response.body()).thenReturn(null);
44+
45+
var mapper = new RetrofitResponseHeadersMapper(Set.of("X-Custom-Id"));
46+
47+
assertEquals("X-Custom-Id: ; Content-Length: 123; Content-Type: application/json", mapper.getValue(null, response));
48+
49+
Mockito.verify(response, Mockito.times(1)).body();
50+
Mockito.verify(response, Mockito.times(1)).headers();
51+
Mockito.verifyNoMoreInteractions(response);
52+
}
53+
54+
private Headers createHeaders() {
55+
Headers.Builder headersBuilder = new Headers.Builder();
56+
headersBuilder.add("Content-Type", "application/json");
57+
headersBuilder.add("Content-Length", "123");
58+
headersBuilder.add("X-Custom-Id", "aBc134");
59+
60+
return headersBuilder.build();
61+
}
62+
}

0 commit comments

Comments
 (0)