X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_request_object.c;h=7567b96d342edeaa482423b378369dca9ad9d9a7;hb=bbb3e0cfaf7e884c82fc42e873e47d0e6024e1b6;hp=5d02c3e7f862b8dee04bd611fc6f8b34db1eaf6b;hpb=8fa713be4960d51958523429ee0e7dfca6d017fb;p=m6w6%2Fext-http diff --git a/http_request_object.c b/http_request_object.c index 5d02c3e..7567b96 100644 --- a/http_request_object.c +++ b/http_request_object.c @@ -32,14 +32,11 @@ #include "php_http_request_pool_api.h" #include "php_http_url_api.h" -ZEND_EXTERN_MODULE_GLOBALS(http); - #define HTTP_BEGIN_ARGS(method, ret_ref, req_args) HTTP_BEGIN_ARGS_EX(HttpRequest, method, ret_ref, req_args) #define HTTP_EMPTY_ARGS(method, ret_ref) HTTP_EMPTY_ARGS_EX(HttpRequest, method, ret_ref) #define HTTP_REQUEST_ME(method, visibility) PHP_ME(HttpRequest, method, HTTP_ARGS(HttpRequest, method), visibility) #define HTTP_REQUEST_ALIAS(method, func) HTTP_STATIC_ME_ALIAS(method, func, HTTP_ARGS(HttpRequest, method)) -HTTP_EMPTY_ARGS(__destruct, 0); HTTP_BEGIN_ARGS(__construct, 0, 0) HTTP_ARG_VAL(url, 0) HTTP_ARG_VAL(method, 0) @@ -56,6 +53,10 @@ HTTP_BEGIN_ARGS(setSslOptions, 0, 0) HTTP_ARG_VAL(ssl_options, 0) HTTP_END_ARGS; +HTTP_BEGIN_ARGS(addSslOptions, 0, 0) + HTTP_ARG_VAL(ssl_optins, 0) +HTTP_END_ARGS; + HTTP_EMPTY_ARGS(getHeaders, 0); HTTP_BEGIN_ARGS(setHeaders, 0, 0) HTTP_ARG_VAL(headers, 0) @@ -217,12 +218,12 @@ static inline void _http_request_object_declare_default_properties(TSRMLS_D); zend_class_entry *http_request_object_ce; zend_function_entry http_request_object_fe[] = { HTTP_REQUEST_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) - HTTP_REQUEST_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR) HTTP_REQUEST_ME(setOptions, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(getOptions, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(setSslOptions, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(getSslOptions, ZEND_ACC_PUBLIC) + HTTP_REQUEST_ME(addSslOptions, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(addHeaders, ZEND_ACC_PUBLIC) HTTP_REQUEST_ME(getHeaders, ZEND_ACC_PUBLIC) @@ -445,7 +446,7 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ php_stream *stream = php_stream_open_wrapper(Z_STRVAL_P(GET_PROP(obj, putFile)), "rb", REPORT_ERRORS|ENFORCE_SAFE_MODE, NULL); if (stream && !php_stream_stat(stream, &ssb)) { - http_request_body_init_ex(obj->request->body, HTTP_REQUEST_BODY_UPLOADFILE, stream, ssb.sb.st_size, 1); + obj->request->body = http_request_body_init_ex(obj->request->body, HTTP_REQUEST_BODY_UPLOADFILE, stream, ssb.sb.st_size, 1); } else { status = FAILURE; } @@ -464,7 +465,9 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ if (Z_STRLEN_P(ctype)) { zval **headers, *opts = GET_PROP(obj, options); - if ((SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void **) &headers)) && (Z_TYPE_PP(headers) == IS_ARRAY)) { + if ( (Z_TYPE_P(opts) == IS_ARRAY) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), "headers", sizeof("headers"), (void **) &headers)) && + (Z_TYPE_PP(headers) == IS_ARRAY)) { zval **ct_header; /* only override if not already set */ @@ -477,7 +480,8 @@ STATUS _http_request_object_requesthandler(http_request_object *obj, zval *this_ MAKE_STD_ZVAL(headers); array_init(headers); add_assoc_stringl(headers, "Content-Type", Z_STRVAL_P(ctype), Z_STRLEN_P(ctype), 1); - add_assoc_zval(opts, "headers", headers); + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addheaders", NULL, headers); + zval_ptr_dtor(&headers); } } @@ -642,7 +646,8 @@ static inline void _http_request_get_options_subr(INTERNAL_FUNCTION_PARAMETERS, array_init(return_value); - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void **) &options)) { + if ( (Z_TYPE_P(opts) == IS_ARRAY) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(opts), key, len, (void **) &options))) { convert_to_array(*options); array_copy(*options, return_value); } @@ -687,18 +692,6 @@ PHP_METHOD(HttpRequest, __construct) } /* }}} */ -/* {{{ proto void HttpRequest::__destruct() - * - * Destroys the HttpRequest object. - */ -PHP_METHOD(HttpRequest, __destruct) -{ - getObject(http_request_object, obj); - - NO_ARGS; -} -/* }}} */ - /* {{{ proto bool HttpRequest::setOptions([array options]) * * Set the request options to use. See http_get() for a full list of available options. @@ -714,7 +707,7 @@ PHP_METHOD(HttpRequest, setOptions) char *key = NULL; ulong idx = 0; HashPosition pos; - zval *opts = NULL, *old_opts, *new_opts, **opt; + zval *opts = NULL, *old_opts, *new_opts, *add_opts, **opt; getObject(http_request_object, obj); if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!/", &opts)) { @@ -726,61 +719,42 @@ PHP_METHOD(HttpRequest, setOptions) if (!opts || !zend_hash_num_elements(Z_ARRVAL_P(opts))) { SET_PROP(obj, options, new_opts); + zval_ptr_dtor(&new_opts); RETURN_TRUE; } - - old_opts = GET_PROP(obj, options); - if (Z_TYPE_P(old_opts) == IS_ARRAY) { - array_copy(old_opts, new_opts); - } + MAKE_STD_ZVAL(add_opts); + array_init(add_opts); /* some options need extra attention -- thus cannot use array_merge() directly */ FOREACH_KEYVAL(pos, opts, key, idx, opt) { if (key) { if (!strcmp(key, "headers")) { - zval **headers; - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(new_opts), "headers", sizeof("headers"), (void **) &headers)) { - convert_to_array_ex(opt); - convert_to_array(*headers); - array_merge(*opt, *headers); - continue; - } + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addheaders", NULL, *opt); } else if (!strcmp(key, "cookies")) { - zval **cookies; - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(new_opts), "cookies", sizeof("cookies"), (void **) &cookies)) { - convert_to_array_ex(opt); - convert_to_array(*cookies); - array_merge(*opt, *cookies); - continue; - } + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addcookies", NULL, *opt); } else if (!strcmp(key, "ssl")) { - zval **ssl; - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(new_opts), "ssl", sizeof("ssl"), (void **) &ssl)) { - convert_to_array_ex(opt); - convert_to_array(*ssl); - array_merge(*opt, *ssl); - continue; - } - } else if ((Z_TYPE_PP(opt) == IS_STRING) && ((!strcasecmp(key, "url")) || (!strcasecmp(key, "uri")))) { - UPD_STRL(obj, url, Z_STRVAL_PP(opt), Z_STRLEN_PP(opt)); - continue; + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "addssloptions", NULL, *opt); + } else if ((!strcasecmp(key, "url")) || (!strcasecmp(key, "uri"))) { + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "seturl", NULL, *opt); } else if (!strcmp(key, "method")) { - if (Z_TYPE_PP(opt) != IS_LONG) { - convert_to_long_ex(opt); - } - UPD_PROP(obj, long, method, Z_LVAL_PP(opt)); - continue; + zend_call_method_with_1_params(&getThis(), Z_OBJCE_P(getThis()), NULL, "setmethod", NULL, *opt); + } else { + ZVAL_ADDREF(*opt); + add_assoc_zval(add_opts, key, *opt); } - - ZVAL_ADDREF(*opt); - add_assoc_zval(new_opts, key, *opt); - /* reset */ key = NULL; } } + + old_opts = GET_PROP(obj, options); + if (Z_TYPE_P(old_opts) == IS_ARRAY) { + array_copy(old_opts, new_opts); + } + array_merge(add_opts, new_opts); SET_PROP(obj, options, new_opts); zval_ptr_dtor(&new_opts); + zval_ptr_dtor(&add_opts); RETURN_TRUE; } @@ -1204,13 +1178,13 @@ PHP_METHOD(HttpRequest, setPostFields) zval *post, *post_data = NULL; getObject(http_request_object, obj); - if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a!", &post_data)) { + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/!", &post_data)) { RETURN_FALSE; } MAKE_STD_ZVAL(post); array_init(post); - if (post_data && (Z_TYPE_P(post_data) == IS_ARRAY)) { + if (post_data && zend_hash_num_elements(Z_ARRVAL_P(post_data))) { array_copy(post_data, post); } SET_PROP(obj, postFields, post); @@ -1290,13 +1264,13 @@ PHP_METHOD(HttpRequest, addRawPostData) } if (data_len) { - zval *zdata = GET_PROP(obj, rawPostData); + zval *data = zval_copy(IS_STRING, GET_PROP(obj, rawPostData)); - SEPARATE_ZVAL(&zdata); - Z_STRVAL_P(zdata) = erealloc(Z_STRVAL_P(zdata), (Z_STRLEN_P(zdata) += data_len) + 1); - Z_STRVAL_P(zdata)[Z_STRLEN_P(zdata)] = '\0'; - memcpy(Z_STRVAL_P(zdata) + Z_STRLEN_P(zdata) - data_len, raw_data, data_len); - SET_PROP(obj, rawPostData, zdata); + Z_STRVAL_P(data) = erealloc(Z_STRVAL_P(data), (Z_STRLEN_P(data) += data_len) + 1); + Z_STRVAL_P(data)[Z_STRLEN_P(data)] = '\0'; + memcpy(Z_STRVAL_P(data) + Z_STRLEN_P(data) - data_len, raw_data, data_len); + SET_PROP(obj, rawPostData, data); + zval_free(&data); } RETURN_TRUE; @@ -1368,6 +1342,7 @@ PHP_METHOD(HttpRequest, addPostFile) } add_next_index_zval(new_post, entry); SET_PROP(obj, postFiles, new_post); + zval_ptr_dtor(&new_post); RETURN_TRUE; } @@ -1396,9 +1371,10 @@ PHP_METHOD(HttpRequest, setPostFiles) MAKE_STD_ZVAL(post); array_init(post); if (files && (Z_TYPE_P(files) == IS_ARRAY)) { - array_copy(files, post) + array_copy(files, post); } SET_PROP(obj, postFiles, post); + zval_ptr_dtor(&post); RETURN_TRUE; } @@ -1416,9 +1392,9 @@ PHP_METHOD(HttpRequest, getPostFiles) IF_RETVAL_USED { getObject(http_request_object, obj); - - array_init(return_value); - array_copy(GET_PROP(obj, postFiles), return_value); + zval *files = GET_PROP(obj, postFiles); + + RETURN_ZVAL(files, 1, 0); } } /* }}} */ @@ -1483,9 +1459,9 @@ PHP_METHOD(HttpRequest, getResponseData) IF_RETVAL_USED { getObject(http_request_object, obj); + zval *data = GET_PROP(obj, responseData); - array_init(return_value); - array_copy(GET_PROP(obj, responseData), return_value); + RETURN_ZVAL(data, 1, 0); } } /* }}} */ @@ -1516,8 +1492,9 @@ PHP_METHOD(HttpRequest, getResponseHeader) } data = GET_PROP(obj, responseData); - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) { - convert_to_array(*headers); + if ( (Z_TYPE_P(data) == IS_ARRAY) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) && + (Z_TYPE_PP(headers) == IS_ARRAY)) { if (!header_len || !header_name) { RETVAL_ZVAL(*headers, 1, 0); } else if (SUCCESS == zend_hash_find(Z_ARRVAL_PP(headers), pretty_key(header_name, header_len, 1, 1), header_len + 1, (void **) &header)) { @@ -1562,7 +1539,9 @@ PHP_METHOD(HttpRequest, getResponseCookie) array_init(return_value); data = GET_PROP(obj, responseData); - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) { + if ( (Z_TYPE_P(data) == IS_ARRAY) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "headers", sizeof("headers"), (void **) &headers)) && + (Z_TYPE_PP(headers) == IS_ARRAY)) { ulong idx = 0; char *key = NULL; zval **header = NULL; @@ -1655,7 +1634,8 @@ PHP_METHOD(HttpRequest, getResponseBody) getObject(http_request_object, obj); zval *data = GET_PROP(obj, responseData); - if (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void **) &body)) { + if ( (Z_TYPE_P(data) == IS_ARRAY) && + (SUCCESS == zend_hash_find(Z_ARRVAL_P(data), "body", sizeof("body"), (void **) &body))) { RETURN_ZVAL(*body, 1, 0); } else { RETURN_FALSE; @@ -1715,6 +1695,10 @@ PHP_METHOD(HttpRequest, getResponseInfo) } info = GET_PROP(obj, responseInfo); + + if (Z_TYPE_P(info) != IS_ARRAY) { + RETURN_FALSE; + } if (info_len && info_name) { if (SUCCESS == zend_hash_find(Z_ARRVAL_P(info), pretty_key(info_name, info_len, 0, 0), info_len + 1, (void **) &infop)) {