X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_requestpool_object.c;h=03fee88c575ca09a40ea5726d71cc3ffefd93d5e;hp=ff8f75d4431e073faec37dffefa09a240998935a;hb=ea0d9948275e4e369633c53c59340db3d3df34d3;hpb=2eeaaf92d18d81751c5a52dcc7c1dbdfbcdfc28c diff --git a/http_requestpool_object.c b/http_requestpool_object.c index ff8f75d..03fee88 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2006, Michael Wallner | + | Copyright (c) 2004-2007, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -35,11 +35,7 @@ extern PHPAPI zend_class_entry *spl_ce_Countable; #define HTTP_EMPTY_ARGS(method) HTTP_EMPTY_ARGS_EX(HttpRequestPool, method, 0) #define HTTP_REQPOOL_ME(method, visibility) PHP_ME(HttpRequestPool, method, HTTP_ARGS(HttpRequestPool, method), visibility) -HTTP_BEGIN_ARGS(__construct, 0) - HTTP_ARG_OBJ(HttpRequest, request0, 0) - HTTP_ARG_OBJ(HttpRequest, request1, 0) - HTTP_ARG_OBJ(HttpRequest, requestN, 0) -HTTP_END_ARGS; +HTTP_EMPTY_ARGS(__construct); HTTP_EMPTY_ARGS(__destruct); HTTP_EMPTY_ARGS(reset); @@ -54,7 +50,9 @@ HTTP_END_ARGS; HTTP_EMPTY_ARGS(send); HTTP_EMPTY_ARGS(socketPerform); -HTTP_EMPTY_ARGS(socketSelect); +HTTP_BEGIN_ARGS(socketSelect, 0) + HTTP_ARG_VAL(timeout, 0) +HTTP_END_ARGS; HTTP_EMPTY_ARGS(valid); HTTP_EMPTY_ARGS(current); @@ -71,6 +69,10 @@ HTTP_BEGIN_ARGS(enablePipelining, 0) HTTP_ARG_VAL(enable, 0) HTTP_END_ARGS; +HTTP_BEGIN_ARGS(enableEvents, 0) + HTTP_ARG_VAL(enable, 0) +HTTP_END_ARGS; + zend_class_entry *http_requestpool_object_ce; zend_function_entry http_requestpool_object_fe[] = { HTTP_REQPOOL_ME(__construct, ZEND_ACC_PUBLIC|ZEND_ACC_CTOR) @@ -97,6 +99,7 @@ zend_function_entry http_requestpool_object_fe[] = { HTTP_REQPOOL_ME(getFinishedRequests, ZEND_ACC_PUBLIC) HTTP_REQPOOL_ME(enablePipelining, ZEND_ACC_PUBLIC) + HTTP_REQPOOL_ME(enableEvents, ZEND_ACC_PUBLIC) EMPTY_FUNCTION_ENTRY }; @@ -154,40 +157,7 @@ static void _http_requestpool_object_llist2array(zval **req, zval *array TSRMLS_ /* ### USERLAND ### */ /* {{{ proto void HttpRequestPool::__construct([HttpRequest request[, ...]]) - * - * 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 Iterator interface. - * - * Accepts virtual infinite optional parameters each referencing an - * HttpRequest object. - * - * Throws HttpRequestPoolException (HttpRequestException, HttpInvalidParamException). - * - * Example: - *
- * send();
- *     foreach($pool as $request) {
- *         printf("%s is %s (%d)\n",
- *             $request->getUrl(),
- *             $request->getResponseCode() ? 'alive' : 'not alive',
- *             $request->getResponseCode()
- *         );
- *     }
- * } catch (HttpException $e) {
- *     echo $e;
- * }
- * ?>
- * 
- */ + Creates a new HttpRequestPool object instance. */ PHP_METHOD(HttpRequestPool, __construct) { int argc = ZEND_NUM_ARGS(); @@ -205,15 +175,13 @@ PHP_METHOD(HttpRequestPool, __construct) } } efree(argv); - SET_EH_NORMAL(); http_final(HTTP_EX_CE(request_pool)); + SET_EH_NORMAL(); } /* }}} */ /* {{{ proto void HttpRequestPool::__destruct() - * - * Clean up HttpRequestPool object. - */ + Clean up HttpRequestPool object. */ PHP_METHOD(HttpRequestPool, __destruct) { getObject(http_requestpool_object, obj); @@ -225,9 +193,7 @@ PHP_METHOD(HttpRequestPool, __destruct) /* }}} */ /* {{{ proto void HttpRequestPool::reset() - * - * Detach all attached HttpRequest objects. - */ + Detach all attached HttpRequest objects. */ PHP_METHOD(HttpRequestPool, reset) { getObject(http_requestpool_object, obj); @@ -239,18 +205,7 @@ PHP_METHOD(HttpRequestPool, reset) } /* {{{ proto bool HttpRequestPool::attach(HttpRequest request) - * - * Attach an HttpRequest object to this HttpRequestPool. - * WARNING: set all options prior attaching! - * - * Expects the parameter to be an HttpRequest object not already attached to - * antother HttpRequestPool object. - * - * Returns TRUE on success, or FALSE on failure. - * - * Throws HttpInvalidParamException, HttpRequestException, - * HttpRequestPoolException, HttpEncodingException. - */ + Attach an HttpRequest object to this HttpRequestPool. WARNING: set all options prior attaching! */ PHP_METHOD(HttpRequestPool, attach) { zval *request; @@ -271,16 +226,7 @@ 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. - */ + Detach an HttpRequest object from this HttpRequestPool. */ PHP_METHOD(HttpRequestPool, detach) { zval *request; @@ -298,13 +244,7 @@ PHP_METHOD(HttpRequestPool, detach) /* }}} */ /* {{{ proto bool HttpRequestPool::send() - * - * Send all attached HttpRequest objects in parallel. - * - * Returns TRUE on success, or FALSE on failure. - * - * Throws HttpRequestPoolException (HttpSocketException, HttpRequestException, HttpMalformedHeaderException). - */ + Send all attached HttpRequest objects in parallel. */ PHP_METHOD(HttpRequestPool, send) { STATUS status; @@ -324,36 +264,7 @@ PHP_METHOD(HttpRequestPool, send) /* }}} */ /* {{{ proto protected bool HttpRequestPool::socketPerform() - * - * Returns TRUE until each request has finished its transaction. - * - * Usage: - *
- * socketPerform()) {
- *             if (!$this->socketSelect()) {
- *                 throw new HttpSocketExcpetion;
- *             }
- *         }
- *     }
- *     
- *     protected final function socketPerform()
- *     {
- *         $result = parent::socketPerform();
- *         foreach ($this->getFinishedRequests() as $r) {
- *             $this->detach($r);
- *             // handle response of finished request
- *         }
- *         return $result;
- *     }
- * } 
- * ?>
- * 
- */ + Returns TRUE until each request has finished its transaction. */ PHP_METHOD(HttpRequestPool, socketPerform) { getObject(http_requestpool_object, obj); @@ -368,28 +279,28 @@ PHP_METHOD(HttpRequestPool, socketPerform) } /* }}} */ -/* {{{ proto protected bool HttpRequestPool::socketSelect() - * - * See HttpRequestPool::socketPerform(). - * - * Returns TRUE on success, or FALSE on failure. - */ +/* {{{ proto protected bool HttpRequestPool::socketSelect([double timeout]) */ PHP_METHOD(HttpRequestPool, socketSelect) { + double timeout = 0; + struct timeval custom_timeout, *custom_timeout_ptr = NULL; getObject(http_requestpool_object, obj); - NO_ARGS; + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|d", &timeout)) { + RETURN_FALSE; + } + if (ZEND_NUM_ARGS() && timeout > 0) { + custom_timeout.tv_sec = (time_t) timeout; + custom_timeout.tv_usec = HTTP_USEC(timeout) % HTTP_MCROSEC; + custom_timeout_ptr = &custom_timeout; + } - RETURN_SUCCESS(http_request_pool_select(&obj->pool)); + RETURN_SUCCESS(http_request_pool_select_ex(&obj->pool, custom_timeout_ptr)); } /* }}} */ -/* implements Iterator */ - /* {{{ proto bool HttpRequestPool::valid() - * - * Implements Iterator::valid(). - */ + Implements Iterator::valid(). */ PHP_METHOD(HttpRequestPool, valid) { NO_ARGS; @@ -402,9 +313,7 @@ PHP_METHOD(HttpRequestPool, valid) /* }}} */ /* {{{ proto HttpRequest HttpRequestPool::current() - * - * Implements Iterator::current(). - */ + Implements Iterator::current(). */ PHP_METHOD(HttpRequestPool, current) { NO_ARGS; @@ -429,9 +338,7 @@ PHP_METHOD(HttpRequestPool, current) /* }}} */ /* {{{ proto int HttpRequestPool::key() - * - * Implements Iterator::key(). - */ + Implements Iterator::key(). */ PHP_METHOD(HttpRequestPool, key) { NO_ARGS; @@ -444,9 +351,7 @@ PHP_METHOD(HttpRequestPool, key) /* }}} */ /* {{{ proto void HttpRequestPool::next() - * - * Implements Iterator::next(). - */ + Implements Iterator::next(). */ PHP_METHOD(HttpRequestPool, next) { NO_ARGS { @@ -457,9 +362,7 @@ PHP_METHOD(HttpRequestPool, next) /* }}} */ /* {{{ proto void HttpRequestPool::rewind() - * - * Implements Iterator::rewind(). - */ + Implements Iterator::rewind(). */ PHP_METHOD(HttpRequestPool, rewind) { NO_ARGS { @@ -470,11 +373,7 @@ PHP_METHOD(HttpRequestPool, rewind) /* }}} */ /* {{{ proto int HttpRequestPool::count() - * - * Implements Countable. - * - * Returns the number of attached HttpRequest objects. - */ + Implements Countable::count(). */ PHP_METHOD(HttpRequestPool, count) { NO_ARGS { @@ -485,11 +384,7 @@ PHP_METHOD(HttpRequestPool, count) /* }}} */ /* {{{ proto array HttpRequestPool::getAttachedRequests() - * - * Get attached HttpRequest objects. - * - * Returns an array containing all currently attached HttpRequest objects. - */ + Get attached HttpRequest objects. */ PHP_METHOD(HttpRequestPool, getAttachedRequests) { getObject(http_requestpool_object, obj); @@ -504,12 +399,7 @@ PHP_METHOD(HttpRequestPool, getAttachedRequests) /* }}} */ /* {{{ proto array HttpRequestPool::getFinishedRequests() - * - * Get attached HttpRequest objects that already have finished their work. - * - * Returns an array containing all attached HttpRequest objects that - * already have finished their work. - */ + Get attached HttpRequest objects that already have finished their work. */ PHP_METHOD(HttpRequestPool, getFinishedRequests) { getObject(http_requestpool_object, obj); @@ -523,16 +413,14 @@ PHP_METHOD(HttpRequestPool, getFinishedRequests) } /* }}} */ -/* {{{ proto bool HttpRequest::enablePiplelinig([bool enable = true]) - * - * Enables pipelining support for all attached requests if support in libcurl is given. - * - * Returns TRUE on success, or FALSE on failure. - */ +/* {{{ proto bool HttpRequestPool::enablePipelining([bool enable = true]) + Enables pipelining support for all attached requests if support in libcurl is given. */ PHP_METHOD(HttpRequestPool, enablePipelining) { zend_bool enable = 1; +#if defined(HAVE_CURL_MULTI_SETOPT) && HTTP_CURL_VERSION(7,16,0) getObject(http_requestpool_object, obj); +#endif if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &enable)) { RETURN_FALSE; @@ -546,6 +434,25 @@ PHP_METHOD(HttpRequestPool, enablePipelining) } /* }}} */ +/* {{{ proto bool HttpRequestPool::enableEvents([bool enable = true]) + Enables event-driven I/O if support in libcurl is given. */ +PHP_METHOD(HttpRequestPool, enableEvents) +{ + zend_bool enable = 1; +#if defined(HTTP_HAVE_EVENT) + getObject(http_requestpool_object, obj); +#endif + + if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &enable)) { +#if defined(HTTP_HAVE_EVENT) + obj->pool.useevents = enable; + RETURN_TRUE; +#endif + } + RETURN_FALSE; +} +/* }}} */ + #endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */ /*