#include "php_http_api.h"
#include <ext/spl/spl_observer.h>
+#include <ext/standard/php_array.h>
-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)
+PHP_HTTP_API php_http_client_t *php_http_client_init(php_http_client_t *h, php_http_client_ops_t *ops, php_resource_factory_t *rf, void *init_arg TSRMLS_DC)
{
php_http_client_t *free_h = NULL;
if (rf) {
h->rf = rf;
} else if (ops->rsrc) {
- h->rf = php_http_resource_factory_init(NULL, h->ops->rsrc, h, NULL);
+ h->rf = php_resource_factory_init(NULL, h->ops->rsrc, h, NULL);
}
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);
h->ops->dtor(h);
}
- php_http_resource_factory_free(&h->rf);
+ php_resource_factory_free(&h->rf);
php_http_message_parser_free(&h->request.parser);
php_http_message_free(&h->request.message);
to->ops = from->ops;
if (from->rf) {
- php_http_resource_factory_addref(from->rf);
+ php_resource_factory_addref(from->rf);
to->rf = from->rf;
} else if (to->ops->rsrc){
- to->rf = php_http_resource_factory_init(NULL, to->ops->rsrc, to, NULL);
+ to->rf = php_resource_factory_init(NULL, to->ops->rsrc, to, NULL);
}
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);
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) {
/* 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)) {
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);
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);
}
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);
}
}
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);
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;