From fc30518be9774e7661739eb29a9bca38f31505c5 Mon Sep 17 00:00:00 2001 From: Rolf Timmermans Date: Sun, 21 Dec 2014 00:04:39 +0100 Subject: [PATCH 1/4] Escape control characters in JSON output. --- src/libserialize/json.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 3181e28a121..aa628a71f4b 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -331,13 +331,14 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError for (i, byte) in bytes.iter().enumerate() { let escaped = match *byte { - b'"' => "\\\"", - b'\\' => "\\\\", - b'\x08' => "\\b", - b'\x0c' => "\\f", - b'\n' => "\\n", - b'\r' => "\\r", - b'\t' => "\\t", + b'"' => "\\\"".into_cow(), + b'\\' => "\\\\".into_cow(), + b'\x08' => "\\b".into_cow(), + b'\x0c' => "\\f".into_cow(), + b'\n' => "\\n".into_cow(), + b'\r' => "\\r".into_cow(), + b'\t' => "\\t".into_cow(), + b'\x00'...b'\x1f' | b'\x7f' => format!("\\u00{:0>2x}", *byte).into_cow(), _ => { continue; } }; @@ -345,7 +346,7 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError try!(wr.write(bytes[start..i])); } - try!(wr.write_str(escaped)); + try!(wr.write_str(escaped.deref())); start = i + 1; } @@ -2731,6 +2732,9 @@ mod tests { fn test_write_char() { check_encoder_for_simple!('a', "\"a\""); check_encoder_for_simple!('\t', "\"\\t\""); + check_encoder_for_simple!('\u{0000}', "\"\\u0000\""); + check_encoder_for_simple!('\u{001b}', "\"\\u001b\""); + check_encoder_for_simple!('\u{007f}', "\"\\u007f\""); check_encoder_for_simple!('\u{00a0}', "\"\u{00a0}\""); check_encoder_for_simple!('\u{abcd}', "\"\u{abcd}\""); check_encoder_for_simple!('\u{10ffff}', "\"\u{10ffff}\""); From 903f5c43604e5cd37fb7f2b62e356259d3043db9 Mon Sep 17 00:00:00 2001 From: Rolf Timmermans Date: Sun, 21 Dec 2014 00:40:15 +0100 Subject: [PATCH 2/4] Avoid allocations. --- src/libserialize/json.rs | 43 ++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index aa628a71f4b..9aea6648349 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -331,14 +331,41 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError for (i, byte) in bytes.iter().enumerate() { let escaped = match *byte { - b'"' => "\\\"".into_cow(), - b'\\' => "\\\\".into_cow(), - b'\x08' => "\\b".into_cow(), - b'\x0c' => "\\f".into_cow(), - b'\n' => "\\n".into_cow(), - b'\r' => "\\r".into_cow(), - b'\t' => "\\t".into_cow(), - b'\x00'...b'\x1f' | b'\x7f' => format!("\\u00{:0>2x}", *byte).into_cow(), + b'"' => "\\\"", + b'\\' => "\\\\", + b'\x00' => "\\u0000", + b'\x01' => "\\u0001", + b'\x02' => "\\u0002", + b'\x03' => "\\u0003", + b'\x04' => "\\u0004", + b'\x05' => "\\u0005", + b'\x06' => "\\u0006", + b'\x07' => "\\u0007", + b'\x08' => "\\b", + b'\t' => "\\t", + b'\n' => "\\n", + b'\x0b' => "\\u000b", + b'\x0c' => "\\f", + b'\r' => "\\r", + b'\x0e' => "\\u000e", + b'\x0f' => "\\u000f", + b'\x10' => "\\u0010", + b'\x11' => "\\u0011", + b'\x12' => "\\u0012", + b'\x13' => "\\u0013", + b'\x14' => "\\u0014", + b'\x15' => "\\u0015", + b'\x16' => "\\u0016", + b'\x17' => "\\u0017", + b'\x18' => "\\u0018", + b'\x19' => "\\u0019", + b'\x1a' => "\\u001a", + b'\x1b' => "\\u001b", + b'\x1c' => "\\u001c", + b'\x1d' => "\\u001d", + b'\x1e' => "\\u001e", + b'\x1f' => "\\u001f", + b'\x7f' => "\\u007f", _ => { continue; } }; From 82f411d8a45dca29680590199fa2e72a8553687d Mon Sep 17 00:00:00 2001 From: Rolf Timmermans Date: Sun, 21 Dec 2014 00:41:05 +0100 Subject: [PATCH 3/4] Remove unnecessary deref(). --- src/libserialize/json.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs index 9aea6648349..67d1e501584 100644 --- a/src/libserialize/json.rs +++ b/src/libserialize/json.rs @@ -373,7 +373,7 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError try!(wr.write(bytes[start..i])); } - try!(wr.write_str(escaped.deref())); + try!(wr.write_str(escaped)); start = i + 1; } From 0a7ef3f6cc7967feeb9c66a4f499ccbd515c67f6 Mon Sep 17 00:00:00 2001 From: Rolf Timmermans Date: Sun, 21 Dec 2014 11:51:28 +0100 Subject: [PATCH 4/4] Add myself to authors. --- AUTHORS.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/AUTHORS.txt b/AUTHORS.txt index 83f9bbff8aa..9aa09ac1763 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -498,6 +498,7 @@ Robert Irelan Robert Knight Robert Millar Roland Tanglao +Rolf Timmermans Ron Dahlgren Roy Frostig Russell