X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=c932266c5d38f75a5b315c26f76fdb3692459921;hp=3969b82fd156d50ca69037893b199964713adbf7;hb=669d2e6a8bdc642b6b52693f4593f199ddd7e8d2;hpb=4fcbd8e8ae31611c5197ff2369673b5939fc2b80 diff --git a/http_api.c b/http_api.c index 3969b82..c932266 100644 --- a/http_api.c +++ b/http_api.c @@ -84,99 +84,6 @@ char *_http_pretty_key(char *key, size_t key_len, zend_bool uctitle, zend_bool x } /* }}} */ -/* {{{ */ -void _http_key_list_default_decoder(const char *encoded, size_t encoded_len, char **decoded, size_t *decoded_len TSRMLS_DC) -{ - *decoded = estrndup(encoded, encoded_len); - *decoded_len = (size_t) php_url_decode(*decoded, encoded_len); -} -/* }}} */ - -/* {{{ */ -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; - int vallen = 0, keylen = 0, done = 0; - zval array; - - INIT_ZARR(array, items); - - if (!(val = strchr(list, '='))) { - return FAILURE; - } - -#define HTTP_KEYLIST_VAL(array, k, str, len) \ - { \ - char *decoded; \ - size_t decoded_len; \ - if (decode) { \ - decode(str, len, &decoded, &decoded_len TSRMLS_CC); \ - } else { \ - decoded_len = len; \ - decoded = estrndup(str, decoded_len); \ - } \ - add_assoc_stringl(array, k, decoded, decoded_len, 0); \ - } -#define HTTP_KEYLIST_FIXKEY() \ - { \ - 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; \ - } - - HTTP_KEYLIST_FIXKEY(); - - if (first_entry_is_name_value_pair) { - HTTP_KEYLIST_VAL(&array, "name", key, keylen); - - /* just one name=value */ - if (!(key = strchr(val, separator))) { - key = val + strlen(val); - HTTP_KEYLIST_FIXVAL(); - HTTP_KEYLIST_VAL(&array, "value", val, vallen); - return SUCCESS; - } - /* additional info appended */ - else { - HTTP_KEYLIST_FIXVAL(); - HTTP_KEYLIST_VAL(&array, "value", val, vallen); - } - } - - do { - char *keydup = NULL; - - if (!(val = strchr(key, '='))) { - break; - } - - /* start at 0 if first_entry_is_name_value_pair==0 */ - if (zend_hash_num_elements(items)) { - ++key; - } - - HTTP_KEYLIST_FIXKEY(); - keydup = estrndup(key, keylen); - if (!(key = strchr(val, separator))) { - done = 1; - key = val + strlen(val); - } - HTTP_KEYLIST_FIXVAL(); - HTTP_KEYLIST_VAL(&array, keydup, val, vallen); - efree(keydup); - } while (!done); - - return SUCCESS; -} -/* }}} */ - /* {{{ void http_error(long, long, char*) */ void _http_error_ex(long type TSRMLS_DC, long code, const char *format, ...) { @@ -209,7 +116,7 @@ void _http_log_ex(char *file, const char *ident, const char *message TSRMLS_DC) #define HTTP_LOG_WRITE(file, type, msg) \ if (file && *file) { \ - php_stream *log = php_stream_open_wrapper(file, "ab", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); \ + php_stream *log = php_stream_open_wrapper_ex(file, "ab", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL, HTTP_DEFAULT_STREAM_CONTEXT); \ \ if (log) { \ php_stream_printf(log TSRMLS_CC, "%s\t[%s]\t%s\t<%s>%s", datetime, type, msg, SG(request_info).request_uri, PHP_EOL); \ @@ -219,7 +126,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); } /* }}} */ @@ -240,27 +147,29 @@ STATUS _http_exit_ex(int status, char *header, char *body, zend_bool send_header return FAILURE; } - php_end_ob_buffers(0 TSRMLS_CC); + if (!OG(ob_lock)) { + php_end_ob_buffers(0 TSRMLS_CC); + } if ((SUCCESS == sapi_send_headers(TSRMLS_C)) && body) { PHPWRITE(body, strlen(body)); } 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); @@ -289,11 +198,13 @@ PHP_HTTP_API zval *_http_get_server_var_ex(const char *key, size_t key_size, zen { zval **hsv; zval **var; - - if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) { +#ifdef ZEND_ENGINE_2 + zend_is_auto_global("_SERVER", lenof("_SERVER") TSRMLS_CC); +#endif + if ((SUCCESS != zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void *) &hsv)) || (Z_TYPE_PP(hsv) != IS_ARRAY)) { return NULL; } - if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void **) &var)) || (Z_TYPE_PP(var) != IS_STRING)) { + if ((SUCCESS != zend_hash_find(Z_ARRVAL_PP(hsv), (char *) key, key_size, (void *) &var)) || (Z_TYPE_PP(var) != IS_STRING)) { return NULL; } if (check && !(Z_STRVAL_PP(var) && Z_STRLEN_PP(var))) { @@ -317,11 +228,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 +268,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];