X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_client.c;h=29da4c90ec4788b592e027742f59550a9bd437e7;hp=8a63acd7ca2d37ce622c304562780d69c425ba36;hb=f05a032e5e994a8b1ea8b5ab0291f1d1d6d42355;hpb=6384c059a56976898f02505d38f9aed3fc6c6340 diff --git a/php_http_client.c b/php_http_client.c index 8a63acd..29da4c9 100644 --- a/php_http_client.c +++ b/php_http_client.c @@ -13,6 +13,7 @@ #include "php_http_api.h" #include +#include PHP_HTTP_API php_http_client_t *php_http_client_init(php_http_client_t *h, php_http_client_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC) { @@ -31,11 +32,11 @@ PHP_HTTP_API php_http_client_t *php_http_client_init(php_http_client_t *h, php_h } h->request.buffer = php_http_buffer_init(NULL); h->request.parser = php_http_message_parser_init(NULL TSRMLS_CC); - h->request.message = php_http_message_init(NULL, 0 TSRMLS_CC); + h->request.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); h->response.buffer = php_http_buffer_init(NULL); h->response.parser = php_http_message_parser_init(NULL TSRMLS_CC); - h->response.message = php_http_message_init(NULL, 0 TSRMLS_CC); + h->response.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); TSRMLS_SET_CTX(h->ts); @@ -99,11 +100,11 @@ PHP_HTTP_API php_http_client_t *php_http_client_copy(php_http_client_t *from, ph to->request.buffer = php_http_buffer_init(NULL); to->request.parser = php_http_message_parser_init(NULL TSRMLS_CC); - to->request.message = php_http_message_init(NULL, 0 TSRMLS_CC); + to->request.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); to->response.buffer = php_http_buffer_init(NULL); to->response.parser = php_http_message_parser_init(NULL TSRMLS_CC); - to->response.message = php_http_message_init(NULL, 0 TSRMLS_CC); + to->response.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); TSRMLS_SET_CTX(to->ts); @@ -296,11 +297,8 @@ zend_object_value php_http_client_object_new_ex(zend_class_entry *ce, php_http_c o = ecalloc(1, sizeof(*o)); zend_object_std_init((zend_object *) o, ce TSRMLS_CC); -#if PHP_VERSION_ID < 50339 - zend_hash_copy(((zend_object *) o)->properties, &(ce->default_properties), (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval*)); -#else object_properties_init((zend_object *) o, ce); -#endif + ov.handle = zend_objects_store_put(o, NULL, php_http_client_object_free, NULL TSRMLS_CC); ov.handlers = &php_http_client_object_handlers; @@ -355,6 +353,7 @@ STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_D php_http_client_object_t *obj = zend_object_store_get_object(zclient TSRMLS_CC); php_http_client_progress_t *progress; zval *zoptions; + HashTable options; /* do we have a valid request? */ if (*zreq) { @@ -376,12 +375,19 @@ STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_D /* reset transfer info */ zend_update_property_null(php_http_client_class_entry, zclient, ZEND_STRL("transferInfo") TSRMLS_CC); + /* set client options */ + zend_hash_init(&options, 0, NULL, ZVAL_PTR_DTOR, 0); zoptions = zend_read_property(php_http_client_class_entry, zclient, ZEND_STRL("options"), 0 TSRMLS_CC); - php_http_client_setopt(obj->client, PHP_HTTP_CLIENT_OPT_SETTINGS, Z_ARRVAL_P(zoptions)); - /* set request options */ + if (Z_TYPE_P(zoptions) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(zoptions))) { + php_array_merge(&options, Z_ARRVAL_P(zoptions), 1 TSRMLS_CC); + } zoptions = zend_read_property(php_http_client_request_get_class_entry(), *zreq, ZEND_STRL("options"), 0 TSRMLS_CC); - php_http_client_setopt(obj->client, PHP_HTTP_CLIENT_OPT_SETTINGS, Z_ARRVAL_P(zoptions)); + if (Z_TYPE_P(zoptions) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(zoptions))) { + php_array_merge(&options, Z_ARRVAL_P(zoptions), 1 TSRMLS_CC); + } + php_http_client_setopt(obj->client, PHP_HTTP_CLIENT_OPT_SETTINGS, &options); + zend_hash_destroy(&options); /* set progress callback */ if (SUCCESS == php_http_client_getopt(obj->client, PHP_HTTP_CLIENT_OPT_PROGRESS_INFO, &progress)) { @@ -389,7 +395,6 @@ STATUS php_http_client_object_handle_request(zval *zclient, zval **zreq TSRMLS_D php_http_client_progress_callback_t *callback = emalloc(sizeof(*callback)); callback->type = PHP_HTTP_CLIENT_PROGRESS_CALLBACK_USER; - callback->pass_state = 0; MAKE_STD_ZVAL(callback->func.user); array_init(callback->func.user); Z_ADDREF_P(zclient); @@ -447,7 +452,7 @@ STATUS php_http_client_object_handle_response(zval *zclient TSRMLS_DC) zend_update_property(php_http_client_class_entry, zclient, ZEND_STRL("responseMessage"), message TSRMLS_CC); zval_ptr_dtor(&message); - obj->client->response.message = php_http_message_init(NULL, 0 TSRMLS_CC); + obj->client->response.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); } else { zend_update_property_null(php_http_client_class_entry, zclient, ZEND_STRL("responseMessage") TSRMLS_CC); } @@ -464,7 +469,7 @@ STATUS php_http_client_object_handle_response(zval *zclient TSRMLS_DC) ZVAL_OBJVAL(message, php_http_message_object_new_ex(php_http_message_get_class_entry(), msg, NULL TSRMLS_CC), 0); zend_update_property(php_http_client_class_entry, zclient, ZEND_STRL("requestMessage"), message TSRMLS_CC); zval_ptr_dtor(&message); - obj->client->request.message = php_http_message_init(NULL, 0 TSRMLS_CC); + obj->client->request.message = php_http_message_init(NULL, 0, NULL TSRMLS_CC); } } @@ -774,7 +779,7 @@ PHP_METHOD(HttpClient, addCookies) zval *opts = NULL; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|a!/", &opts)) { - php_http_client_options_set_subr(getThis(), ZEND_STRS("ssl"), opts, 0 TSRMLS_CC); + php_http_client_options_set_subr(getThis(), ZEND_STRS("cookies"), opts, 0 TSRMLS_CC); RETVAL_ZVAL(getThis(), 1, 0); } @@ -919,7 +924,6 @@ PHP_METHOD(HttpClient, request) with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|a!z!a!/", &meth_str, &meth_len, &url_str, &url_len, &zheader, &zbody, &zoptions)) { - php_http_client_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); php_http_message_object_t *msg_obj; zend_object_value ov; zval *req, *res = NULL; @@ -928,7 +932,7 @@ PHP_METHOD(HttpClient, request) MAKE_STD_ZVAL(req); ZVAL_OBJVAL(req, ov, 0); - msg_obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST TSRMLS_CC); + msg_obj->message = php_http_message_init(NULL, PHP_HTTP_REQUEST, NULL TSRMLS_CC); PHP_HTTP_INFO(msg_obj->message).request.url = estrndup(url_str, url_len); PHP_HTTP_INFO(msg_obj->message).request.method = estrndup(meth_str, meth_len); @@ -979,7 +983,7 @@ PHP_METHOD(HttpClient, send) PHP_MINIT_FUNCTION(http_client) { - PHP_HTTP_REGISTER_CLASS(http\\Client, AbstractClient, http_client, php_http_object_get_class_entry(), ZEND_ACC_ABSTRACT); + PHP_HTTP_REGISTER_CLASS(http\\Client, AbstractClient, http_client, php_http_object_get_class_entry(), ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); php_http_client_class_entry->create_object = php_http_client_object_new; memcpy(&php_http_client_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); php_http_client_object_handlers.clone_obj = php_http_client_object_clone;