#if defined(ZEND_ENGINE_2) && defined(HTTP_HAVE_CURL)
#include "php_http_std_defs.h"
+#include "php_http_api.h"
#include "php_http_requestpool_object.h"
#include "php_http_request_pool_api.h"
#include "php_http_request_object.h"
HTTP_EMPTY_ARGS(next, 0);
HTTP_EMPTY_ARGS(rewind, 0);
+HTTP_EMPTY_ARGS(getAttachedRequests, 0);
+HTTP_EMPTY_ARGS(getFinishedRequests, 0);
+
#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_REQPOOL_ME(key, ZEND_ACC_PUBLIC)
HTTP_REQPOOL_ME(next, ZEND_ACC_PUBLIC)
HTTP_REQPOOL_ME(rewind, ZEND_ACC_PUBLIC)
+
+ HTTP_REQPOOL_ME(getAttachedRequests, ZEND_ACC_PUBLIC)
+ HTTP_REQPOOL_ME(getFinishedRequests, ZEND_ACC_PUBLIC)
EMPTY_FUNCTION_ENTRY
};
static zend_object_handlers http_requestpool_object_handlers;
-void _http_requestpool_object_init(INIT_FUNC_ARGS)
+PHP_MINIT_FUNCTION(http_requestpool_object)
{
HTTP_REGISTER_CLASS_EX(HttpRequestPool, http_requestpool_object, NULL, 0);
zend_class_implements(http_requestpool_object_ce TSRMLS_CC, 1, zend_ce_iterator);
+ return SUCCESS;
}
zend_object_value _http_requestpool_object_new(zend_class_entry *ce TSRMLS_DC)
efree(o);
}
+#define http_requestpool_object_llist2array _http_requestpool_object_llist2array
+static void _http_requestpool_object_llist2array(zval **req, zval *array TSRMLS_DC)
+{
+ zval_add_ref(req);
+ Z_OBJ_ADDREF_PP(req);
+ add_next_index_zval(array, *req);
+}
+
/* ### USERLAND ### */
/* {{{ proto void HttpRequestPool::__construct([HttpRequest request[, ...]])
getObject(http_requestpool_object, obj);
NO_ARGS;
-
+
+ obj->iterator.pos = 0;
http_request_pool_detach_all(&obj->pool);
}
SET_EH_THROW_HTTP();
if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
- status = http_request_pool_attach(&obj->pool, request);
+ if (obj->iterator.pos > 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles)) {
+ http_error(HE_THROW, HTTP_E_REQUEST_POOL, "Cannot attach to the HttpRequestPool while the iterator is active");
+ } else {
+ status = http_request_pool_attach(&obj->pool, request);
+ }
}
SET_EH_NORMAL();
RETURN_SUCCESS(status);
SET_EH_THROW_HTTP();
if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &request, http_request_object_ce)) {
+ obj->iterator.pos = -1;
status = http_request_pool_detach(&obj->pool, request);
}
SET_EH_NORMAL();
* Usage:
* <pre>
* <?php
- * while ($pool->socketPerform()) {
- * do_something_else();
- * if (!$pool->socketSelect()) {
- * die('Socket error');
+ * 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>
*/
if (0 < http_request_pool_perform(&obj->pool)) {
RETURN_TRUE;
} else {
- zend_llist_apply(&obj->pool.handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
RETURN_FALSE;
}
}
IF_RETVAL_USED {
getObject(http_requestpool_object, obj);
- RETURN_BOOL(obj->iterator.pos < zend_llist_count(&obj->pool.handles));
+ RETURN_BOOL(obj->iterator.pos >= 0 && obj->iterator.pos < zend_llist_count(&obj->pool.handles));
}
}
/* }}} */
}
/* }}} */
+/* {{{ proto array HttpRequestPool::getAttachedRequests()
+ *
+ * Get attached HttpRequest objects.
+ *
+ * Returns an array containing all currently attached HttpRequest objects.
+ */
+PHP_METHOD(HttpRequestPool, getAttachedRequests)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ array_init(return_value);
+ zend_llist_apply_with_argument(&obj->pool.handles,
+ (llist_apply_with_arg_func_t) http_requestpool_object_llist2array,
+ return_value TSRMLS_CC);
+}
+/* }}} */
+
+/* {{{ 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.
+ */
+PHP_METHOD(HttpRequestPool, getFinishedRequests)
+{
+ getObject(http_requestpool_object, obj);
+
+ NO_ARGS;
+
+ array_init(return_value);
+ zend_llist_apply_with_argument(&obj->pool.finished,
+ (llist_apply_with_arg_func_t) http_requestpool_object_llist2array,
+ return_value TSRMLS_CC);
+}
+/* }}} */
+
#endif /* ZEND_ENGINE_2 && HTTP_HAVE_CURL */
/*