X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_api.c;h=c932266c5d38f75a5b315c26f76fdb3692459921;hp=549d283918b067ef7f35b465e4366e37c1720c26;hb=669d2e6a8bdc642b6b52693f4593f199ddd7e8d2;hpb=1382fe5a3ed5209ab05745ca95495885e85ff2a0 diff --git a/http_api.c b/http_api.c index 549d283..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); \ @@ -240,7 +147,9 @@ 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)); } @@ -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))) {