X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_params.c;h=be627dc4f8dd445240296290620a2a11d479b53a;hp=9ff51a75cd816244c4fd9c445ad370864f343959;hb=f753226f1f45e10ef3916256ec1bc0416c8644a8;hpb=a42f3d4cbbff728783484b5766c52c7061cdff26 diff --git a/php_http_params.c b/php_http_params.c index 9ff51a7..be627dc 100644 --- a/php_http_params.c +++ b/php_http_params.c @@ -45,6 +45,8 @@ typedef struct php_http_params_state { zval **args; zval **val; } current; + unsigned quotes:1; + unsigned escape:1; } php_http_params_state_t; static inline void sanitize_default(zval *zv TSRMLS_DC) @@ -421,12 +423,7 @@ static void push_param(HashTable *params, php_http_params_state_t *state, const MAKE_STD_ZVAL(val); if (opts->defval) { -#if PHP_VERSION_ID >= 50400 ZVAL_COPY_VALUE(val, opts->defval); -#else - val->value = opts->defval->value; - Z_TYPE_P(val) = Z_TYPE_P(opts->defval); -#endif zval_copy_ctor(val); } else { ZVAL_TRUE(val); @@ -452,6 +449,10 @@ static size_t check_sep(php_http_params_state_t *state, php_http_params_token_t { php_http_params_token_t **sep = separators; + if (state->quotes || state->escape) { + return 0; + } + if (sep) while (*sep) { if (check_str(state->input.str, state->input.len, (*sep)->str, (*sep)->len)) { return (*sep)->len; @@ -479,7 +480,7 @@ static void skip_sep(size_t skip, php_http_params_state_t *state, php_http_param PHP_HTTP_API HashTable *php_http_params_parse(HashTable *params, const php_http_params_opts_t *opts TSRMLS_DC) { - php_http_params_state_t state = {{NULL,0}, {NULL,0}, {NULL,0}, {NULL,0}, {NULL,NULL,NULL}}; + php_http_params_state_t state = {{NULL,0}, {NULL,0}, {NULL,0}, {NULL,0}, {NULL,NULL,NULL}, 0, 0}; state.input.str = opts->input.str; state.input.len = opts->input.len; @@ -490,10 +491,13 @@ PHP_HTTP_API HashTable *php_http_params_parse(HashTable *params, const php_http_ } while (state.input.len) { - if (*state.input.str == '\\') { - ++state.input.str; - --state.input.len; - } else if (!state.param.str) { + if (*state.input.str == '"' && !state.escape) { + state.quotes = !state.quotes; + } else { + state.escape = (*state.input.str == '\\'); + } + + if (!state.param.str) { /* initialize */ skip_sep(0, &state, opts->param, opts->arg, opts->val TSRMLS_CC); state.param.str = state.input.str; @@ -546,7 +550,7 @@ PHP_HTTP_API HashTable *php_http_params_parse(HashTable *params, const php_http_ } } } - + if (state.input.len) { ++state.input.str; --state.input.len; @@ -575,7 +579,7 @@ static inline void shift_key(php_http_buffer_t *buf, char *key_str, size_t key_l static inline void shift_val(php_http_buffer_t *buf, zval *zvalue, const char *vss, size_t vsl, unsigned flags TSRMLS_DC) { if (Z_TYPE_P(zvalue) != IS_BOOL) { - zval *tmp = php_http_ztyp(IS_STRING, zvalue); + zval *tmp = php_http_zsep(1, IS_STRING, zvalue); prepare_value(flags, tmp TSRMLS_CC); php_http_buffer_append(buf, vss, vsl); @@ -595,6 +599,7 @@ static void shift_arg(php_http_buffer_t *buf, char *key_str, size_t key_len, zva php_http_array_hashkey_t key = php_http_array_hashkey_init(0); zval **val; + shift_key(buf, key_str, key_len, ass, asl, flags TSRMLS_CC); FOREACH_KEYVAL(pos, zvalue, key, val) { /* did you mean recursion? */ php_http_array_hashkey_stringify(&key);