- use const php_hash_ops*
[m6w6/ext-http] / http_requestpool_object.c
index 69c3f9616a0ade832514f9e38e153d90d61c2655..3a203eff75925b013391a2022374dd1664babdb9 100644 (file)
@@ -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:
- * <pre>
- * <?php
- * try {
- *     $pool = new HttpRequestPool(
- *         new HttpRequest('http://www.google.com/', HttpRequest::METH_HEAD),
- *         new HttpRequest('http://www.php.net/', HttpRequest::METH_HEAD)
- *     );
- *     $pool->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;
- * }
- * ?>
- * </pre>
- */
+       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:
- * <pre>
- * <?php
- * class MyPool extends HttpRequestPool
- * {
- *     public function send()
- *     {
- *         while ($this->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;
- *     }
- * } 
- * ?>
- * </pre>
- */
+       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 */
 
 /*