Skip to content

Commit 819f72a

Browse files
committed
reducing scope to package-private, fixing corner case and generalizing truncate method
1 parent 1f60a64 commit 819f72a

File tree

5 files changed

+48
-44
lines changed

5 files changed

+48
-44
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
# CHANGELOG
22

33
## Version 1.0.10
4-
- Fix issue of sending custom event.
4+
- Fixed Exceeded property length leads to lost event.
5+
- Fixed issue of sending custom event.
56
- Method `sanitizeStringForJSON` takes string input and converts it to JSON friendly string.
6-
- Class `com.microsoft.applicationinsights.common.SanitizationUtils` has methods to sanitize string for JSON.
7+
- Class `com.microsoft.applicationinsights.telemetry.SanitizationUtils` has methods to sanitize string for JSON.
78
- Fixed Request Telemetry Sending bug with new schema.
89
- Fixed reliability issue with Jedis client dependency collector
910
- Fixed Request Telemetry Sending bug with new schema

core/src/main/java/com/microsoft/applicationinsights/telemetry/JsonTelemetryDataSerializer.java

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,16 @@
2121

2222
package com.microsoft.applicationinsights.telemetry;
2323

24+
import com.google.common.base.Strings;
25+
import com.microsoft.applicationinsights.internal.schemav2.DataPointType;
26+
import com.microsoft.applicationinsights.internal.util.LocalStringsUtils;
27+
2428
import java.io.BufferedWriter;
2529
import java.io.IOException;
2630
import java.io.StringWriter;
2731
import java.io.Writer;
2832
import java.util.*;
2933

30-
import com.google.common.base.Strings;
31-
32-
import com.microsoft.applicationinsights.common.SanitizationUtils;
33-
import com.microsoft.applicationinsights.internal.schemav2.*;
34-
import com.microsoft.applicationinsights.internal.util.LocalStringsUtils;
35-
3634
/**
3735
* This class knows how to transform data that is relevant to {@link Telemetry} instances into JSON.
3836
*/
@@ -274,9 +272,10 @@ private <T> void write(T item) throws IOException {
274272
{
275273
out.write(String.valueOf(item));
276274
} else {
277-
String sanitizedItem = SanitizationUtils.sanitizeStringForJSON(String.valueOf(item));
275+
String truncatedName = truncate(String.valueOf(item), 8192);
276+
String sanitizedItem = SanitizationUtils.sanitizeStringForJSON(truncatedName, false);
278277
out.write(JSON_COMMA);
279-
out.write(truncateValueToMaxLength(sanitizedItem));
278+
out.write(sanitizedItem);
280279
out.write(JSON_COMMA);
281280
}
282281
}
@@ -297,10 +296,11 @@ private <T extends JsonSerializable> String createJsonFor(T value) throws IOExce
297296
}
298297

299298
private void writeName(String name) throws IOException {
300-
String sanitizedName = SanitizationUtils.sanitizeStringForJSON(name);
299+
String truncatedString = truncate(name, 150);
300+
String sanitizedName = SanitizationUtils.sanitizeStringForJSON(truncatedString, true);
301301
out.write(separator);
302302
out.write(JSON_COMMA);
303-
out.write(truncateKeyToMaxLength(sanitizedName));
303+
out.write(sanitizedName);
304304
out.write(JSON_COMMA);
305305
out.write(JSON_NAME_VALUE_SEPARATOR);
306306
}
@@ -351,17 +351,11 @@ protected void writeEscapedString(String value) throws IOException {
351351
}
352352
}
353353

354-
private String truncateValueToMaxLength(String value) {
355-
if (value.length() > 8192) {
356-
return value.substring(0, 8192);
354+
private String truncate(String value, int len) {
355+
if (value.length() > len) {
356+
return value.substring(0, len);
357357
}
358358
return value;
359359
}
360360

361-
private String truncateKeyToMaxLength(String key) {
362-
if (key.length() > 150) {
363-
return key.substring(0, 150);
364-
}
365-
return key;
366-
}
367361
}

core/src/main/java/com/microsoft/applicationinsights/common/SanitizationUtils.java renamed to core/src/main/java/com/microsoft/applicationinsights/telemetry/SanitizationUtils.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.microsoft.applicationinsights.common;
1+
package com.microsoft.applicationinsights.telemetry;
22

33
import java.text.StringCharacterIterator;
44

@@ -8,19 +8,22 @@
88
* This class provides utility functions to sanitize strings
99
* for various formats. Currently it supports JSON sanitization
1010
*/
11-
public final class SanitizationUtils {
11+
final class SanitizationUtils {
1212

1313
/**
1414
* This method appends escape characters to input String to prevent
1515
* JSON Sanitization failure
1616
* @param text
1717
* @return Sanitized String suitable for JSON
1818
*/
19-
public static String sanitizeStringForJSON(String text) {
19+
static String sanitizeStringForJSON(String text, boolean isKey) {
2020

2121
final StringBuilder result = new StringBuilder();
2222
StringCharacterIterator iterator = new StringCharacterIterator(text);
23-
for (char curr = iterator.current(); curr != iterator.DONE; curr = iterator.next()) {
23+
24+
// allowing delta for the characters to be appended
25+
int maxAllowedLength = isKey ? 148 : 8190;
26+
for (char curr = iterator.current(); curr != iterator.DONE && result.length() < maxAllowedLength; curr = iterator.next()) {
2427
if( curr == '\"' ){
2528
result.append("\\\"");
2629
}
@@ -52,8 +55,13 @@ else if (!Character.isISOControl(curr)){
5255
result.append(curr);
5356
}
5457
else {
55-
result.append("\\u");
56-
result.append((String.format( "%04x", Integer.valueOf(curr))));
58+
if (result.length() + 7 < 8192) { // needs 7 more character space to be appended
59+
result.append("\\u");
60+
result.append((String.format( "%04x", Integer.valueOf(curr))));
61+
}
62+
else {
63+
break;
64+
}
5765
}
5866
}
5967
return result.toString();

core/src/test/java/com/microsoft/applicationinsights/common/SanitizationUtilsTests.java

Lines changed: 0 additions & 17 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.microsoft.applicationinsights.telemetry;
2+
3+
import com.microsoft.applicationinsights.telemetry.SanitizationUtils;
4+
import org.junit.Assert;
5+
import org.junit.Test;
6+
7+
public class SanitizationUtilsTests {
8+
9+
@Test
10+
public void testSanitizeStringForJSON() {
11+
12+
String result1 = SanitizationUtils.sanitizeStringForJSON("\\'\\f\\b\\f\\n\\r\\t/\\", false);
13+
Assert.assertEquals(result1, "\\\\\\'\\\\f\\\\b\\\\f\\\\n\\\\r\\\\t\\/\\\\");
14+
15+
String resultControlCharVer = SanitizationUtils.sanitizeStringForJSON("\u0000", true);
16+
Assert.assertEquals(resultControlCharVer, "\\u0000");
17+
}
18+
}

0 commit comments

Comments
 (0)