X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=22542083ee1e88b3a01bbbe46909ae644f1dc281;hp=33cd17d1009c6adf5efc5050f3561a363725ac7d;hb=dbc4ec02cd319000b5c8589910047cfe6d5738be;hpb=562b92bca8c6c98f2358b429d8113861e49877a2 diff --git a/http_api.c b/http_api.c index 33cd17d..2254208 100644 --- a/http_api.c +++ b/http_api.c @@ -33,6 +33,11 @@ PHP_MINIT_FUNCTION(http_support) HTTP_LONG_CONSTANT("HTTP_SUPPORT_ENCODINGS", HTTP_SUPPORT_ENCODINGS); HTTP_LONG_CONSTANT("HTTP_SUPPORT_SSLREQUESTS", HTTP_SUPPORT_SSLREQUESTS); + HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_COMMA", HTTP_PARAMS_ALLOW_COMMA); + HTTP_LONG_CONSTANT("HTTP_PARAMS_ALLOW_FAILURE", HTTP_PARAMS_ALLOW_FAILURE); + HTTP_LONG_CONSTANT("HTTP_PARAMS_RAISE_ERROR", HTTP_PARAMS_RAISE_ERROR); + HTTP_LONG_CONSTANT("HTTP_PARAMS_DEFAULT", HTTP_PARAMS_DEFAULT); + return SUCCESS; } @@ -154,8 +159,7 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header PHPWRITE(body, strlen(body)); } - switch (status) - { + switch (status) { case 301: http_log(HTTP_G->log.redirect, "301-REDIRECT", header); break; case 302: http_log(HTTP_G->log.redirect, "302-REDIRECT", header); break; case 303: http_log(HTTP_G->log.redirect, "303-REDIRECT", header); break; @@ -317,7 +321,7 @@ PHP_HTTP_API void _http_parse_params_default_callback(void *arg, const char *key /* }}} */ /* {{{ STATUS http_parse_params(const char *, HashTable *) */ -PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep, http_parse_params_callback cb, void *cb_arg TSRMLS_DC) +PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int flags, http_parse_params_callback cb, void *cb_arg TSRMLS_DC) { #define ST_QUOTE 1 #define ST_VALUE 2 @@ -358,12 +362,12 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep st == ST_ASSIGN ? "ASSIGN" : st == ST_ADD ? "ADD": "HUH?" - ), *c, tk, tv + ), *c?*c:'0', tk, tv ); STR_FREE(tk); STR_FREE(tv); #endif - switch (st) - { + continued: + switch (st) { case ST_QUOTE: quote: if (*c == '"') { @@ -382,38 +386,39 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep st = ST_ADD; } } - break; + break; case ST_VALUE: - switch (*c) - { + switch (*c) { case '"': if (!val) { st = ST_QUOTE; } - break; + break; case ' ': - break; + break; case ';': case '\0': goto add; - break; - + break; + case ',': + if (flags & HTTP_PARAMS_ALLOW_COMMA) { + goto add; + } default: if (!val) { val = c; } - break; + break; } - break; + break; case ST_KEY: - switch (*c) - { + switch (*c) { case ',': - if (allow_comma_sep) { + if (flags & HTTP_PARAMS_ALLOW_COMMA) { goto allow_comma; } case '\r': @@ -422,7 +427,7 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep case '\013': case '\014': goto failure; - break; + break; case '=': if (key) { @@ -431,41 +436,41 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep } else { goto failure; } - break; + break; case ' ': if (key) { keylen = c - key; st = ST_ASSIGN; } - break; + break; case ';': case '\0': allow_comma: if (key) { - keylen = c - key; + keylen = c-- - key; st = ST_ADD; } - break; + break; default: if (!key) { key = c; } - break; + break; } - break; + break; case ST_ASSIGN: if (*c == '=') { st = ST_VALUE; - } else if (!*c || *c == ';') { + } else if (!*c || *c == ';' || ((flags & HTTP_PARAMS_ALLOW_COMMA) && *c == ',')) { st = ST_ADD; } else if (*c != ' ') { goto failure; } - break; + break; case ST_ADD: add: @@ -484,9 +489,8 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep st = ST_KEY; key = val = NULL; keylen = vallen = 0; - break; + break; } - if (*c) { ++c; } else if (st == ST_ADD) { @@ -500,7 +504,14 @@ PHP_HTTP_API STATUS _http_parse_params_ex(const char *param, int allow_comma_sep return SUCCESS; failure: - http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Unexpected character (%c) at pos %tu of %zu", *c, c-s, strlen(s)); + if (flags & HTTP_PARAMS_RAISE_ERROR) { + http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Unexpected character (%c) at pos %tu of %zu", *c, c-s, strlen(s)); + } + if (flags & HTTP_PARAMS_ALLOW_FAILURE) { + --c; + st = ST_ADD; + goto continued; + } efree(s); return FAILURE; }