aboutsummaryrefslogtreecommitdiffstats
path: root/html.c
diff options
context:
space:
mode:
Diffstat (limited to 'html.c')
-rw-r--r--html.c66
1 files changed, 10 insertions, 56 deletions
diff --git a/html.c b/html.c
index d89df3a..e7e6e07 100644
--- a/html.c
+++ b/html.c
@@ -8,6 +8,7 @@
8 8
9#include "cgit.h" 9#include "cgit.h"
10#include "html.h" 10#include "html.h"
11#include "url.h"
11 12
12/* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */ 13/* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */
13static const char* url_escape_table[256] = { 14static const char* url_escape_table[256] = {
@@ -337,64 +338,17 @@ int html_include(const char *filename)
337 return 0; 338 return 0;
338} 339}
339 340
340static int hextoint(char c) 341void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value))
341{ 342{
342 if (c >= 'a' && c <= 'f') 343 const char *t = txt;
343 return 10 + c - 'a';
344 else if (c >= 'A' && c <= 'F')
345 return 10 + c - 'A';
346 else if (c >= '0' && c <= '9')
347 return c - '0';
348 else
349 return -1;
350}
351
352static char *convert_query_hexchar(char *txt)
353{
354 int d1, d2, n;
355 n = strlen(txt);
356 if (n < 3) {
357 *txt = '\0';
358 return txt-1;
359 }
360 d1 = hextoint(*(txt + 1));
361 d2 = hextoint(*(txt + 2));
362 if (d1 < 0 || d2 < 0) {
363 memmove(txt, txt + 3, n - 2);
364 return txt-1;
365 } else {
366 *txt = d1 * 16 + d2;
367 memmove(txt + 1, txt + 3, n - 2);
368 return txt;
369 }
370}
371 344
372int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) 345 while (t && *t) {
373{ 346 char *name = url_decode_parameter_name(&t);
374 char *o, *t, *txt, *value = NULL, c; 347 if (*name) {
375 348 char *value = url_decode_parameter_value(&t);
376 if (!txt_) 349 fn(name, value);
377 return 0; 350 free(value);
378
379 o = t = txt = xstrdup(txt_);
380 while ((c=*t) != '\0') {
381 if (c == '=') {
382 *t = '\0';
383 value = t + 1;
384 } else if (c == '+') {
385 *t = ' ';
386 } else if (c == '%') {
387 t = convert_query_hexchar(t);
388 } else if (c == '&') {
389 *t = '\0';
390 (*fn)(txt, value);
391 txt = t + 1;
392 value = NULL;
393 } 351 }
394 t++; 352 free(name);
395 } 353 }
396 if (t != txt)
397 (*fn)(txt, value);
398 free(o);
399 return 0;
400} 354}