X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=1f94df95a317757f252acb79f417cfe69acdced2;hp=8941a93f3e1d7191f27fdde6df41fdd712d13dc5;hb=51669004bbd20bcb4cd9d509799ff65e3998ea47;hpb=302498d96ed22a09da4375bd955d07f04b6b36c4 diff --git a/http_functions.c b/http_functions.c index 8941a93..1f94df9 100644 --- a/http_functions.c +++ b/http_functions.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2006, Michael Wallner | + | Copyright (c) 2004-2007, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -56,13 +56,13 @@ PHP_FUNCTION(http_date) } /* }}} */ -/* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE[, array &new_url]]]]) +/* {{{ proto string http_build_url([mixed url[, mixed parts[, int flags = HTTP_URL_REPLACE|HTTP_URL_FROM_ENV[, array &new_url]]]]) Build an URL. */ PHP_FUNCTION(http_build_url) { char *url_str = NULL; size_t url_len = 0; - long flags = HTTP_URL_REPLACE; + long flags = HTTP_URL_REPLACE|HTTP_URL_FROM_ENV; zval *z_old_url = NULL, *z_new_url = NULL, *z_composed_url = NULL; php_url *old_url = NULL, *new_url = NULL, *composed_url = NULL; @@ -148,6 +148,17 @@ PHP_FUNCTION(http_build_str) } /* }}} */ +#define HTTP_DO_NEGOTIATE_DEFAULT(supported) \ + { \ + zval **value; \ + \ + zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \ + if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \ + RETVAL_ZVAL(*value, 1, 0); \ + } else { \ + RETVAL_NULL(); \ + } \ + } #define HTTP_DO_NEGOTIATE(type, supported, rs_array) \ { \ HashTable *result; \ @@ -156,10 +167,10 @@ PHP_FUNCTION(http_build_str) uint key_len; \ ulong idx; \ \ - if (HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \ + if (zend_hash_num_elements(result) && HASH_KEY_IS_STRING == zend_hash_get_current_key_ex(result, &key, &key_len, &idx, 1, NULL)) { \ RETVAL_STRINGL(key, key_len-1, 0); \ } else { \ - RETVAL_NULL(); \ + HTTP_DO_NEGOTIATE_DEFAULT(supported); \ } \ \ if (rs_array) { \ @@ -170,14 +181,7 @@ PHP_FUNCTION(http_build_str) FREE_HASHTABLE(result); \ \ } else { \ - zval **value; \ - \ - zend_hash_internal_pointer_reset(Z_ARRVAL_P(supported)); \ - if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(supported), (void *) &value)) { \ - RETVAL_ZVAL(*value, 1, 0); \ - } else { \ - RETVAL_NULL(); \ - } \ + HTTP_DO_NEGOTIATE_DEFAULT(supported); \ \ if (rs_array) { \ HashPosition pos; \ @@ -229,7 +233,7 @@ PHP_FUNCTION(http_negotiate_charset) } /* }}} */ -/* {{{ proto string http_negotiate_ctype(array supported[, array &result]) +/* {{{ proto string http_negotiate_content_type(array supported[, array &result]) Negotiate the clients preferred content type. */ PHP_FUNCTION(http_negotiate_content_type) { @@ -488,7 +492,7 @@ PHP_FUNCTION(http_redirect) } } - URI = http_absolute_url(url); + URI = http_absolute_url_ex(url, HTTP_URL_FROM_ENV); if (query_len) { spprintf(&LOC, 0, "Location: %s?%s", URI, query); @@ -802,27 +806,14 @@ PHP_FUNCTION(http_match_request_header) } /* }}} */ -/* {{{ HAVE_CURL */ -#ifdef HTTP_HAVE_CURL -#ifdef HTTP_HAVE_PERSISTENT_HANDLES - /* {{{ proto object http_persistent_handles_count() */ PHP_FUNCTION(http_persistent_handles_count) { - char **names; - int *counts; - int i, n; - NO_ARGS; - - if ((n = http_persistent_handle_statall(&names, &counts))) { - object_init(return_value); - for (i = 0; i < n; ++i) { - add_property_long(return_value, names[i], counts[i]); - efree(names[i]); - } - efree(names); - efree(counts); + object_init(return_value); + if (!http_persistent_handle_statall_ex(HASH_OF(return_value))) { + zval_dtor(return_value); + RETURN_NULL(); } } /* }}} */ @@ -834,12 +825,28 @@ PHP_FUNCTION(http_persistent_handles_clean) int name_len = 0; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &name_str, &name_len)) { - http_persistent_handle_cleanup_ex(name_str, name_len); + http_persistent_handle_cleanup_ex(name_str, name_len, 1); } } /* }}} */ -#endif /* HTTP_HAVE_PERSISTENT_HANDLES */ +/* {{{ proto string http_persistent_handles_ident([string ident]) */ +PHP_FUNCTION(http_persistent_handles_ident) +{ + char *ident_str = NULL; + int ident_len = 0; + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &ident_str, &ident_len)) { + RETVAL_STRING(zend_ini_string(ZEND_STRS("http.persistent.handles.ident"), 0), 1); + if (ident_str && ident_len) { + zend_alter_ini_entry(ZEND_STRS("http.persistent.handles.ident"), ident_str, ident_len, ZEND_INI_USER, PHP_INI_STAGE_RUNTIME); + } + } +} +/* }}} */ + +/* {{{ HAVE_CURL */ +#ifdef HTTP_HAVE_CURL #define RETVAL_RESPONSE_OR_BODY(request) \ { \