From 8ef310a22a54dca7a80947f83f03bc296ab298dd Mon Sep 17 00:00:00 2001 From: Aleksey Veresov Date: Tue, 4 Feb 2020 18:14:54 +0300 Subject: [magi] --- src/urlenc.c | 135 ----------------------------------------------------------- 1 file changed, 135 deletions(-) (limited to 'src/urlenc.c') diff --git a/src/urlenc.c b/src/urlenc.c index 8c38a0a..bb0bada 100644 --- a/src/urlenc.c +++ b/src/urlenc.c @@ -2,23 +2,12 @@ #include "utils.h" #include -#include #include /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Local Shortcuts */ -/* Call only if is_hex(c). */ -static int from_hex(char c) -{ - if (isdigit(c)) { - return c - '0'; - } else { - return toupper(c) - 'A' + 10; - } -} - /* Call only if 0 <= num && num <= 15. */ static char to_hex(int num) { @@ -26,136 +15,12 @@ static char to_hex(int num) return hex[num]; } -static int is_hex(char c) -{ - return isdigit(c) || strchr("ABCDEF", toupper(c)); -} - static int is_url(char c) { return isalnum(c) || strchr("$-_.+ !*'(),", c); } -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * URL Decoding - */ -static int deurl(char ** data) -{ - char * val = *data; - int ti; - int ci; - if (!val) { - *data = malloc(1); - **data = 0; - return 1; - } - for (ti = 0, ci = 0; val[ci]; ++ti, ++ci) { - if (val[ci] == '%') { - if (is_hex(val[ci + 1]) && is_hex(val[ci + 2])) { - /* Since chars can be signed, arithmetics are not safe. */ - val[ti] = from_hex(val[ci + 2]); /* 0000xxxx */ - val[ti] |= from_hex(val[ci + 1]) << 4; /* XXXXxxxx */ - ci += 2; /* Two extra characters are readed from code. */ - } else { - return 0; - } - } else if (val[ci] == '+') { - val[ti] = ' '; - } else { - val[ti] = val[ci]; - } - } - val[ti] = 0; - return 1; -} - - -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Urlencoded Automata - */ -enum st { st_error = 0, st_name, st_data }; - -struct automata { - struct magi_param_list ** list; - struct magi_param param; - int size; - int len; -}; - - -static enum st parse_name(struct automata * a, char c) -{ - if (c == '&' || c == ';') { /* Impossible character means error. */ - return st_error; - } - if (c == '=') { /* Separator ends name. */ - a->size = 1; - a->len = 0; - return st_data; - } - - if (!magi_str_add(&a->param.name, &a->len, &a->size, c)) { - return st_error; - } - return st_name; -} - -static enum st end_data(struct automata * a) -{ - if (deurl(&a->param.name) && deurl(&a->param.data)) { - if (magi_param_list_add(a->list, &a->param)) { - a->size = 1; - a->len = 0; - a->param.name = 0; - a->param.data = 0; - return st_name; - } - } - return st_error; -} - -static enum st parse_data(struct automata * a, char c) -{ - if (c == '=') { /* Impossible character means error. */ - return st_error; - } - if (c == '&' || c == ';') { /* Separator ends data. */ - return end_data(a); - } - - if (!magi_str_add(&a->param.data, &a->len, &a->size, c)) { - return st_error; - } - return st_data; -} - -void magi_urlenc(struct magi_param_list ** list, - struct magi_request * request, - const char * encoded) -{ - enum st state; - struct automata a = { 0, { 0, 0 }, 1, 0 }; - a.list = list; - *list = 0; - if (!encoded || !*encoded) { - return; - } - for (state = st_name; state && *encoded; ++encoded) { - if (state == st_name) { - state = parse_name(&a, *encoded); - } else { - state = parse_data(&a, *encoded); - } - } - if (state == st_name || !state || !end_data(&a)) { - free(a.param.name); - free(a.param.data); - request->error = magi_error_urlenc; - } -} - - /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * URL Encoding */ -- cgit v1.2.3