X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_requestpool_object.c;h=3a203eff75925b013391a2022374dd1664babdb9;hp=69c3f9616a0ade832514f9e38e153d90d61c2655;hb=05409e41ac15cb4146b6a46a7e2be671c91c5884;hpb=6aca56d611a22eb559098f3c02c31634a6f9ff9f diff --git a/http_requestpool_object.c b/http_requestpool_object.c index 69c3f96..3a203ef 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -67,6 +67,10 @@ HTTP_EMPTY_ARGS(count); HTTP_EMPTY_ARGS(getAttachedRequests); HTTP_EMPTY_ARGS(getFinishedRequests); +HTTP_BEGIN_ARGS(enablePipelining, 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) @@ -91,6 +95,8 @@ zend_function_entry http_requestpool_object_fe[] = { HTTP_REQPOOL_ME(getAttachedRequests, ZEND_ACC_PUBLIC) HTTP_REQPOOL_ME(getFinishedRequests, ZEND_ACC_PUBLIC) + + HTTP_REQPOOL_ME(enablePipelining, ZEND_ACC_PUBLIC) EMPTY_FUNCTION_ENTRY }; @@ -148,40 +154,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,9 +178,7 @@ PHP_METHOD(HttpRequestPool, __construct) /* }}} */ /* {{{ proto void HttpRequestPool::__destruct() - * - * Clean up HttpRequestPool object. - */ + Clean up HttpRequestPool object. */ PHP_METHOD(HttpRequestPool, __destruct) { getObject(http_requestpool_object, obj); @@ -219,9 +190,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); @@ -233,18 +202,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; @@ -265,16 +223,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; @@ -292,13 +241,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; @@ -318,36 +261,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); @@ -362,12 +276,7 @@ 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() */ PHP_METHOD(HttpRequestPool, socketSelect) { getObject(http_requestpool_object, obj); @@ -378,12 +287,8 @@ PHP_METHOD(HttpRequestPool, socketSelect) } /* }}} */ -/* implements Iterator */ - /* {{{ proto bool HttpRequestPool::valid() - * - * Implements Iterator::valid(). - */ + Implements Iterator::valid(). */ PHP_METHOD(HttpRequestPool, valid) { NO_ARGS; @@ -396,9 +301,7 @@ PHP_METHOD(HttpRequestPool, valid) /* }}} */ /* {{{ proto HttpRequest HttpRequestPool::current() - * - * Implements Iterator::current(). - */ + Implements Iterator::current(). */ PHP_METHOD(HttpRequestPool, current) { NO_ARGS; @@ -423,9 +326,7 @@ PHP_METHOD(HttpRequestPool, current) /* }}} */ /* {{{ proto int HttpRequestPool::key() - * - * Implements Iterator::key(). - */ + Implements Iterator::key(). */ PHP_METHOD(HttpRequestPool, key) { NO_ARGS; @@ -438,9 +339,7 @@ PHP_METHOD(HttpRequestPool, key) /* }}} */ /* {{{ proto void HttpRequestPool::next() - * - * Implements Iterator::next(). - */ + Implements Iterator::next(). */ PHP_METHOD(HttpRequestPool, next) { NO_ARGS { @@ -451,9 +350,7 @@ PHP_METHOD(HttpRequestPool, next) /* }}} */ /* {{{ proto void HttpRequestPool::rewind() - * - * Implements Iterator::rewind(). - */ + Implements Iterator::rewind(). */ PHP_METHOD(HttpRequestPool, rewind) { NO_ARGS { @@ -464,11 +361,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 { @@ -479,11 +372,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); @@ -498,12 +387,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); @@ -517,6 +401,25 @@ PHP_METHOD(HttpRequestPool, getFinishedRequests) } /* }}} */ +/* {{{ proto bool HttpRequest::enablePiplelinig([bool enable = true]) + Enables pipelining support for all attached requests if support in libcurl is given. */ +PHP_METHOD(HttpRequestPool, enablePipelining) +{ + zend_bool enable = 1; + getObject(http_requestpool_object, obj); + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &enable)) { + RETURN_FALSE; + } +#if defined(HAVE_CURL_MULTI_SETOPT) && HTTP_CURL_VERSION(7,16,0) + if (CURLM_OK == curl_multi_setopt(obj->pool.ch, CURLMOPT_PIPELINING, (long) enable)) { + RETURN_TRUE; + } +#endif + RETURN_FALSE; +} +/* }}} */ + #endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */ /*