X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=63a3423bb52341443cecb476bf8caf2d60926af1;hp=28d9be5571fbe45b3fc4ad309eebb8b858d3d17c;hb=229730a74c2686bdf501528cbe44a9421ccca61a;hpb=b46d0197c4402e76c2608ba972e1d05db22a321a diff --git a/http_functions.c b/http_functions.c index 28d9be5..63a3423 100644 --- a/http_functions.c +++ b/http_functions.c @@ -20,6 +20,8 @@ #endif #include "php.h" +#include "zend_operators.h" + #include "SAPI.h" #include "php_ini.h" #include "ext/standard/info.h" @@ -33,6 +35,7 @@ #include "php_http_api.h" #include "php_http_request_api.h" #include "php_http_cache_api.h" +#include "php_http_request_method_api.h" #include "php_http_request_api.h" #include "php_http_date_api.h" #include "php_http_headers_api.h" @@ -97,11 +100,54 @@ PHP_FUNCTION(http_absolute_uri) } /* }}} */ -/* {{{ proto string http_negotiate_language(array supported[, string default = 'en-US']) +#define HTTP_DO_NEGOTIATE(type, supported, as_array) \ +{ \ + HashTable *result; \ + if (result = http_negotiate_ ##type(supported)) { \ + if (as_array) { \ + Z_TYPE_P(return_value) = IS_ARRAY; \ + Z_ARRVAL_P(return_value) = result; \ + } else { \ + char *key; \ + uint key_len; \ + ulong idx; \ + \ + if (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(); \ + } \ + zend_hash_destroy(result); \ + } \ + } else { \ + if (as_array) { \ + zval **value; \ + \ + array_init(return_value); \ + \ + FOREACH_VAL(supported, value) { \ + convert_to_string_ex(value); \ + add_assoc_double(return_value, Z_STRVAL_PP(value), 1.0); \ + } \ + } 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(); \ + } \ + } \ + } \ +} + + +/* {{{ proto string http_negotiate_language(array supported[, bool return_quality_array = false]) * * This function negotiates the clients preferred language based on its * Accept-Language HTTP header. It returns the negotiated language or - * the default language if none match. + * the default language (i.e. first array entry) if none match. * * The qualifier is recognized and languages without qualifier are rated highest. * @@ -128,26 +174,21 @@ PHP_FUNCTION(http_absolute_uri) PHP_FUNCTION(http_negotiate_language) { zval *supported; - char *def = NULL; - int def_len = 0; + zend_bool as_array = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) { RETURN_FALSE; } - - if (!def) { - def = "en-US"; - } - - RETURN_STRING(http_negotiate_language(supported, def), 0); + + HTTP_DO_NEGOTIATE(language, supported, as_array); } /* }}} */ -/* {{{ proto string http_negotiate_charset(array supported[, string default = 'iso-8859-1']) +/* {{{ proto string http_negotiate_charset(array supported) * * This function negotiates the clients preferred charset based on its * Accept-Charset HTTP header. It returns the negotiated charset or - * the default charset if none match. + * the default charset (i.e. first array entry) if none match. * * The qualifier is recognized and charset without qualifier are rated highest. * @@ -175,18 +216,13 @@ PHP_FUNCTION(http_negotiate_language) PHP_FUNCTION(http_negotiate_charset) { zval *supported; - char *def = NULL; - int def_len = 0; + zend_bool as_array = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|s", &supported, &def, &def_len) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|b", &supported, &as_array) != SUCCESS) { RETURN_FALSE; } - if (!def) { - def = "iso-8859-1"; - } - - RETURN_STRING(http_negotiate_charset(supported, def), 0); + HTTP_DO_NEGOTIATE(charset, supported, as_array); } /* }}} */ @@ -407,7 +443,7 @@ PHP_FUNCTION(ob_etaghandler) } Z_TYPE_P(return_value) = IS_STRING; - http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), &Z_STRLEN_P(return_value), mode); + http_ob_etaghandler(data, data_len, &Z_STRVAL_P(return_value), (uint *) &Z_STRLEN_P(return_value), mode); } /* }}} */ @@ -614,14 +650,15 @@ PHP_FUNCTION(http_send_stream) PHP_FUNCTION(http_chunked_decode) { char *encoded = NULL, *decoded = NULL; - int encoded_len = 0, decoded_len = 0; + size_t decoded_len = 0; + int encoded_len = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &encoded, &encoded_len) != SUCCESS) { RETURN_FALSE; } if (NULL != http_chunked_decode(encoded, encoded_len, &decoded, &decoded_len)) { - RETURN_STRINGL(decoded, decoded_len, 0); + RETURN_STRINGL(decoded, (int) decoded_len, 0); } else { RETURN_FALSE; } @@ -1045,6 +1082,8 @@ PHP_FUNCTION(http_put_stream) } } /* }}} */ +#endif /* HTTP_HAVE_CURL */ +/* }}} HAVE_CURL */ /* {{{ proto long http_request_method_register(string method) * @@ -1084,7 +1123,6 @@ PHP_FUNCTION(http_request_method_unregister) case IS_OBJECT: convert_to_string(method); case IS_STRING: -#include "zend_operators.h" if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) { convert_to_long(method); } else { @@ -1152,8 +1190,6 @@ PHP_FUNCTION(http_request_method_name) } } /* }}} */ -#endif -/* }}} HAVE_CURL */ /* {{{ Sara Golemons http_build_query() */ #ifndef ZEND_ENGINE_2