X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=7d7eec4b2a05365c2e9fe79cbcecadaf20395c2b;hp=d3b81ea41cb9ffc44f1bafb274f0c9b4790111e7;hb=31d0ecaa361b6a186391f48d566e9b1de36b1099;hpb=2eaccaa7cf561ddb2efcd0f93992e8b02f5cd88e diff --git a/http_functions.c b/http_functions.c index d3b81ea..7d7eec4 100644 --- a/http_functions.c +++ b/http_functions.c @@ -100,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. * @@ -131,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. * @@ -178,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); } /* }}} */ @@ -443,29 +476,37 @@ PHP_FUNCTION(http_throttle) } /* }}} */ -/* {{{ proto void http_redirect([string url[, array params[, bool session,[ bool permanent]]]]) +/* {{{ proto void http_redirect([string url[, array params[, bool session[, int status]]]]) * * Redirect to a given url. * The supplied url will be expanded with http_absolute_uri(), the params array will * be treated with http_build_query() and the session identification will be appended * if session is true. * - * Depending on permanent the redirection will be issued with a permanent - * ("301 Moved Permanently") or a temporary ("302 Found") redirection - * status code. + * The HTTP response code will be set according to status. + * You can use one of the following constants for convenience: + * - HTTP_REDIRECT 302 Found + * - HTTP_REDIRECT_PERM 301 Moved Permanently + * - HTTP_REDIRECT_POST 303 See Other + * - HTTP_REDIRECT_TEMP 307 Temporary Redirect + * + * Please see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3 + * for which redirect response code to use in which situation. * * To be RFC compliant, "Redirecting to URI." will be displayed, - * if the client doesn't redirect immediatly. + * if the client doesn't redirect immediatly, and the request method was + * antoher than HEAD. */ PHP_FUNCTION(http_redirect) { int url_len; size_t query_len = 0; - zend_bool session = 0, permanent = 0, free_params = 0; + zend_bool session = 0, free_params = 0; zval *params = NULL; + long status = 302; char *query = NULL, *url = NULL, *URI, *LOC, *RED = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bb", &url, &url_len, ¶ms, &session, &permanent) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bl", &url, &url_len, ¶ms, &session, &status) != SUCCESS) { RETURN_FALSE; } @@ -547,7 +588,7 @@ PHP_FUNCTION(http_redirect) FREE_ZVAL(params); } - RETURN_SUCCESS(http_exit_ex(permanent ? 301 : 302, LOC, RED, 1)); + RETURN_SUCCESS(http_exit_ex(status, LOC, RED, 1)); } /* }}} */