Skip to content

Commit 0ec0f9a

Browse files
claponcetdevflow.devflow-routing-intake
andauthored
AppSec Lambda: Analyze HTTP response (#11750)
refactor + add appsec data to span unit tests add better support for query parameters apply spotless fix test crash remove unused var forwarded headers parsing + downgrade log level formatting WIP wip AppSec Lambda: HTTP trigger type detection + resource name fix for extension dedup Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> PR review fixes: revert broken startSpan calls + test quality cleanup spotlessApply Normalise content-type casing before JSON detection spotlessApply Address review: narrow throws, add IAST slot and null appSecContext assertions Use assertDoesNotThrow for no-op method assertions, remove throws Exception Add coverage tests for LambdaAppSecHandler edge cases Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Address review: hoist isHttp() guard, skip notifyAppSecEnd on throwable, remove FQNs URL-encode query param keys/values in LambdaAppSecHandler.buildFullPath Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Propagate ASM_KEEP for Lambda traces kept by trace-tagging rules with no WAF events Test percent-encoding of special characters in query params Guard AppSecContext cast in processRequestEnd to prevent ClassCastException Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Merge branch 'master' into clara.poncet/appsec-lambda-response Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent fc6f5e4 commit 0ec0f9a

17 files changed

Lines changed: 2223 additions & 740 deletions

File tree

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.datadog.ddwaf.WafHandle;
1212
import com.datadog.ddwaf.WafMetrics;
1313
import datadog.trace.api.Config;
14+
import datadog.trace.api.appsec.AppSecContext;
1415
import datadog.trace.api.endpoint.EndpointResolver;
1516
import datadog.trace.api.http.StoredBodySupplier;
1617
import datadog.trace.api.internal.TraceSegment;
@@ -45,7 +46,7 @@
4546
// TODO: different methods to be called by different parts perhaps splitting it would make sense
4647
// or at least create separate interfaces
4748
@SuppressFBWarnings("AT_STALE_THREAD_WRITE_OF_PRIMITIVE")
48-
public class AppSecRequestContext implements DataBundle, Closeable {
49+
public class AppSecRequestContext implements DataBundle, Closeable, AppSecContext {
4950
private static final Logger log = LoggerFactory.getLogger(AppSecRequestContext.class);
5051

5152
public static final int DEFAULT_EXTENDED_DATA_COLLECTION_MAX_HEADERS = 50;

dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/main/java/datadog/trace/instrumentation/aws/v1/lambda/LambdaHandlerInstrumentation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ static void exit(
126126
}
127127
String lambdaRequestId = awsContext.getAwsRequestId();
128128

129-
AgentTracer.get().notifyAppSecEnd(span);
129+
if (throwable == null) {
130+
AgentTracer.get().notifyAppSecEnd(span, result);
131+
}
130132
// Force the resource name back to the literal placeholder marker right
131133
// before finish so that the Datadog Lambda Extension's filter
132134
// (filter_span_from_lambda_library_or_runtime in

dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/groovy/LambdaHandlerInstrumentationTest.groovy

Lines changed: 0 additions & 294 deletions
This file was deleted.

dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/groovy/HandlerStreaming.java renamed to dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreaming.java

File renamed without changes.

dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/groovy/HandlerStreamingSimulatesHttpFrameworkResource.java renamed to dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingSimulatesHttpFrameworkResource.java

File renamed without changes.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import com.amazonaws.services.lambda.runtime.Context;
2+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
3+
import java.io.BufferedWriter;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.io.OutputStream;
7+
import java.io.OutputStreamWriter;
8+
import java.io.PrintWriter;
9+
import java.nio.charset.StandardCharsets;
10+
11+
public class HandlerStreamingWith404Response implements RequestStreamHandler {
12+
@Override
13+
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
14+
throws IOException {
15+
PrintWriter writer =
16+
new PrintWriter(
17+
new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)));
18+
writer.write(
19+
"{\"statusCode\": 404, "
20+
+ "\"headers\": {\"content-type\": \"text/html\"}, "
21+
+ "\"body\": \"Not Found\"}");
22+
writer.close();
23+
}
24+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import com.amazonaws.services.lambda.runtime.Context;
2+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
3+
import java.io.BufferedWriter;
4+
import java.io.IOException;
5+
import java.io.InputStream;
6+
import java.io.OutputStream;
7+
import java.io.OutputStreamWriter;
8+
import java.io.PrintWriter;
9+
import java.nio.charset.StandardCharsets;
10+
11+
public class HandlerStreamingWithApiGwResponse implements RequestStreamHandler {
12+
@Override
13+
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
14+
throws IOException {
15+
PrintWriter writer =
16+
new PrintWriter(
17+
new BufferedWriter(new OutputStreamWriter(outputStream, StandardCharsets.UTF_8)));
18+
writer.write(
19+
"{\"statusCode\": 200, "
20+
+ "\"headers\": {\"content-type\": \"application/json\", \"x-custom\": \"custom-val\"}, "
21+
+ "\"body\": \"{\\\"result\\\": \\\"ok\\\"}\"}");
22+
writer.close();
23+
}
24+
}

dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/groovy/HandlerStreamingWithError.java renamed to dd-java-agent/instrumentation/aws-java/aws-java-lambda-handler-1.2/src/test/java/HandlerStreamingWithError.java

File renamed without changes.
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import com.amazonaws.services.lambda.runtime.Context;
2+
import com.amazonaws.services.lambda.runtime.RequestStreamHandler;
3+
import java.io.IOException;
4+
import java.io.InputStream;
5+
import java.io.OutputStream;
6+
import java.nio.charset.StandardCharsets;
7+
8+
/** Writes valid JSON that is not in API Gateway response format (no statusCode/headers/body). */
9+
public class HandlerStreamingWithRawJson implements RequestStreamHandler {
10+
@Override
11+
public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context)
12+
throws IOException {
13+
outputStream.write("{\"result\": \"hello\"}".getBytes(StandardCharsets.UTF_8));
14+
}
15+
}

0 commit comments

Comments
 (0)