Skip to content

Commit 7137af6

Browse files
committed
Adding JsonBufferTest & expanding escape sequences
1 parent d1d886b commit 7137af6

File tree

2 files changed

+94
-22
lines changed

2 files changed

+94
-22
lines changed

dd-java-agent/src/main/java/datadog/trace/bootstrap/JsonBuffer.java

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -182,29 +182,49 @@ private JsonBuffer writeStringLiteral(String str) {
182182
try {
183183
writer.write('"');
184184

185-
// DQH - indexOf is usually intrinsified to use SIMD &
186-
// no escaping will be the common case
187-
if (str.indexOf('"') == -1 && str.indexOf('\\') != -1) {
188-
writer.write(str);
189-
} else {
190-
for (int i = 0; i < str.length(); ++i) {
191-
char ch = str.charAt(i);
192-
193-
switch (ch) {
194-
case '"':
195-
writer.write("\\\"");
196-
break;
197-
198-
case '\\':
199-
writer.write("\\\\");
200-
break;
201-
202-
default:
203-
writer.write(ch);
204-
break;
205-
}
185+
for (int i = 0; i < str.length(); ++i) {
186+
char ch = str.charAt(i);
187+
188+
// Based on https://keploy.io/blog/community/json-escape-and-unescape
189+
switch (ch) {
190+
case '"':
191+
writer.write("\\\"");
192+
break;
193+
194+
case '\\':
195+
writer.write("\\\\");
196+
break;
197+
198+
case '/':
199+
writer.write("\\/");
200+
break;
201+
202+
case '\b':
203+
writer.write("\\b");
204+
break;
205+
206+
case '\f':
207+
writer.write("\\f");
208+
break;
209+
210+
case '\n':
211+
writer.write("\\n");
212+
break;
213+
214+
case '\r':
215+
writer.write("\\r");
216+
break;
217+
218+
case '\t':
219+
writer.write("\\t");
220+
break;
221+
222+
default:
223+
writer.write(ch);
224+
break;
206225
}
207-
}
226+
}
227+
208228
writer.write('"');
209229
} catch (IOException e) {
210230
// ignore
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package datadog.trace.agent
2+
3+
import datadog.trace.bootstrap.JsonBuffer
4+
import spock.lang.Specification
5+
6+
class JsonBufferTest extends Specification {
7+
def "object"() {
8+
when:
9+
def jsonBuffer = new JsonBuffer()
10+
jsonBuffer.beginObject()
11+
jsonBuffer.name("foo").value("bar")
12+
jsonBuffer.name("pi").value(3_142);
13+
jsonBuffer.name("true").value(true);
14+
jsonBuffer.name("false").value(false);
15+
jsonBuffer.endObject();
16+
17+
then:
18+
jsonBuffer.toString() == '{"foo":"bar","pi":3142,"true":true,"false":false}'
19+
}
20+
21+
def "array"() {
22+
when:
23+
def jsonBuffer = new JsonBuffer()
24+
jsonBuffer.beginArray()
25+
jsonBuffer.value("foo");
26+
jsonBuffer.value("baz");
27+
jsonBuffer.value("bar");
28+
jsonBuffer.value("quux");
29+
jsonBuffer.endArray();
30+
31+
then:
32+
jsonBuffer.toString() == '["foo","baz","bar","quux"]'
33+
}
34+
35+
def "escaping"() {
36+
when:
37+
def jsonBuffer = new JsonBuffer()
38+
jsonBuffer.beginArray();
39+
jsonBuffer.value('"');
40+
jsonBuffer.value("\\");
41+
jsonBuffer.value("/");
42+
jsonBuffer.value("\b");
43+
jsonBuffer.value("\f");
44+
jsonBuffer.value("\n");
45+
jsonBuffer.value("\r");
46+
jsonBuffer.value("\t");
47+
jsonBuffer.endArray();
48+
49+
then:
50+
jsonBuffer.toString() == '["\\"","\\\\","\\/","\\b","\\f","\\n","\\r","\\t"]'
51+
}
52+
}

0 commit comments

Comments
 (0)