Skip to content

Commit 80eac46

Browse files
committed
Fix tryCommitBlockingResponse return-value check; simplify appsec guard; add play-2.5 unit tests
1 parent 8122a27 commit 80eac46

3 files changed

Lines changed: 112 additions & 9 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package datadog.trace.instrumentation.play25.appsec;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNull;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import java.math.BigDecimal;
8+
import java.util.List;
9+
import java.util.Map;
10+
import org.junit.jupiter.api.Test;
11+
import play.api.libs.json.JsValue;
12+
13+
class BodyParserHelpersTest {
14+
15+
private static JsValue parse(String json) {
16+
return play.api.libs.json.Json$.MODULE$.parse(json);
17+
}
18+
19+
@Test
20+
void jsValueToJavaObject_nullInputReturnsNull() {
21+
assertNull(BodyParserHelpers.jsValueToJavaObject(null));
22+
}
23+
24+
@Test
25+
void jsValueToJavaObject_jsNullReturnsNull() {
26+
assertNull(BodyParserHelpers.jsValueToJavaObject(parse("null")));
27+
}
28+
29+
@Test
30+
void jsValueToJavaObject_string() {
31+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("\"hello\""));
32+
assertEquals("hello", result);
33+
}
34+
35+
@Test
36+
void jsValueToJavaObject_number() {
37+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("42"));
38+
assertTrue(result instanceof BigDecimal);
39+
assertEquals(0, ((BigDecimal) result).compareTo(new BigDecimal("42")));
40+
}
41+
42+
@Test
43+
void jsValueToJavaObject_booleanTrue() {
44+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("true"));
45+
assertEquals(Boolean.TRUE, result);
46+
}
47+
48+
@Test
49+
void jsValueToJavaObject_booleanFalse() {
50+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("false"));
51+
assertEquals(Boolean.FALSE, result);
52+
}
53+
54+
@Test
55+
@SuppressWarnings("unchecked")
56+
void jsValueToJavaObject_object() {
57+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("{\"key\":\"value\",\"num\":1}"));
58+
assertTrue(result instanceof Map);
59+
Map<String, Object> map = (Map<String, Object>) result;
60+
assertEquals("value", map.get("key"));
61+
assertTrue(map.get("num") instanceof BigDecimal);
62+
}
63+
64+
@Test
65+
@SuppressWarnings("unchecked")
66+
void jsValueToJavaObject_array() {
67+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("[\"a\",\"b\",\"c\"]"));
68+
assertTrue(result instanceof List);
69+
List<Object> list = (List<Object>) result;
70+
assertEquals(3, list.size());
71+
assertEquals("a", list.get(0));
72+
assertEquals("b", list.get(1));
73+
assertEquals("c", list.get(2));
74+
}
75+
76+
@Test
77+
@SuppressWarnings("unchecked")
78+
void jsValueToJavaObject_nestedObject() {
79+
Object result =
80+
BodyParserHelpers.jsValueToJavaObject(parse("{\"outer\":{\"inner\":\"deep\"}}"));
81+
assertTrue(result instanceof Map);
82+
Map<String, Object> outer = (Map<String, Object>) result;
83+
assertTrue(outer.get("outer") instanceof Map);
84+
Map<String, Object> inner = (Map<String, Object>) outer.get("outer");
85+
assertEquals("deep", inner.get("inner"));
86+
}
87+
88+
@Test
89+
void jsValueToJavaObject_zeroRecursionReturnsNull() {
90+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("{\"key\":\"value\"}"), 0);
91+
assertNull(result);
92+
}
93+
94+
@Test
95+
@SuppressWarnings("unchecked")
96+
void jsValueToJavaObject_recursionLimitTruncatesNesting() {
97+
// depth=1: outer object is converted, but children exceed the limit and become null
98+
Object result = BodyParserHelpers.jsValueToJavaObject(parse("{\"a\":{\"b\":\"val\"}}"), 1);
99+
assertTrue(result instanceof Map);
100+
Map<String, Object> map = (Map<String, Object>) result;
101+
assertNull(map.get("a"));
102+
}
103+
}

dd-java-agent/instrumentation/play/play-appsec-2.6/src/main/java/datadog/trace/instrumentation/play26/appsec/BodyParserHelpers.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,14 +142,11 @@ private static MultipartFormData<?> handleMultipartFormData(MultipartFormData<?>
142142
}
143143

144144
private static void handleMultipartFilenames(Iterator<?> iterator) {
145-
AgentSpan span = activeSpan();
146-
if (span == null) {
145+
if (!isAppsecActiveForRequest()) {
147146
return;
148147
}
148+
AgentSpan span = activeSpan();
149149
RequestContext reqCtx = span.getRequestContext();
150-
if (reqCtx == null || reqCtx.getData(RequestContextSlot.APPSEC) == null) {
151-
return;
152-
}
153150

154151
List<String> filenames = new ArrayList<>();
155152
while (iterator.hasNext()) {

dd-java-agent/instrumentation/undertow/undertow-2.0/src/main/java/datadog/trace/instrumentation/undertow/MultiPartUploadHandlerInstrumentation.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,9 @@ static void after(
102102
Flow.Action.RequestBlockingAction rba = (Flow.Action.RequestBlockingAction) action;
103103
BlockResponseFunction blockResponseFunction = reqCtx.getBlockResponseFunction();
104104
if (blockResponseFunction != null) {
105-
blockResponseFunction.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba);
106-
if (t == null) {
105+
boolean success =
106+
blockResponseFunction.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba);
107+
if (success && t == null) {
107108
t =
108109
new BlockingException(
109110
"Blocked request (for MultiPartUploadHandler/parseBlocking)");
@@ -130,8 +131,10 @@ static void after(
130131
(Flow.Action.RequestBlockingAction) filenamesAction;
131132
BlockResponseFunction brf = reqCtx.getBlockResponseFunction();
132133
if (brf != null) {
133-
brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba);
134-
t = new BlockingException("Blocked request (multipart file upload)");
134+
boolean success = brf.tryCommitBlockingResponse(reqCtx.getTraceSegment(), rba);
135+
if (success) {
136+
t = new BlockingException("Blocked request (multipart file upload)");
137+
}
135138
}
136139
}
137140
}

0 commit comments

Comments
 (0)