X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=63a3423bb52341443cecb476bf8caf2d60926af1;hp=ced4e81b5f18490062cc04c17b075463ba8bccb6;hb=b97243b9bffae6ec360cfa7ea2dd1c7f1c3a556f;hpb=0d925a2820b9d75b8e32c451fd400863e51e22fe diff --git a/http_functions.c b/http_functions.c index ced4e81..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" @@ -31,9 +33,9 @@ #include "php_http.h" #include "php_http_std_defs.h" #include "php_http_api.h" -#include "php_http_auth_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" @@ -98,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. * @@ -129,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. * @@ -176,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); } /* }}} */ @@ -408,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); } /* }}} */ @@ -615,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; } @@ -679,6 +715,7 @@ PHP_FUNCTION(http_parse_message) if (msg = http_message_parse(message, message_len)) { object_init(return_value); http_message_tostruct_recursive(msg, return_value); + http_message_free(&msg); } else { RETURN_NULL(); } @@ -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,118 +1190,6 @@ PHP_FUNCTION(http_request_method_name) } } /* }}} */ -#endif -/* }}} HAVE_CURL */ - - -/* {{{ proto bool http_auth_basic(string user, string pass[, string realm = "Restricted"]) - * - * Example: - *
- * Authorization failed!');
- * }
- * ?>
- * 
- */ -PHP_FUNCTION(http_auth_basic) -{ - char *realm = NULL, *user, *pass, *suser, *spass; - int r_len, u_len, p_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s", &user, &u_len, &pass, &p_len, &realm, &r_len) != SUCCESS) { - RETURN_FALSE; - } - - if (!realm) { - realm = "Restricted"; - } - - if (SUCCESS != http_auth_basic_credentials(&suser, &spass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - if (strcasecmp(suser, user)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - if (strcmp(spass, pass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - - RETURN_TRUE; -} -/* }}} */ - -/* {{{ proto bool http_auth_basic_cb(mixed callback[, string realm = "Restricted"]) - * - * Example: - *
- * quoteSmart($user);
- *     if (strlen($realpass = $db->getOne($query)) {
- *         return $pass === $realpass;
- *     }
- *     return false;
- * }
- * if (!http_auth_basic_cb('auth_cb')) {
- *     die('

Authorization failed

'); - * } - * ?> - *
- */ -PHP_FUNCTION(http_auth_basic_cb) -{ - zval *cb; - char *realm = NULL, *user, *pass; - int r_len; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &cb, &realm, &r_len) != SUCCESS) { - RETURN_FALSE; - } - - if (!realm) { - realm = "Restricted"; - } - - if (SUCCESS != http_auth_basic_credentials(&user, &pass)) { - http_auth_basic_header(realm); - RETURN_FALSE; - } - { - zval *zparams[2] = {NULL, NULL}, retval; - int result = 0; - - MAKE_STD_ZVAL(zparams[0]); - MAKE_STD_ZVAL(zparams[1]); - ZVAL_STRING(zparams[0], user, 0); - ZVAL_STRING(zparams[1], pass, 0); - - if (SUCCESS == call_user_function(EG(function_table), NULL, cb, - &retval, 2, zparams TSRMLS_CC)) { - result = Z_LVAL(retval); - } - - efree(user); - efree(pass); - efree(zparams[0]); - efree(zparams[1]); - - if (!result) { - http_auth_basic_header(realm); - } - - RETURN_BOOL(result); - } -} -/* }}}*/ /* {{{ Sara Golemons http_build_query() */ #ifndef ZEND_ENGINE_2 @@ -1309,13 +1235,6 @@ PHP_FUNCTION(http_build_query) PHP_FUNCTION(http_test) { - ulong idx; - char *key; - zval **data; - FOREACH_HASH_KEYVAL(&EG(symbol_table), key, idx, data) { - convert_to_string_ex(data); - fprintf(stderr, "\t %s => %s\n", key, Z_STRVAL_PP(data)); - } } /*