From 58d1238aed283e1d85cda7c354c96409950bf19a Mon Sep 17 00:00:00 2001 From: Brandon Hill Date: Mon, 13 Apr 2015 19:37:13 -0700 Subject: [PATCH] Allows for control characters (including nul) to be correctly emitted as proper JSON. --- src/main/java/water/AutoBuffer.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/water/AutoBuffer.java b/src/main/java/water/AutoBuffer.java index 8a84f06e48..a526731886 100644 --- a/src/main/java/water/AutoBuffer.java +++ b/src/main/java/water/AutoBuffer.java @@ -1274,9 +1274,22 @@ public AutoBuffer putStr2( String s ) { put1('\\'); // The extra backslash off=i; // Advance the "so far" variable } - // Replace embedded newline & tab with quoted newlines - if( b[i] == '\n' ) { putA1(b,off,i); put1('\\'); put1('n'); off=i+1; } - if( b[i] == '\t' ) { putA1(b,off,i); put1('\\'); put1('t'); off=i+1; } + // Handle remaining special cases in JSON + if( b[i] == '/' ) { putA1(b,off,i); put1('\\'); put1('/'); off=i+1; continue;} + if( b[i] == '\b' ) { putA1(b,off,i); put1('\\'); put1('b'); off=i+1; continue;} + if( b[i] == '\f' ) { putA1(b,off,i); put1('\\'); put1('f'); off=i+1; continue;} + if( b[i] == '\n' ) { putA1(b,off,i); put1('\\'); put1('n'); off=i+1; continue;} + if( b[i] == '\r' ) { putA1(b,off,i); put1('\\'); put1('r'); off=i+1; continue;} + if( b[i] == '\t' ) { putA1(b,off,i); put1('\\'); put1('t'); off=i+1; continue;} + // ASCII Control characters + if( b[i] == 127 ) { putA1(b,off,i); put1('\\'); put1('u'); put1('0'); put1('0'); put1('0'); put1(b[i]); off=i+1; continue;} + if( b[i] >= 0 && b[i] < 32 ) { + String hexStr = Integer.toHexString(b[i]); + putA1(b, off, i); put1('\\'); put1('u'); + for (int j = 0; j < 4 - hexStr.length(); j++) put1('0'); + for (int j = 0; j < hexStr.length(); j++) put1(hexStr.charAt(hexStr.length()-j-1)); + off=i+1; + } } return putA1(b,off,b.length); }