Skip to content

Commit 85670c0

Browse files
Convert downstream requests header keys to lower case
1 parent 8ef6e7a commit 85670c0

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

dd-java-agent/appsec/src/main/java/com/datadog/appsec/gateway/GatewayBridge.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
import java.util.HashMap;
5959
import java.util.HashSet;
6060
import java.util.List;
61+
import java.util.Locale;
6162
import java.util.Map;
6263
import java.util.Set;
6364
import java.util.concurrent.ConcurrentHashMap;
@@ -358,7 +359,7 @@ private Flow<Void> onHttpClientRequest(RequestContext ctx_, HttpClientRequest re
358359
new MapDataBundle.Builder(CAPACITY_3_4)
359360
.add(KnownAddresses.IO_NET_URL, request.getUrl())
360361
.add(KnownAddresses.IO_NET_REQUEST_METHOD, request.getMethod())
361-
.add(KnownAddresses.IO_NET_REQUEST_HEADERS, request.getHeaders());
362+
.add(KnownAddresses.IO_NET_REQUEST_HEADERS, toLowerCaseHeaders(request.getHeaders()));
362363

363364
if (downstreamSampler().isSampled(ctx, request.getRequestId())) {
364365
final Object body = parseHttpClientBody(ctx, request);
@@ -398,7 +399,7 @@ private Flow<Void> onHttpClientResponse(RequestContext ctx_, HttpClientResponse
398399
final MapDataBundle.Builder bundleBuilder =
399400
new MapDataBundle.Builder(CAPACITY_3_4)
400401
.add(KnownAddresses.IO_NET_RESPONSE_STATUS, Integer.toString(response.getStatus()))
401-
.add(KnownAddresses.IO_NET_RESPONSE_HEADERS, response.getHeaders());
402+
.add(KnownAddresses.IO_NET_RESPONSE_HEADERS, toLowerCaseHeaders(response.getHeaders()));
402403
// ignore the response if not sampled
403404
if (downstreamSampler().isSampled(ctx, response.getRequestId())) {
404405
final Object body = parseHttpClientBody(ctx, response);
@@ -429,6 +430,19 @@ private Flow<Void> onHttpClientResponse(RequestContext ctx_, HttpClientResponse
429430
}
430431
}
431432

433+
private Map<String, List<String>> toLowerCaseHeaders(final Map<String, List<String>> headers) {
434+
if (headers == null || headers.isEmpty()) {
435+
return headers;
436+
}
437+
final Map<String, List<String>> result = new HashMap<>(headers.size());
438+
for (final Map.Entry<String, List<String>> entry : headers.entrySet()) {
439+
final String key = entry.getKey();
440+
final List<String> value = entry.getValue();
441+
result.put(key == null ? null : key.toLowerCase(Locale.ROOT), value);
442+
}
443+
return result;
444+
}
445+
432446
private Object parseHttpClientBody(
433447
final AppSecRequestContext ctx, final HttpClientPayload payload) {
434448
if (payload.getContentType() == null || payload.getBody() == null) {

dd-java-agent/appsec/src/test/groovy/com/datadog/appsec/gateway/GatewayBridgeSpecification.groovy

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,7 +989,7 @@ class GatewayBridgeSpecification extends DDSpecification {
989989
bundle.size() == (sampled ? 4 : 3)
990990
bundle.get(KnownAddresses.IO_NET_URL) == url
991991
bundle.get(KnownAddresses.IO_NET_REQUEST_METHOD) == method
992-
bundle.get(KnownAddresses.IO_NET_REQUEST_HEADERS) == headers
992+
bundle.get(KnownAddresses.IO_NET_REQUEST_HEADERS) == toLowerCaseHeaders(headers)
993993
if (sampled) {
994994
bundle.get(KnownAddresses.IO_NET_REQUEST_BODY) == ['Hello': 'World!']
995995
}
@@ -1029,7 +1029,7 @@ class GatewayBridgeSpecification extends DDSpecification {
10291029
}
10301030
bundle.size() == (sampled ? 3 : 2)
10311031
bundle.get(KnownAddresses.IO_NET_RESPONSE_STATUS) == Integer.toString(status)
1032-
bundle.get(KnownAddresses.IO_NET_RESPONSE_HEADERS) == headers
1032+
bundle.get(KnownAddresses.IO_NET_RESPONSE_HEADERS) == toLowerCaseHeaders(headers)
10331033
if (sampled) {
10341034
bundle.get(KnownAddresses.IO_NET_RESPONSE_BODY) == ['Hello': 'World!']
10351035
}
@@ -1615,4 +1615,10 @@ class GatewayBridgeSpecification extends DDSpecification {
16151615
assert body['test'] == 'this is a test'
16161616
}
16171617
}
1618+
1619+
static toLowerCaseHeaders(final Map<String, List<String>> headers) {
1620+
return headers.collectEntries {
1621+
[(it.key.toLowerCase(Locale.ROOT)): it.value]
1622+
}
1623+
}
16181624
}

0 commit comments

Comments
 (0)