src/server/webdav/multistatus.c

changeset 509
2e29d0c2fb3b
parent 508
fb1a51e7954f
child 510
379fe1856800
equal deleted inserted replaced
508:fb1a51e7954f 509:2e29d0c2fb3b
91 writer_put_lit(out, "=\""); 91 writer_put_lit(out, "=\"");
92 writer_put_str(out, (char*)ns->href); 92 writer_put_str(out, (char*)ns->href);
93 writer_putc (out, '\"'); 93 writer_putc (out, '\"');
94 } 94 }
95 95
96
97 // html escape
98 /*
96 static void send_string_escaped(Writer *out, cxmutstr str) { 99 static void send_string_escaped(Writer *out, cxmutstr str) {
97 char *begin = str.ptr; 100 char *begin = str.ptr;
98 char *end = begin; 101 char *end = begin;
99 char *escape = NULL; 102 char *escape = NULL;
100 int esclen; 103 int esclen;
101 for(size_t i=0;i<str.length;i++) { 104 for(size_t i=0;i<str.length;i++) {
102 char c = str.ptr[i]; 105 char c = str.ptr[i];
103 end = str.ptr + i; 106 end = str.ptr + i;
104 switch(c) { 107 switch(c) {
105 /*
106 case '"': { 108 case '"': {
107 escape = "&quot;"; 109 escape = "&quot;";
108 esclen = 6; 110 esclen = 6;
109 break; 111 break;
110 } 112 }
126 case '>': { 128 case '>': {
127 escape = "&gt;"; 129 escape = "&gt;";
128 esclen = 4; 130 esclen = 4;
129 break; 131 break;
130 } 132 }
131 */
132 case ' ': {
133 escape = "%20";
134 esclen = 3;
135 break;
136 }
137 case '&': {
138 escape = "%26";
139 esclen = 3;
140 break;
141 }
142 default: continue; 133 default: continue;
143 } 134 }
144 ptrdiff_t len = end - begin; 135 ptrdiff_t len = end - begin;
145 if(len > 0) { 136 if(len > 0) {
146 writer_put(out, begin, len); 137 writer_put(out, begin, len);
147 begin = end + 1; 138 begin = end + 1;
148 } 139 }
149 writer_put(out, escape, esclen); 140 writer_put(out, escape, esclen);
141 }
142 ptrdiff_t len = end - begin;
143 if(len > 0) {
144 writer_put(out, begin, len + 1);
145 begin = end + 1;
146 }
147 }
148 */
149
150 static const char hex_ch[] = "0123456789ABCDEF";
151
152 static void send_string_escaped(Writer *out, cxmutstr str) {
153 char *begin = str.ptr;
154 char *end = begin;
155
156 char escape[4];
157 escape[0] = '%';
158
159 for(size_t i=0;i<str.length;i++) {
160 unsigned char c = (unsigned char)str.ptr[i];
161 end = str.ptr + i;
162
163 // check if the character must be escaped
164 if( (c >= 'A' && c <= 'Z') ||
165 (c >= 'a' && c <= 'z') ||
166 (c >= '/' && c <= '9') ||
167 (strchr("_.\\-~", c) != NULL))
168 {
169 continue;
170 }
171
172 // convert char to hex number, escape[0] always contains '%'
173 escape[1] = hex_ch[(c >> 4) & 0x0F];
174 escape[2] = hex_ch[c & 0x0F];
175
176 // write previous unescaped chars, if available
177 ptrdiff_t len = end - begin;
178 if(len > 0) {
179 writer_put(out, begin, len);
180 }
181
182 // write escaped char
183 writer_put(out, escape, 3);
184
185 // begin next chunk
186 begin = end + 1;
150 } 187 }
151 ptrdiff_t len = end - begin; 188 ptrdiff_t len = end - begin;
152 if(len > 0) { 189 if(len > 0) {
153 writer_put(out, begin, len + 1); 190 writer_put(out, begin, len + 1);
154 begin = end + 1; 191 begin = end + 1;

mercurial