Skip to content

Commit 709a228

Browse files
Update tests
1 parent f96f661 commit 709a228

File tree

8 files changed

+52
-15
lines changed

8 files changed

+52
-15
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,9 @@ public void increaseRaspTimeouts() {
275275
public boolean sampleHttpClientRequest(final long id) {
276276
httpClientRequestCount.incrementAndGet();
277277
synchronized (sampledHttpClientRequests) {
278+
if (sampledHttpClientRequests.contains(id)) {
279+
return true;
280+
}
278281
if (sampledHttpClientRequests.size()
279282
< Config.get().getApiSecurityMaxDownstreamRequestBodyAnalysis()) {
280283
sampledHttpClientRequests.add(id);

dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/base/HttpClientTest.groovy

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,13 @@ import datadog.trace.api.gateway.Events
1515
import datadog.trace.api.gateway.Flow
1616
import datadog.trace.api.gateway.RequestContext
1717
import datadog.trace.api.gateway.RequestContextSlot
18-
import datadog.trace.bootstrap.instrumentation.api.AgentSpan
1918
import datadog.trace.bootstrap.instrumentation.api.AgentTracer
2019
import datadog.trace.bootstrap.instrumentation.api.TagContext
2120
import datadog.trace.bootstrap.instrumentation.api.Tags
2221
import datadog.trace.bootstrap.instrumentation.api.URIUtils
2322
import datadog.trace.core.DDSpan
2423
import datadog.trace.core.datastreams.StatsGroup
2524
import datadog.trace.test.util.Flaky
26-
import groovy.json.JsonOutput
27-
import groovy.json.JsonSlurper
2825
import spock.lang.AutoCleanup
2926
import spock.lang.IgnoreIf
3027
import spock.lang.Requires
@@ -43,7 +40,6 @@ import static datadog.trace.api.config.TraceInstrumentationConfig.HTTP_CLIENT_TA
4340
import static datadog.trace.api.config.TracerConfig.HEADER_TAGS
4441
import static datadog.trace.api.config.TracerConfig.REQUEST_HEADER_TAGS
4542
import static datadog.trace.api.config.TracerConfig.RESPONSE_HEADER_TAGS
46-
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan
4743
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.get
4844

4945
abstract class HttpClientTest extends VersionedNamingTestBase {

dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecHttpEngineInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ public static void onSendRequest(
6060
return;
6161
}
6262

63-
// do not include bodies in the redirect request
63+
// increment the number of downstream requests but do not include request/response body
64+
AppSecInterceptor.sampleRequest(ctx, span.getSpanId());
6465
AppSecInterceptor.onResponse(span, false, priorResponse);
6566
AppSecInterceptor.onRequest(span, false, userRequest.urlString(), userRequest);
6667
}

dd-java-agent/instrumentation/okhttp/okhttp-2.2/src/main/java/datadog/trace/instrumentation/okhttp2/AppSecInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private static <P extends HttpClientPayload> void publish(
162162
}
163163
}
164164

165-
static boolean sampleRequest(final RequestContext ctx, final long requestId) {
165+
public static boolean sampleRequest(final RequestContext ctx, final long requestId) {
166166
// Check if the current http request was sampled
167167
CallbackProvider cbp = AgentTracer.get().getCallbackProvider(RequestContextSlot.APPSEC);
168168
BiFunction<RequestContext, Long, Flow<Boolean>> samplingCb =

dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecHttpEngineInstrumentation.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ public static void onSendRequest(
6060
return;
6161
}
6262

63-
// do not include bodies in the redirect request
63+
// increment the number of downstream requests but do not include request/response body
64+
AppSecInterceptor.sampleRequest(ctx, span.getSpanId());
6465
AppSecInterceptor.onResponse(span, false, priorResponse);
6566
AppSecInterceptor.onRequest(span, false, userRequest.url().toString(), userRequest);
6667
}

dd-java-agent/instrumentation/okhttp/okhttp-3.0/src/main/java/datadog/trace/instrumentation/okhttp3/AppSecInterceptor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ private static <P extends HttpClientPayload> void publish(
162162
}
163163
}
164164

165-
static boolean sampleRequest(final RequestContext ctx, final long requestId) {
165+
public static boolean sampleRequest(final RequestContext ctx, final long requestId) {
166166
// Check if the current http request was sampled
167167
CallbackProvider cbp = AgentTracer.get().getCallbackProvider(RequestContextSlot.APPSEC);
168168
BiFunction<RequestContext, Long, Flow<Boolean>> samplingCb =

dd-smoke-tests/appsec/springboot/src/main/java/datadog/smoketest/appsec/springboot/controller/WebController.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
import java.io.File;
1515
import java.io.IOException;
1616
import java.io.InputStream;
17+
import java.net.URI;
18+
import java.net.URISyntaxException;
1719
import java.net.URL;
1820
import java.nio.file.Paths;
1921
import java.sql.Connection;
@@ -289,7 +291,11 @@ public ResponseEntity<Map<String, Object>> apiSecurityResponse(
289291
public ResponseEntity<String> apiSecurityHttpClientOkHttp2(final HttpServletRequest request)
290292
throws IOException {
291293
// create an internal http request to the echo endpoint to validate the http client library
292-
final String url = getEchoUrl(request);
294+
String url = getEchoUrl(request);
295+
final String redirect = request.getParameter("redirect");
296+
if (redirect != null) {
297+
url += "?redirect=true";
298+
}
293299
Request.Builder clientRequest = new Request.Builder().url(url);
294300
if (requiresBody(request.getMethod())) {
295301
final String contentType = request.getContentType();
@@ -324,8 +330,12 @@ public ResponseEntity<String> apiSecurityHttpClientOkHttp2(final HttpServletRequ
324330
public ResponseEntity<String> apiSecurityHttpClientOkHttp3(final HttpServletRequest request)
325331
throws IOException {
326332
// create an internal http request to the echo endpoint to validate the http client library
327-
final String url = getEchoUrl(request);
328-
okhttp3.Request.Builder clientRequest = new okhttp3.Request.Builder().url(url);
333+
final okhttp3.HttpUrl.Builder url = okhttp3.HttpUrl.parse(getEchoUrl(request)).newBuilder();
334+
final String redirect = request.getParameter("redirect");
335+
if (redirect != null) {
336+
url.addQueryParameter("redirect", "true");
337+
}
338+
okhttp3.Request.Builder clientRequest = new okhttp3.Request.Builder().url(url.build());
329339
if (requiresBody(request.getMethod())) {
330340
final String contentType = request.getContentType();
331341
final byte[] data = readFully(request.getInputStream());
@@ -356,7 +366,12 @@ public ResponseEntity<String> apiSecurityHttpClientOkHttp3(final HttpServletRequ
356366
@RequestMapping(
357367
value = "/echo",
358368
method = {POST, GET, PUT})
359-
public ResponseEntity<String> echo(final HttpServletRequest request) throws IOException {
369+
public ResponseEntity<String> echo(final HttpServletRequest request)
370+
throws IOException, URISyntaxException {
371+
final String redirect = request.getParameter("redirect");
372+
if (redirect != null) {
373+
return ResponseEntity.status(HttpStatus.FOUND).location(new URI("/echo")).build();
374+
}
360375
final String statusHeader = request.getHeader("Status");
361376
final int statusCode = statusHeader == null ? 200 : Integer.parseInt(statusHeader);
362377
ResponseEntity.BodyBuilder response = ResponseEntity.status(statusCode);

dd-smoke-tests/appsec/springboot/src/test/groovy/datadog/smoketest/appsec/SpringBootSmokeTest.groovy

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import datadog.trace.agent.test.utils.OkHttpUtils
55
import datadog.trace.test.util.ThreadUtils
66
import groovy.json.JsonSlurper
77
import okhttp3.FormBody
8+
import okhttp3.HttpUrl
89
import okhttp3.MediaType
910
import okhttp3.Request
1011
import okhttp3.RequestBody
@@ -1024,12 +1025,32 @@ class SpringBootSmokeTest extends AbstractAppSecServerSmokeTest {
10241025
variant << httpClientDownstreamAnalysisVariants()
10251026
}
10261027

1027-
private RootSpan assertDownstreamTrace() {
1028-
waitForTraceCount(2) // original + echo
1028+
void 'API Security downstream response redirect'() {
1029+
when:
1030+
final url =HttpUrl.parse("http://localhost:${httpPort}/api_security/http_client/${variant}")
1031+
.newBuilder()
1032+
.addQueryParameter('redirect', 'true')
1033+
.build()
1034+
final request = new Request.Builder()
1035+
.url(url)
1036+
.get()
1037+
.build()
1038+
final response = client.newCall(request).execute()
1039+
1040+
then:
1041+
response.code() == 200
1042+
assertDownstreamTrace(2)
1043+
1044+
where:
1045+
variant << httpClientDownstreamAnalysisVariants()
1046+
}
1047+
1048+
private RootSpan assertDownstreamTrace(int downstreamCount = 1) {
1049+
waitForTraceCount(downstreamCount + 1) // original one plus all downstream requests
10291050

10301051
final rootSpans = this.rootSpans.toList()
10311052
final span = rootSpans.find { it.getSpan().resource.contains('/api_security/http_client') }
1032-
span.metrics['_dd.appsec.downstream_request'] == 1
1053+
assert span.metrics['_dd.appsec.downstream_request'] == downstreamCount
10331054

10341055
return span
10351056
}

0 commit comments

Comments
 (0)