X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_requestpool_object.c;h=58aec24d561a0cc4e52dcbbfc773d6a05799e313;hb=2b1bdfab2a6402e4daec69f6b7c395b0662e18d7;hp=f312b7fad55664945205def9337f28af62fa38a3;hpb=ffc893b125c6cc9b385a68a357b08ba2cc4e91f6;p=m6w6%2Fext-http diff --git a/http_requestpool_object.c b/http_requestpool_object.c index f312b7f..58aec24 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -24,6 +24,7 @@ #if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL) #include "php_http_std_defs.h" +#include "php_http_api.h" #include "php_http_requestpool_object.h" #include "php_http_request_pool_api.h" #include "php_http_request_object.h" @@ -93,10 +94,11 @@ zend_function_entry http_requestpool_object_fe[] = { }; static zend_object_handlers http_requestpool_object_handlers; -void _http_requestpool_object_init(INIT_FUNC_ARGS) +PHP_MINIT_FUNCTION(http_requestpool_object) { HTTP_REGISTER_CLASS_EX(HttpRequestPool, http_requestpool_object, NULL, 0); zend_class_implements(http_requestpool_object_ce TSRMLS_CC, 1, zend_ce_iterator); + return SUCCESS; } zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC) @@ -144,14 +146,22 @@ void _http_requestpool_object_free(zend_object *object TSRMLS_DC) * * Instantiate a new HttpRequestPool object. An HttpRequestPool is * able to send several HttpRequests in parallel. + * + * WARNING: Don't attach/detach HttpRequest objects to the HttpRequestPool + * object while you're using the implemented Interator interface. * + * Accepts virtual infinite optional parameters each referencing an + * HttpRequest object. + * + * Throws HttpRequestException, HttpRequestPoolException, HttpInvalidParamException. + * * Example: *
* send(); * foreach($pool as $request) { @@ -209,14 +219,23 @@ PHP_METHOD(HttpRequestPool, reset) getObject(http_requestpool_object, obj); NO_ARGS; - + + obj->iterator.pos = 0; http_request_pool_detach_all(&obj->pool); } /* {{{ proto bool HttpRequestPool::attach(HttpRequest request) * * Attach an HttpRequest object to this HttpRequestPool. - * NOTE: set all options prior attaching! + * WARNING: set all options prior attaching! + * + * Expects the parameter to be an HttpRequest object not alread attached to + * antother HttpRequestPool object. + * + * Returns TRUE on success, or FALSE on failure. + * + * Throws HttpInvalidParamException, HttpRequestException, + * HttpRequestPoolException, HttpEncodingException. */ PHP_METHOD(HttpRequestPool, attach) { @@ -226,7 +245,11 @@ PHP_METHOD(HttpRequestPool, attach) SET_EH_THROW_HTTP(); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) { - status = http_request_pool_attach(&obj->pool, request); + if (obj->iterator.pos > 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles)) { + http_error(HE_THROW, HTTP_E_REQUEST_POOL, "Cannot attach to the HttpRequestPool while the iterator is active"); + } else { + status = http_request_pool_attach(&obj->pool, request); + } } SET_EH_NORMAL(); RETURN_SUCCESS(status); @@ -236,6 +259,13 @@ PHP_METHOD(HttpRequestPool, attach) /* {{{ proto bool HttpRequestPool::detach(HttpRequest request) * * Detach an HttpRequest object from this HttpRequestPool. + * + * Expects the parameter to be an HttpRequest object attached to this + * HttpRequestPool object. + * + * Returns TRUE on success, or FALSE on failure. + * + * Throws HttpInvalidParamException, HttpRequestPoolException. */ PHP_METHOD(HttpRequestPool, detach) { @@ -245,6 +275,7 @@ PHP_METHOD(HttpRequestPool, detach) SET_EH_THROW_HTTP(); if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) { + obj->iterator.pos = -1; status = http_request_pool_detach(&obj->pool, request); } SET_EH_NORMAL(); @@ -255,6 +286,11 @@ PHP_METHOD(HttpRequestPool, detach) /* {{{ proto bool HttpRequestPool::send() * * Send all attached HttpRequest objects in parallel. + * + * Returns TRUE on success, or FALSE on failure. + * + * Throws HttpSocketException, HttpRequestException, + * HttpRequestPoolException, HttpMalformedHeaderException. */ PHP_METHOD(HttpRequestPool, send) { @@ -271,8 +307,10 @@ PHP_METHOD(HttpRequestPool, send) } /* }}} */ -/* {{{ proto protected bool HttpRequestPool::socketSend() +/* {{{ proto protected bool HttpRequestPool::socketPerform() * + * Returns TRUE until each request has finished its transaction. + * * Usage: ** iterator.pos < zend_llist_count(&obj->pool.handles)); + RETURN_BOOL(obj->iterator.pos >= 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles)); } } /* }}} */ @@ -358,7 +398,7 @@ PHP_METHOD(HttpRequestPool, current) } /* }}} */ -/* {{{ proto long HttpRequestPool::key() +/* {{{ proto int HttpRequestPool::key() * * Implements Iterator::key(). */