- add pipelining support to HttpRequestPool (libcurl >= 7.16.0)
[m6w6/ext-http] / http_requestpool_object.c
index c49edc559f7c35ce4dee6073f52cf963d8dc9204..ff8f75d4431e073faec37dffefa09a240998935a 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
 };
@@ -121,7 +127,7 @@ zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC)
        http_request_pool_init(&o->pool);
 
        ALLOC_HASHTABLE(OBJ_PROP(o));
-       zend_hash_init(OBJ_PROP(o), 0, NULL, ZVAL_PTR_DTOR, 0);
+       zend_hash_init(OBJ_PROP(o), zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
        zend_hash_copy(OBJ_PROP(o), &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
 
        ov.handle = putObject(http_requestpool_object, o);
@@ -134,12 +140,8 @@ void _http_requestpool_object_free(zend_object *object TSRMLS_DC)
 {
        http_requestpool_object *o = (http_requestpool_object *) object;
 
-       if (OBJ_PROP(o)) {
-               zend_hash_destroy(OBJ_PROP(o));
-               FREE_HASHTABLE(OBJ_PROP(o));
-       }
        http_request_pool_dtor(&o->pool);
-       efree(o);
+       freeObject(o);
 }
 
 #define http_requestpool_object_llist2array _http_requestpool_object_llist2array
@@ -198,15 +200,13 @@ PHP_METHOD(HttpRequestPool, __construct)
 
                for (i = 0; i < argc; ++i) {
                        if (Z_TYPE_PP(argv[i]) == IS_OBJECT && instanceof_function(Z_OBJCE_PP(argv[i]), http_request_object_ce TSRMLS_CC)) {
-                               http_request_pool_try {
-                                       http_request_pool_attach(&obj->pool, *(argv[i]));
-                               } http_request_pool_catch();
+                               http_request_pool_attach(&obj->pool, *(argv[i]));
                        }
                }
-               http_request_pool_final();
        }
        efree(argv);
        SET_EH_NORMAL();
+       http_final(HTTP_EX_CE(request_pool));
 }
 /* }}} */
 
@@ -315,6 +315,9 @@ PHP_METHOD(HttpRequestPool, send)
        SET_EH_THROW_HTTP();
        status = http_request_pool_send(&obj->pool);
        SET_EH_NORMAL();
+       
+       /* rethrow as HttpRequestPoolException */
+       http_final(HTTP_EX_CE(request_pool));
 
        RETURN_SUCCESS(status);
 }
@@ -391,7 +394,7 @@ PHP_METHOD(HttpRequestPool, valid)
 {
        NO_ARGS;
 
-       IF_RETVAL_USED {
+       if (return_value_used) {
                getObject(http_requestpool_object, obj);
                RETURN_BOOL(obj->iterator.pos >= 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles));
        }
@@ -406,7 +409,7 @@ PHP_METHOD(HttpRequestPool, current)
 {
        NO_ARGS;
 
-       IF_RETVAL_USED {
+       if (return_value_used) {
                long pos = 0;
                zval **current = NULL;
                zend_llist_position lpos;
@@ -433,7 +436,7 @@ PHP_METHOD(HttpRequestPool, key)
 {
        NO_ARGS;
 
-       IF_RETVAL_USED {
+       if (return_value_used) {
                getObject(http_requestpool_object, obj);
                RETURN_LONG(obj->iterator.pos);
        }
@@ -520,6 +523,29 @@ 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.
+ */
+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 */
 
 /*