X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=http_requestpool_object.c;h=dfb9c604f72f6d387f2209e491535f8a3abe1f74;hb=a0098fdbfef71be0fab417b5bc624dc884bd4549;hp=b255e25ee2b58f83c3d9fbf6f72a7f62bcd3b636;hpb=a2a03258160b8dea5525a82c3251e0cbff4a3132;p=m6w6%2Fext-http diff --git a/http_requestpool_object.c b/http_requestpool_object.c index b255e25..dfb9c60 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" @@ -89,7 +90,7 @@ zend_function_entry http_requestpool_object_fe[] = { HTTP_REQPOOL_ME(next, ZEND_ACC_PUBLIC) HTTP_REQPOOL_ME(rewind, ZEND_ACC_PUBLIC) - {NULL, NULL, NULL} + EMPTY_FUNCTION_ENTRY }; static zend_object_handlers http_requestpool_object_handlers; @@ -108,7 +109,6 @@ zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC) o->zo.ce = ce; http_request_pool_init(&o->pool); - o->iterator.pos = 0; ALLOC_HASHTABLE(OBJ_PROP(o)); zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0); @@ -145,14 +145,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) { @@ -210,14 +218,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) { @@ -227,7 +244,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); @@ -237,6 +258,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) { @@ -246,6 +274,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(); @@ -256,6 +285,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) { @@ -272,8 +306,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)); } } /* }}} */ @@ -359,7 +397,7 @@ PHP_METHOD(HttpRequestPool, current) } /* }}} */ -/* {{{ proto long HttpRequestPool::key() +/* {{{ proto int HttpRequestPool::key() * * Implements Iterator::key(). */