X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=5190d5b48bad8e64c61584467239581466ecdc00;hp=6e7f2361f0d9308436332e3111e1faeeeadfd77d;hb=2811a2111f519ee55e05c4084903a34dc0c3b818;hpb=3b2a6db2424f9181e88dca6639fe68f2a709f7e9 diff --git a/http_functions.c b/http_functions.c index 6e7f236..5190d5b 100644 --- a/http_functions.c +++ b/http_functions.c @@ -35,6 +35,7 @@ #include "php_http.h" #include "php_http_api.h" #include "php_http_curl_api.h" +#include "php_http_std_defs.h" ZEND_DECLARE_MODULE_GLOBALS(http) @@ -429,10 +430,12 @@ PHP_FUNCTION(ob_httpetaghandler) PHP_FUNCTION(http_redirect) { int url_len; + size_t query_len = 0; zend_bool session = 0, permanent = 0; zval *params = NULL; - smart_str qstr = {0}; - char *url, *URI, LOC[HTTP_URI_MAXLEN + 9], RED[HTTP_URI_MAXLEN * 2 + 34]; + char *query, *url, *URI, + LOC[HTTP_URI_MAXLEN + sizeof("Location: ")], + RED[HTTP_URI_MAXLEN * 2 + sizeof("Redirecting to %s?%s.\n")]; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|sa!/bb", &url, &url_len, ¶ms, &session, &permanent) != SUCCESS) { RETURN_FALSE; @@ -451,23 +454,18 @@ PHP_FUNCTION(http_redirect) /* treat params array with http_build_query() */ if (params) { - if (php_url_encode_hash_ex(Z_ARRVAL_P(params), &qstr, NULL,0,NULL,0,NULL,0,NULL TSRMLS_CC) != SUCCESS) { - if (qstr.c) { - efree(qstr.c); - } - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not encode query parameters"); + if (SUCCESS != http_urlencode_hash_ex(Z_ARRVAL_P(params), 0, NULL, 0, &query, &query_len)) { RETURN_FALSE; } - smart_str_0(&qstr); } URI = http_absolute_uri(url, NULL); - if (qstr.c) { - snprintf(LOC, HTTP_URI_MAXLEN + strlen("Location: "), "Location: %s?%s", URI, qstr.c); - sprintf(RED, "Redirecting to %s?%s.\n", URI, qstr.c, URI, qstr.c); - efree(qstr.c); + if (query_len) { + snprintf(LOC, HTTP_URI_MAXLEN + sizeof("Location: "), "Location: %s?%s", URI, query); + sprintf(RED, "Redirecting to %s?%s.\n", URI, query, URI, query); + efree(query); } else { - snprintf(LOC, HTTP_URI_MAXLEN + strlen("Location: "), "Location: %s", URI); + snprintf(LOC, HTTP_URI_MAXLEN + sizeof("Location: "), "Location: %s", URI); sprintf(RED, "Redirecting to %s.\n", URI, URI); } efree(URI); @@ -935,6 +933,45 @@ PHP_FUNCTION(http_auth_basic_cb) } /* }}}*/ +/* {{{ Sara Golemons http_build_query() */ +#ifndef ZEND_ENGINE_2 + +/* {{{ proto string http_build_query(mixed formdata [, string prefix]) + Generates a form-encoded query string from an associative array or object. */ +PHP_FUNCTION(http_build_query) +{ + zval *formdata; + char *prefix = NULL; + int prefix_len = 0; + smart_str formstr = {0}; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|s", &formdata, &prefix, &prefix_len) != SUCCESS) { + RETURN_FALSE; + } + + if (Z_TYPE_P(formdata) != IS_ARRAY && Z_TYPE_P(formdata) != IS_OBJECT) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Parameter 1 expected to be Array or Object. Incorrect value given."); + RETURN_FALSE; + } + + if (php_url_encode_hash_ex(HASH_OF(formdata), &formstr, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL) TSRMLS_CC) == FAILURE) { + if (formstr.c) { + efree(formstr.c); + } + RETURN_FALSE; + } + + if (!formstr.c) { + RETURN_NULL(); + } + + smart_str_0(&formstr); + + RETURN_STRINGL(formstr.c, formstr.len, 0); +} +/* }}} */ +#endif /* !ZEND_ENGINE_2 */ +/* }}} */ /* * Local variables: