X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_requestpool_object.c;h=ff8f75d4431e073faec37dffefa09a240998935a;hp=fed57219ac4ae05d98dce1c773f126f7236182fd;hb=2eeaaf92d18d81751c5a52dcc7c1dbdfbcdfc28c;hpb=1a0dbb96fbe46a2edec1c813798cef7b0898eebe diff --git a/http_requestpool_object.c b/http_requestpool_object.c index fed5721..ff8f75d 100644 --- a/http_requestpool_object.c +++ b/http_requestpool_object.c @@ -67,8 +67,9 @@ HTTP_EMPTY_ARGS(count); HTTP_EMPTY_ARGS(getAttachedRequests); HTTP_EMPTY_ARGS(getFinishedRequests); -#define http_requestpool_object_declare_default_properties() _http_requestpool_object_declare_default_properties(TSRMLS_C) -static inline void _http_requestpool_object_declare_default_properties(TSRMLS_D); +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[] = { @@ -94,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 }; @@ -102,13 +105,14 @@ static zend_object_handlers http_requestpool_object_handlers; PHP_MINIT_FUNCTION(http_requestpool_object) { HTTP_REGISTER_CLASS_EX(HttpRequestPool, http_requestpool_object, NULL, 0); + http_requestpool_object_handlers.clone_obj = NULL; + #if defined(HAVE_SPL) && !defined(WONKY) zend_class_implements(http_requestpool_object_ce TSRMLS_CC, 2, spl_ce_Countable, zend_ce_iterator); #else zend_class_implements(http_requestpool_object_ce TSRMLS_CC, 1, zend_ce_iterator); #endif - - http_requestpool_object_handlers.clone_obj = NULL; + return SUCCESS; } @@ -123,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); @@ -132,23 +136,12 @@ zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC) return ov; } -static inline void _http_requestpool_object_declare_default_properties(TSRMLS_D) -{ - zend_class_entry *ce = http_requestpool_object_ce; - - DCL_PROP_N(PROTECTED, pool); -} - 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 @@ -207,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)); } /* }}} */ @@ -324,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); } @@ -400,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)); } @@ -415,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; @@ -442,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); } @@ -529,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 */ /*