X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=php_http_client_pool.c;h=3e6b6f98b88354f976c5c7f566a46fc7a92d820e;hp=f0b6ca623a6b6f47a648208b64dfcce01d628379;hb=0ee6755121a35b2e7bcca536f19c8d34d2b9ba6b;hpb=6cc24086f57aa1e8f4d6a2c12361635e7c24f60f diff --git a/php_http_client_pool.c b/php_http_client_pool.c index f0b6ca6..3e6b6f9 100644 --- a/php_http_client_pool.c +++ b/php_http_client_pool.c @@ -12,7 +12,7 @@ #include "php_http_api.h" -PHP_HTTP_API php_http_client_pool_t *php_http_client_pool_init(php_http_client_pool_t *h, php_http_client_pool_ops_t *ops, php_http_resource_factory_t *rf, void *init_arg TSRMLS_DC) +PHP_HTTP_API php_http_client_pool_t *php_http_client_pool_init(php_http_client_pool_t *h, php_http_client_pool_ops_t *ops, php_resource_factory_t *rf, void *init_arg TSRMLS_DC) { php_http_client_pool_t *free_h = NULL; @@ -22,7 +22,11 @@ PHP_HTTP_API php_http_client_pool_t *php_http_client_pool_init(php_http_client_p memset(h, 0, sizeof(*h)); h->ops = ops; - h->rf = rf ? rf : php_http_resource_factory_init(NULL, h->ops->rsrc, NULL, NULL); + if (rf) { + h->rf = rf; + } else if (ops->rsrc) { + h->rf = php_resource_factory_init(NULL, h->ops->rsrc, h, NULL); + } zend_llist_init(&h->clients.attached, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0); zend_llist_init(&h->clients.finished, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0); TSRMLS_SET_CTX(h->ts); @@ -57,7 +61,7 @@ PHP_HTTP_API void php_http_client_pool_dtor(php_http_client_pool_t *h) zend_llist_clean(&h->clients.finished); zend_llist_clean(&h->clients.attached); - php_http_resource_factory_free(&h->rf); + php_resource_factory_free(&h->rf); } PHP_HTTP_API void php_http_client_pool_free(php_http_client_pool_t **h) { @@ -73,21 +77,22 @@ PHP_HTTP_API STATUS php_http_client_pool_attach(php_http_client_pool_t *h, zval TSRMLS_FETCH_FROM_CTX(h->ts); if (h->ops->attach) { - char *url = NULL; - char *m = NULL; - php_http_message_body_t *body = NULL; - php_http_client_object_t *obj = zend_object_store_get_object(client TSRMLS_CC); + zval *zreq = NULL; + php_http_client_object_t *obj; + php_http_message_object_t *msg_obj; - if (SUCCESS != php_http_client_object_requesthandler(obj, client, &m, &url, &body TSRMLS_CC)) { + if (SUCCESS != php_http_client_object_handle_request(client, &zreq TSRMLS_CC)) { return FAILURE; } - if (SUCCESS == h->ops->attach(h, obj->client, m, url, body)) { - STR_FREE(url); + + obj = zend_object_store_get_object(client TSRMLS_CC); + msg_obj = zend_object_store_get_object(zreq TSRMLS_CC); + + if (SUCCESS == h->ops->attach(h, obj->client, msg_obj->message)) { Z_ADDREF_P(client); zend_llist_add_element(&h->clients.attached, &client); return SUCCESS; } - STR_FREE(url); } return FAILURE; @@ -207,17 +212,17 @@ PHP_HTTP_API void php_http_client_pool_requests(php_http_client_pool_t *h, zval #define PHP_HTTP_BEGIN_ARGS(method, req_args) PHP_HTTP_BEGIN_ARGS_EX(HttpClientPool, method, 0, req_args) #define PHP_HTTP_EMPTY_ARGS(method) PHP_HTTP_EMPTY_ARGS_EX(HttpClientPool, method, 0) -#define PHP_HTTP_REQPOOL_ME(method, visibility) PHP_ME(HttpClientPool, method, PHP_HTTP_ARGS(HttpClientPool, method), visibility) +#define PHP_HTTP_CLIENT_POOL_ME(method, visibility) PHP_ME(HttpClientPool, method, PHP_HTTP_ARGS(HttpClientPool, method), visibility) PHP_HTTP_EMPTY_ARGS(__destruct); PHP_HTTP_EMPTY_ARGS(reset); PHP_HTTP_BEGIN_ARGS(attach, 1) - PHP_HTTP_ARG_OBJ(http\\Client, client, 0) + PHP_HTTP_ARG_OBJ(http\\Client\\AbstractClient, request, 0) PHP_HTTP_END_ARGS; PHP_HTTP_BEGIN_ARGS(detach, 1) - PHP_HTTP_ARG_OBJ(http\\Client, client, 0) + PHP_HTTP_ARG_OBJ(http\\Client\\AbstractClient, request, 0) PHP_HTTP_END_ARGS; PHP_HTTP_EMPTY_ARGS(send); @@ -234,8 +239,8 @@ PHP_HTTP_EMPTY_ARGS(rewind); PHP_HTTP_EMPTY_ARGS(count); -PHP_HTTP_EMPTY_ARGS(getAttachedRequests); -PHP_HTTP_EMPTY_ARGS(getFinishedRequests); +PHP_HTTP_EMPTY_ARGS(getAttached); +PHP_HTTP_EMPTY_ARGS(getFinished); PHP_HTTP_BEGIN_ARGS(enablePipelining, 0) PHP_HTTP_ARG_VAL(enable, 0) @@ -245,32 +250,38 @@ PHP_HTTP_BEGIN_ARGS(enableEvents, 0) PHP_HTTP_ARG_VAL(enable, 0) PHP_HTTP_END_ARGS; -zend_class_entry *php_http_client_pool_class_entry; -zend_function_entry php_http_client_pool_method_entry[] = { - PHP_HTTP_REQPOOL_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR) - PHP_HTTP_REQPOOL_ME(attach, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(detach, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(send, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(reset, ZEND_ACC_PUBLIC) +static zend_class_entry *php_http_client_pool_class_entry; + +zend_class_entry *php_http_client_pool_get_class_entry(void) +{ + return php_http_client_pool_class_entry; +} + +static zend_function_entry php_http_client_pool_method_entry[] = { + PHP_HTTP_CLIENT_POOL_ME(__destruct, ZEND_ACC_PUBLIC|ZEND_ACC_DTOR) + PHP_HTTP_CLIENT_POOL_ME(attach, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(detach, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(send, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(reset, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(once, ZEND_ACC_PROTECTED) - PHP_HTTP_REQPOOL_ME(wait, ZEND_ACC_PROTECTED) + PHP_HTTP_CLIENT_POOL_ME(once, ZEND_ACC_PROTECTED) + PHP_HTTP_CLIENT_POOL_ME(wait, ZEND_ACC_PROTECTED) /* implements Iterator */ - PHP_HTTP_REQPOOL_ME(valid, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(current, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(key, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(next, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(rewind, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(valid, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(current, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(key, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(next, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(rewind, ZEND_ACC_PUBLIC) /* implmenents Countable */ - PHP_HTTP_REQPOOL_ME(count, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(count, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(getAttachedRequests, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(getFinishedRequests, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(getAttached, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(getFinished, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(enablePipelining, ZEND_ACC_PUBLIC) - PHP_HTTP_REQPOOL_ME(enableEvents, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(enablePipelining, ZEND_ACC_PUBLIC) + PHP_HTTP_CLIENT_POOL_ME(enableEvents, ZEND_ACC_PUBLIC) EMPTY_FUNCTION_ENTRY }; @@ -282,6 +293,22 @@ extern zend_object_handlers *php_http_client_pool_get_object_handlers(void) return &php_http_client_pool_object_handlers; } +static php_http_client_pool_ops_t php_http_client_pool_user_ops = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + (php_http_new_t) php_http_client_pool_object_new_ex, + php_http_client_pool_get_class_entry +}; + zend_object_value php_http_client_pool_object_new(zend_class_entry *ce TSRMLS_DC) { return php_http_client_pool_object_new_ex(ce, NULL, NULL TSRMLS_CC); @@ -297,7 +324,7 @@ zend_object_value php_http_client_pool_object_new_ex(zend_class_entry *ce, php_h object_properties_init((zend_object *) o, ce); if (!(o->pool = p)) { - o->pool = php_http_client_pool_init(NULL, NULL, NULL, NULL TSRMLS_CC); + o->pool = php_http_client_pool_init(NULL, &php_http_client_pool_user_ops, NULL, NULL TSRMLS_CC); } if (ptr) { @@ -349,11 +376,11 @@ PHP_METHOD(HttpClientPool, reset) PHP_METHOD(HttpClientPool, attach) { - with_error_handling(EH_THROW, php_http_exception_class_entry) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { zval *request; - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, php_http_client_class_entry)) { - with_error_handling(EH_THROW, php_http_exception_class_entry) { + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, php_http_client_get_class_entry())) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { php_http_client_pool_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); if (obj->iterator.pos > 0 && obj->iterator.pos < zend_llist_count(&obj->pool->clients.attached)) { @@ -372,11 +399,11 @@ PHP_METHOD(HttpClientPool, detach) { RETVAL_FALSE; - with_error_handling(EH_THROW, php_http_exception_class_entry) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { zval *request; - if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, php_http_client_class_entry)) { - with_error_handling(EH_THROW, php_http_exception_class_entry) { + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, php_http_client_get_class_entry())) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { php_http_client_pool_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); obj->iterator.pos = -1; @@ -392,9 +419,9 @@ PHP_METHOD(HttpClientPool, send) { RETVAL_FALSE; - with_error_handling(EH_THROW, php_http_exception_class_entry) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { if (SUCCESS == zend_parse_parameters_none()) { - with_error_handling(EH_THROW, php_http_exception_class_entry) { + with_error_handling(EH_THROW, php_http_exception_get_class_entry()) { php_http_client_pool_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); php_http_client_pool_exec(obj->pool); @@ -501,7 +528,7 @@ PHP_METHOD(HttpClientPool, count) } } -PHP_METHOD(HttpClientPool, getAttachedRequests) +PHP_METHOD(HttpClientPool, getAttached) { if (SUCCESS == zend_parse_parameters_none()) { php_http_client_pool_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); @@ -515,7 +542,7 @@ PHP_METHOD(HttpClientPool, getAttachedRequests) RETURN_FALSE; } -PHP_METHOD(HttpClientPool, getFinishedRequests) +PHP_METHOD(HttpClientPool, getFinished) { if (SUCCESS == zend_parse_parameters_none()) { php_http_client_pool_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC); @@ -555,8 +582,8 @@ PHP_METHOD(HttpClientPool, enableEvents) PHP_MINIT_FUNCTION(http_client_pool) { - PHP_HTTP_REGISTER_CLASS(http\\Client\\Pool, AbstractPool, http_client_pool, php_http_object_class_entry, 0); - php_http_client_pool_class_entry->create_object = php_http_object_new; //php_http_client_pool_object_new; + PHP_HTTP_REGISTER_CLASS(http\\Client\\Pool, AbstractPool, http_client_pool, php_http_object_get_class_entry(), ZEND_ACC_EXPLICIT_ABSTRACT_CLASS); + php_http_client_pool_class_entry->create_object = php_http_client_pool_object_new; memcpy(&php_http_client_pool_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); php_http_client_pool_object_handlers.clone_obj = NULL;