about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2014-12-22 12:54:32 -0800
committerAlex Crichton <alex@alexcrichton.com>2014-12-22 15:17:22 -0800
commit8824c39945cf8cbdd0e1a07824e3d2f4823b8e7b (patch)
treec6384fcca253dd02b4b3de7f01079184ec63ef86
parent0a07db438be8ce8ce969b1244e8796d65a964d31 (diff)
parent0a7ef3f6cc7967feeb9c66a4f499ccbd515c67f6 (diff)
rollup merge of #20089: rolftimmermans/json-control-chars-escape
Conflicts:
	src/libserialize/json.rs
-rw-r--r--AUTHORS.txt1
-rw-r--r--src/libserialize/json.rs37
2 files changed, 35 insertions, 3 deletions
diff --git a/AUTHORS.txt b/AUTHORS.txt
index 83f9bbff8aa..9aa09ac1763 100644
--- a/AUTHORS.txt
+++ b/AUTHORS.txt
@@ -498,6 +498,7 @@ Robert Irelan <rirelan@gmail.com>
 Robert Knight <robertknight@gmail.com>
 Robert Millar <robert.millar@cantab.net>
 Roland Tanglao <roland@rolandtanglao.com>
+Rolf Timmermans <r.w.timmermans@gmail.com>
 Ron Dahlgren <ronald.dahlgren@gmail.com>
 Roy Frostig <rfrostig@mozilla.com>
 Russell <rpjohnst@gmail.com>
diff --git a/src/libserialize/json.rs b/src/libserialize/json.rs
index b945bced512..7df5590fb40 100644
--- a/src/libserialize/json.rs
+++ b/src/libserialize/json.rs
@@ -334,11 +334,39 @@ pub fn escape_bytes(wr: &mut io::Writer, bytes: &[u8]) -> Result<(), io::IoError
         let escaped = match *byte {
             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'\x0c' => "\\f",
+            b'\t' => "\\t",
             b'\n' => "\\n",
+            b'\x0b' => "\\u000b",
+            b'\x0c' => "\\f",
             b'\r' => "\\r",
-            b'\t' => "\\t",
+            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; }
         };
 
@@ -2731,7 +2759,10 @@ mod tests {
     fn test_write_char() {
         check_encoder_for_simple!('a', "\"a\"");
         check_encoder_for_simple!('\t', "\"\\t\"");
-        check_encoder_for_simple!('\u{a0}', "\"\u{a0}\"");
+        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}\"");
     }