]> git.kaiwu.me - nginx.git/commitdiff
Core: improved JSON escaping.
authorValentin Bartenev <vbart@nginx.com>
Wed, 12 Apr 2017 19:47:57 +0000 (22:47 +0300)
committerValentin Bartenev <vbart@nginx.com>
Wed, 12 Apr 2017 19:47:57 +0000 (22:47 +0300)
Two-character representations are now used for \b, \f, \n, \r, and \t.

src/core/ngx_string.c

index 7a73ef527e891056968cd65b791bbbec27361fa2..7526f60d262ff9f423a390a7b0129f097e4ff795 100644 (file)
@@ -1808,7 +1808,19 @@ ngx_escape_json(u_char *dst, u_char *src, size_t size)
                 len++;
 
             } else if (ch <= 0x1f) {
-                len += sizeof("\\u001F") - 2;
+
+                switch (ch) {
+                case '\n':
+                case '\r':
+                case '\t':
+                case '\b':
+                case '\f':
+                    len++;
+                    break;
+
+                default:
+                    len += sizeof("\\u001F") - 2;
+                }
             }
 
             size--;
@@ -1829,12 +1841,37 @@ ngx_escape_json(u_char *dst, u_char *src, size_t size)
             *dst++ = ch;
 
         } else {
-            *dst++ = '\\'; *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';
-            *dst++ = '0' + (ch >> 4);
+            *dst++ = '\\';
+
+            switch (ch) {
+            case '\n':
+                *dst++ = 'n';
+                break;
+
+            case '\r':
+                *dst++ = 'r';
+                break;
 
-            ch &= 0xf;
+            case '\t':
+                *dst++ = 't';
+                break;
+
+            case '\b':
+                *dst++ = 'b';
+                break;
+
+            case '\f':
+                *dst++ = 'f';
+                break;
 
-            *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);
+            default:
+                *dst++ = 'u'; *dst++ = '0'; *dst++ = '0';
+                *dst++ = '0' + (ch >> 4);
+
+                ch &= 0xf;
+
+                *dst++ = (ch < 10) ? ('0' + ch) : ('A' + ch - 10);
+            }
         }
 
         size--;