X-Git-Url: https://gitweb.ps.run/ps-cgit/blobdiff_plain/fb2c71fad23f4f13f56f74a8b79907805ab1b772..c330a2e5f86e1f77d3b724877935e11014cefa21:/html.c diff --git a/html.c b/html.c index 959148c..e7e6e07 100644 --- a/html.c +++ b/html.c @@ -8,6 +8,7 @@ #include "cgit.h" #include "html.h" +#include "url.h" /* Percent-encoding of each character, except: a-zA-Z0-9!$()*,./:;@- */ static const char* url_escape_table[256] = { @@ -239,6 +240,32 @@ void html_url_arg(const char *txt) html(txt); } +void html_header_arg_in_quotes(const char *txt) +{ + const char *t = txt; + while (t && *t) { + unsigned char c = *t; + const char *e = NULL; + if (c == '\\') + e = "\\\\"; + else if (c == '\r') + e = "\\r"; + else if (c == '\n') + e = "\\n"; + else if (c == '"') + e = "\\\""; + if (e) { + html_raw(txt, t - txt); + html(e); + txt = t + 1; + } + t++; + } + if (t != txt) + html(txt); + +} + void html_hidden(const char *name, const char *value) { html("= 'A' && c <= 'F') - return 10 + c - 'A'; - else if (c >= '0' && c <= '9') - return c - '0'; - else - return -1; -} - -static char *convert_query_hexchar(char *txt) +void http_parse_querystring(const char *txt, void (*fn)(const char *name, const char *value)) { - int d1, d2, n; - n = strlen(txt); - if (n < 3) { - *txt = '\0'; - return txt-1; - } - d1 = hextoint(*(txt + 1)); - d2 = hextoint(*(txt + 2)); - if (d1 < 0 || d2 < 0) { - memmove(txt, txt + 3, n - 2); - return txt-1; - } else { - *txt = d1 * 16 + d2; - memmove(txt + 1, txt + 3, n - 2); - return txt; - } -} + const char *t = txt; -int http_parse_querystring(const char *txt_, void (*fn)(const char *name, const char *value)) -{ - char *o, *t, *txt, *value = NULL, c; - - if (!txt_) - return 0; - - o = t = txt = xstrdup(txt_); - while ((c=*t) != '\0') { - if (c == '=') { - *t = '\0'; - value = t + 1; - } else if (c == '+') { - *t = ' '; - } else if (c == '%') { - t = convert_query_hexchar(t); - } else if (c == '&') { - *t = '\0'; - (*fn)(txt, value); - txt = t + 1; - value = NULL; + while (t && *t) { + char *name = url_decode_parameter_name(&t); + if (*name) { + char *value = url_decode_parameter_value(&t); + fn(name, value); + free(value); } - t++; + free(name); } - if (t != txt) - (*fn)(txt, value); - free(o); - return 0; }