X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=http_functions.c;h=8ce961fdac10ccdf666076eb2ad5bd7cda2db923;hb=7904ebbfd747d11f0821d2b2712600ab07a36ff6;hp=665facf7765ad01187cb0655975c0e95435b01fa;hpb=b637b6a7dc7e76df505a6f039994ed74c9f8ea1e;p=m6w6%2Fext-http diff --git a/http_functions.c b/http_functions.c index 665facf..8ce961f 100644 --- a/http_functions.c +++ b/http_functions.c @@ -27,6 +27,7 @@ #include "php_http_api.h" #include "php_http_cache_api.h" +#include "php_http_cookie_api.h" #include "php_http_date_api.h" #include "php_http_encoding_api.h" #include "php_http_headers_api.h" @@ -702,8 +703,8 @@ PHP_FUNCTION(http_throttle) return; } - HTTP_G(send).throttle_delay = interval; - HTTP_G(send).buffer_size = chunk_size; + HTTP_G->send.throttle_delay = interval; + HTTP_G->send.buffer_size = chunk_size; } /* }}} */ @@ -1038,41 +1039,76 @@ PHP_FUNCTION(http_parse_headers) } /* }}}*/ -/* {{{ proto object http_parse_cookie(string cookie) +/* {{{ proto object http_parse_cookie(string cookie[, int flags[, array allowed_extras]]) * * Parses HTTP cookies like sent in a response into a struct. * * Expects a string as parameter containing the value of a Set-Cookie response header. * - * Returns an stdClass object with the cookie params as properties on success or FALSE on failure. + * Returns an stdClass olike shown in the example on success or FALSE on failure. * * Example: *
* foo - * [value] => bar + * [cookies] => Array + * ( + * [foo] => bar + * [bar] => baz + * ) + * + * [extras] => Array + * ( + * [comment] => + * ) + * + * [flags] => 16 + * [expires] => 0 * [path] => / + * [domain] => example.com * ) * ?> **/ PHP_FUNCTION(http_parse_cookie) { - char *cookie; - int cookie_len; + char *cookie, **allowed_extras = NULL; + int i = 0, cookie_len; + long flags = 0; + zval *allowed_extras_array = NULL, **entry = NULL; + HashPosition pos; + http_cookie_list list; - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &cookie, &cookie_len)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|la", &cookie, &cookie_len, &flags, &allowed_extras_array)) { RETURN_FALSE; } - object_init(return_value); - if (SUCCESS != http_parse_cookie(cookie, HASH_OF(return_value))) { - zval_dtor(return_value); - RETURN_FALSE; + if (allowed_extras_array) { + allowed_extras = ecalloc(zend_hash_num_elements(Z_ARRVAL_P(allowed_extras_array)) + 1, sizeof(char *)); + FOREACH_VAL(pos, allowed_extras_array, entry) { + ZVAL_ADDREF(*entry); + convert_to_string_ex(entry); + allowed_extras[i] = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)); + zval_ptr_dtor(entry); + } + } + + if (http_parse_cookie_ex(&list, cookie, flags, allowed_extras)) { + object_init(return_value); + http_cookie_list_tostruct(&list, return_value); + http_cookie_list_dtor(&list); + } else { + RETVAL_FALSE; + } + + if (allowed_extras) { + for (i = 0; allowed_extras[i]; ++i) { + efree(allowed_extras[i]); + } + efree(allowed_extras); } } @@ -1207,7 +1243,10 @@ PHP_FUNCTION(http_match_request_header) * like array("header" => "value") * - cookies: array, list of cookies as associative array * like array("cookie" => "value") + * - encodecookies: bool, whether to urlencode the cookies (default: true) + * - resetcookies: bool, wheter to reset the cookies * - cookiestore: string, path to a file where cookies are/will be stored + * - cookiesession: bool, accept (true) or reset (false) sessioncookies * - resume: int, byte offset to start the download from; * if the server supports ranges * - maxfilesize: int, maximum file size that should be downloaded; @@ -1217,6 +1256,8 @@ PHP_FUNCTION(http_match_request_header) * - timeout: int, seconds the request may take * - connecttimeout: int, seconds the connect may take * - onprogress: mixed, progress callback + * - interface: string, outgoing network interface (ifname, ip or hostname) + * - portrange: array, 2 integers specifying outgoing portrange to try * - ssl: array, with the following options: * cert: string, path to certificate * certtype: string, type of certificate @@ -1240,30 +1281,45 @@ PHP_FUNCTION(http_match_request_header) *
* 'http://localhost', - * 'response_code' => 403, - * 'total_time' => 0.017, - * 'namelookup_time' => 0.013, - * 'connect_time' => 0.014, - * 'pretransfer_time' => 0.014, - * 'size_upload' => 0, - * 'size_download' => 202, - * 'speed_download' => 11882, - * 'speed_upload' => 0, - * 'header_size' => 145, - * 'request_size' => 62, - * 'ssl_verifyresult' => 0, - * 'filetime' => -1, - * 'content_length_download' => 202, - * 'content_length_upload' => 0, - * 'starttransfer_time' => 0.017, - * 'content_type' => 'text/html; charset=iso-8859-1', - * 'redirect_time' => 0, - * 'redirect_count' => 0, - * 'http_connectcode' => 0, - * 'httpauth_avail' => 0, - * 'proxyauth_avail' => 0, - * ) + * 'effective_url' => 'http://www.example.com/', + * 'response_code' => 302, + * 'connect_code' => 0, + * 'filetime' => -1, + * 'total_time' => 0.212348, + * 'namelookup_time' => 0.038296, + * 'connect_time' => 0.104144, + * 'pretransfer_time' => 0.104307, + * 'starttransfer_time' => 0.212077, + * 'redirect_time' => 0, + * 'redirect_count' => 0, + * 'size_upload' => 0, + * 'size_download' => 218, + * 'speed_download' => 1026, + * 'speed_upload' => 0, + * 'header_size' => 307, + * 'request_size' => 103, + * 'ssl_verifyresult' => 0, + * 'ssl_engines' => + * array ( + * 0 => 'dynamic', + * 1 => 'cswift', + * 2 => 'chil', + * 3 => 'atalla', + * 4 => 'nuron', + * 5 => 'ubsec', + * 6 => 'aep', + * 7 => 'sureware', + * 8 => '4758cca', + * ), + * 'content_length_download' => 218, + * 'content_length_upload' => 0, + * 'content_type' => 'text/html', + * 'httpauth_avail' => 0, + * 'proxyauth_avail' => 0, + * 'num_connects' => 1, + * 'os_errno' => 0, + * 'error' => '', + * ) * ?> ** @@ -1446,7 +1502,7 @@ PHP_FUNCTION(http_put_file) RETURN_FALSE; } - if (!(stream = php_stream_open_wrapper(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL))) { + if (!(stream = php_stream_open_wrapper_ex(file, "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL, HTTP_DEFAULT_STREAM_CONTEXT))) { RETURN_FALSE; } if (php_stream_stat(stream, &ssb)) {