X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_api.c;h=0b0eea748831e87098ab354dacad0f3a778b57a1;hb=0dbc3c8eb4ec78fd58d6cc1c80e5189f5ae91094;hp=3969b82fd156d50ca69037893b199964713adbf7;hpb=4fcbd8e8ae31611c5197ff2369673b5939fc2b80;p=m6w6%2Fext-http diff --git a/http_api.c b/http_api.c index 3969b82..0b0eea7 100644 --- a/http_api.c +++ b/http_api.c @@ -95,13 +95,14 @@ void _http_key_list_default_decoder(const char *encoded, size_t encoded_len, cha /* {{{ */ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, http_key_list_decode_t decode, zend_bool first_entry_is_name_value_pair TSRMLS_DC) { - const char *key = list, *val = NULL; + char *str = estrdup(list), *key = str, *val = NULL; int vallen = 0, keylen = 0, done = 0; zval array; INIT_ZARR(array, items); - if (!(val = strchr(list, '='))) { + if (!(val = strchr(str, '='))) { + efree(str); return FAILURE; } @@ -119,16 +120,27 @@ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, } #define HTTP_KEYLIST_FIXKEY() \ { \ - while (isspace(*key)) ++key; \ - keylen = val - key; \ - while (isspace(key[keylen - 1])) --keylen; \ + while (isspace(*key)) ++key; \ + keylen = val - key; \ + while (isspace(key[keylen - 1])) --keylen; \ } #define HTTP_KEYLIST_FIXVAL() \ { \ + ++val; \ + while (isspace(*val)) ++val; \ + vallen = key - val; \ + while (isspace(val[vallen - 1])) --vallen; \ + if (val[0] == '"' && val[vallen - 1] == '"') { \ + int i; \ ++val; \ - while (isspace(*val)) ++val; \ - vallen = key - val; \ - while (isspace(val[vallen - 1])) --vallen; \ + vallen -= 2; \ + for (i = 0; i < vallen; ++i) { \ + if (val[i] == '\\' && val[i+1] == '"' && (!i || val[i-1] != '\\')) { \ + memmove(&val[i], &val[i+1], vallen - i); \ + --vallen; \ + } \ + } \ + } \ } HTTP_KEYLIST_FIXKEY(); @@ -141,6 +153,7 @@ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, key = val + strlen(val); HTTP_KEYLIST_FIXVAL(); HTTP_KEYLIST_VAL(&array, "value", val, vallen); + efree(str); return SUCCESS; } /* additional info appended */ @@ -173,6 +186,7 @@ STATUS _http_parse_key_list(const char *list, HashTable *items, char separator, efree(keydup); } while (!done); + efree(str); return SUCCESS; } /* }}} */ @@ -219,7 +233,7 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC) } HTTP_LOG_WRITE(file, ident, message); - HTTP_LOG_WRITE(HTTP_G(log).composite, ident, message); + HTTP_LOG_WRITE(HTTP_G->log.composite, ident, message); } /* }}} */ @@ -247,20 +261,20 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header 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; - case 305: http_log(HTTP_G(log).redirect, "305-REDIRECT", header); break; - case 307: http_log(HTTP_G(log).redirect, "307-REDIRECT", header); break; - case 304: http_log(HTTP_G(log).cache, "304-CACHE", header); break; - case 405: http_log(HTTP_G(log).allowed_methods, "405-ALLOWED", header); break; + 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; + case 305: http_log(HTTP_G->log.redirect, "305-REDIRECT", header); break; + case 307: http_log(HTTP_G->log.redirect, "307-REDIRECT", header); break; + case 304: http_log(HTTP_G->log.cache, "304-CACHE", header); break; + case 405: http_log(HTTP_G->log.allowed_methods, "405-ALLOWED", header); break; default: http_log(NULL, header, body); break; } STR_FREE(header); STR_FREE(body); - if (HTTP_G(force_exit)) { + if (HTTP_G->force_exit) { zend_bailout(); } else { php_ob_set_internal_handler(http_ob_blackhole, 4096, "blackhole", 0 TSRMLS_CC); @@ -317,11 +331,11 @@ PHP_HTTP_API STATUS _http_get_request_body_ex(char **body, size_t *length, zend_ *body = estrndup(*body, *length); } return SUCCESS; - } else if (sapi_module.read_post && !HTTP_G(read_post_data)) { + } else if (sapi_module.read_post && !HTTP_G->read_post_data) { char buf[4096]; int len; - HTTP_G(read_post_data) = 1; + HTTP_G->read_post_data = 1; while (0 < (len = sapi_module.read_post(buf, sizeof(buf) TSRMLS_CC))) { *body = erealloc(*body, *length + len + 1); @@ -357,8 +371,8 @@ PHP_HTTP_API php_stream *_http_get_request_body_stream(TSRMLS_D) if (SG(request_info).raw_post_data) { s = php_stream_open_wrapper("php://input", "rb", 0, NULL); - } else if (sapi_module.read_post && !HTTP_G(read_post_data)) { - HTTP_G(read_post_data) = 1; + } else if (sapi_module.read_post && !HTTP_G->read_post_data) { + HTTP_G->read_post_data = 1; if ((s = php_stream_temp_new())) { char buf[4096];