X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=8fc26f2cd4ef46b93ef2197daa68a845923e7cc3;hp=079996986697c361a73f6c6a9e6ce520d24db4cc;hb=refs%2Fheads%2Fv1.7.x;hpb=34c551d43ab4fbfff88a81e545a43fbbf7a8a75d diff --git a/http_functions.c b/http_functions.c index 0799969..8fc26f2 100644 --- a/http_functions.c +++ b/http_functions.c @@ -165,10 +165,22 @@ PHP_FUNCTION(http_build_str) RETVAL_NULL(); \ } \ } -#define HTTP_DO_NEGOTIATE(type, supported, rs_array) \ -{ \ - HashTable *result; \ - if ((result = http_negotiate_ ##type(supported))) { \ + +#define HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array) \ + HTTP_DO_NEGOTIATE_DEFAULT(supported); \ + if (rs_array) { \ + HashPosition pos; \ + zval **value_ptr; \ + \ + FOREACH_VAL(pos, supported, value_ptr) { \ + zval *value = http_zsep(IS_STRING, *value_ptr); \ + add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \ + zval_ptr_dtor(&value); \ + } \ + } + +#define HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array) \ + { \ char *key; \ uint key_len; \ ulong idx; \ @@ -185,22 +197,17 @@ PHP_FUNCTION(http_build_str) \ zend_hash_destroy(result); \ FREE_HASHTABLE(result); \ - \ - } else { \ - HTTP_DO_NEGOTIATE_DEFAULT(supported); \ - \ - if (rs_array) { \ - HashPosition pos; \ - zval **value_ptr; \ - \ - FOREACH_VAL(pos, supported, value_ptr) { \ - zval *value = http_zsep(IS_STRING, *value_ptr); \ - add_assoc_double(rs_array, Z_STRVAL_P(value), 1.0); \ - zval_ptr_dtor(&value); \ - } \ + } + +#define HTTP_DO_NEGOTIATE(type, supported, rs_array) \ + { \ + HashTable *result; \ + if ((result = http_negotiate_ ##type(supported))) { \ + HTTP_DO_NEGOTIATE_HANDLE_RESULT(result, supported, rs_array); \ + } else { \ + HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array); \ } \ - } \ -} + } /* {{{ proto string http_negotiate_language(array supported[, array &result]) Negotiate the clients preferred language. */ @@ -259,6 +266,30 @@ PHP_FUNCTION(http_negotiate_content_type) } /* }}} */ +/* {{{ proto string http_negotiate(mixed value, array supported[, array &result]) + Negotiate the user supplied value. */ +PHP_FUNCTION(http_negotiate) +{ + zval *value, *supported, *rs_array = NULL; + HashTable *rs; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "za|z", &value, &supported, &rs_array)) { + RETURN_FALSE; + } + + if (rs_array) { + zval_dtor(rs_array); + array_init(rs_array); + } + + if ((rs = http_negotiate_z(value, Z_ARRVAL_P(supported), http_negotiate_default_func))) { + HTTP_DO_NEGOTIATE_HANDLE_RESULT(rs, supported, rs_array); + } else { + HTTP_DO_NEGOTIATE_HANDLE_DEFAULT(supported, rs_array); + } +} +/* }}} */ + /* {{{ proto bool http_send_status(int status) Send HTTP status code. */ PHP_FUNCTION(http_send_status)