Line data Source code
1 : #ifndef DDEBUG
2 : #define DDEBUG 0
3 : #endif
4 : #include "ddebug.h"
5 :
6 : #include <ndk.h>
7 : #include "ngx_http_set_quote_json.h"
8 :
9 : ngx_int_t
10 0 : ngx_http_set_misc_quote_json_str(ngx_http_request_t *r, ngx_str_t *res,
11 : ngx_http_variable_value_t *v)
12 : {
13 : size_t len;
14 : u_char *p;
15 : size_t escape;
16 :
17 0 : if (v->not_found || v->len == 0) {
18 0 : res->data = (u_char *) "null";
19 0 : res->len = sizeof("null") - 1;
20 0 : return NGX_OK;
21 : }
22 :
23 0 : escape = ngx_http_set_misc_escape_json_str(NULL, v->data, v->len);
24 :
25 0 : len = sizeof("''") - 1
26 0 : + v->len
27 0 : + escape;
28 :
29 0 : p = ngx_palloc(r->pool, len);
30 0 : if (p == NULL) {
31 0 : return NGX_ERROR;
32 : }
33 :
34 0 : res->data = p;
35 0 : res->len = len;
36 :
37 0 : *p++ = '\"';
38 :
39 0 : if (escape == 0) {
40 0 : p = ngx_copy(p, v->data, v->len);
41 :
42 : } else {
43 0 : p = (u_char *) ngx_http_set_misc_escape_json_str(p, v->data, v->len);
44 : }
45 :
46 0 : *p++ = '\"';
47 :
48 0 : if (p != res->data + res->len) {
49 0 : ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,
50 : "set_quote_sql_str: buffer error");
51 0 : return NGX_ERROR;
52 : }
53 :
54 0 : return NGX_OK;
55 : }
56 :
57 :
58 : uintptr_t
59 0 : ngx_http_set_misc_escape_json_str(u_char *dst, u_char *src, size_t size)
60 : {
61 : ngx_uint_t n;
62 :
63 : static u_char hex[] = "0123456789abcdef";
64 :
65 0 : if (dst == NULL) {
66 : /* find the number of characters to be escaped */
67 :
68 0 : n = 0;
69 :
70 0 : while (size) {
71 : /* UTF-8 char has high bit of 1 */
72 0 : if ((*src & 0x80) == 0) {
73 0 : switch (*src) {
74 0 : case '\r':
75 : case '\n':
76 : case '\\':
77 : case '"':
78 : case '\f':
79 : case '\b':
80 : case '\t':
81 0 : n++;
82 0 : break;
83 0 : default:
84 0 : if (*src < 32) {
85 0 : n += sizeof("\\u00xx") - 2;
86 : }
87 :
88 0 : break;
89 : }
90 0 : }
91 :
92 0 : src++;
93 0 : size--;
94 : }
95 :
96 0 : return (uintptr_t) n;
97 : }
98 :
99 0 : while (size) {
100 0 : if ((*src & 0x80) == 0) {
101 0 : switch (*src) {
102 0 : case '\r':
103 0 : *dst++ = '\\';
104 0 : *dst++ = 'r';
105 0 : break;
106 :
107 0 : case '\n':
108 0 : *dst++ = '\\';
109 0 : *dst++ = 'n';
110 0 : break;
111 :
112 0 : case '\\':
113 0 : *dst++ = '\\';
114 0 : *dst++ = '\\';
115 0 : break;
116 :
117 0 : case '"':
118 0 : *dst++ = '\\';
119 0 : *dst++ = '"';
120 0 : break;
121 :
122 0 : case '\f':
123 0 : *dst++ = '\\';
124 0 : *dst++ = 'f';
125 0 : break;
126 :
127 0 : case '\b':
128 0 : *dst++ = '\\';
129 0 : *dst++ = 'b';
130 0 : break;
131 :
132 0 : case '\t':
133 0 : *dst++ = '\\';
134 0 : *dst++ = 't';
135 0 : break;
136 :
137 0 : default:
138 0 : if (*src < 32) { /* control chars */
139 0 : *dst++ = '\\';
140 0 : *dst++ = 'u';
141 0 : *dst++ = '0';
142 0 : *dst++ = '0';
143 0 : *dst++ = hex[*src >> 4];
144 0 : *dst++ = hex[*src & 0x0f];
145 : } else {
146 0 : *dst++ = *src;
147 : }
148 0 : break;
149 : } /* switch */
150 :
151 0 : src++;
152 :
153 : } else {
154 0 : *dst++ = *src++;
155 : }
156 :
157 0 : size--;
158 : }
159 :
160 0 : return (uintptr_t) dst;
161 : }
162 :
163 :
|