# define curl_multi_strerror(dummy) "unknown error"
#endif
-static void http_request_pool_freebody(http_request_body **body);
+static void http_request_pool_freebody(http_request_callback_ctx **body);
static int http_request_pool_compare_handles(void *h1, void *h2);
/* {{{ http_request_pool *http_request_pool_init(http_request_pool *) */
pool->ch = NULL;
}
+ HTTP_CHECK_CURL_INIT(pool->ch, curl_multi_init(), ;);
if (!pool->ch) {
- if (!(pool->ch = curl_multi_init())) {
- http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl");
- if (free_pool) {
- efree(pool);
- }
- return NULL;
+ if (free_pool) {
+ efree(pool);
}
+ return NULL;
}
pool->unfinished = 0;
zend_llist_init(&pool->handles, sizeof(zval *), (llist_dtor_func_t) ZVAL_PTR_DTOR, 0);
- zend_llist_init(&pool->bodies, sizeof(http_request_body *), (llist_dtor_func_t) http_request_pool_freebody, 0);
+ zend_llist_init(&pool->bodies, sizeof(http_request_callback_ctx *), (llist_dtor_func_t) http_request_pool_freebody, 0);
#if HTTP_DEBUG_REQPOOLS
fprintf(stderr, "Initialized request pool %p\n", pool);
#endif
if (req->pool) {
http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "HttpRequest object(#%d) is already member of %s HttpRequestPool", Z_OBJ_HANDLE_P(request), req->pool == pool ? "this" : "another");
} else {
- http_request_body *body = http_request_body_new();
+ http_request_callback_ctx *body = http_request_callback_data_ex(http_request_body_new(), 0);
- if (SUCCESS != http_request_pool_requesthandler(request, body)) {
+ if (SUCCESS != http_request_pool_requesthandler(request, body->data)) {
http_error_ex(HE_WARNING, HTTP_E_REQUEST, "Could not initialize HttpRequest object for attaching to the HttpRequestPool");
} else {
CURLMcode code = curl_multi_add_handle(pool->ch, req->ch);
return SUCCESS;
}
}
+ efree(body->data);
efree(body);
}
return FAILURE;
for (handle = zend_llist_get_first_ex(&pool->handles, &pos); handle; handle = zend_llist_get_next_ex(&pool->handles, &pos)) {
handles[i++] = *handle;
}
+ /* should never happen */
+ if (i != count) {
+ zend_error(E_ERROR, "number of fetched request handles do not match overall count");
+ count = i;
+ }
for (i = 0; i < count; ++i) {
http_request_pool_detach(pool, handles[i]);
}
efree(handles);
}
+#if HTTP_DEBUG_REQPOOLS
+ fprintf(stderr, "Destroying %d request bodies of pool %p\n", zend_llist_count(&pool->bodies), pool);
+#endif
+ /* free created bodies too */
+ zend_llist_clean(&pool->bodies);
}
-
/* {{{ STATUS http_request_pool_send(http_request_pool *) */
PHP_HTTP_API STATUS _http_request_pool_send(http_request_pool *pool TSRMLS_DC)
{
fprintf(stderr, "Attempt to send %d requests of pool %p\n", zend_llist_count(&pool->handles), pool);
#endif
while (http_request_pool_perform(pool)) {
-#if HTTP_DEBUG_REQPOOLS
- fprintf(stderr, "> %d unfinished requests of pool %p remaining\n", pool->unfinished, pool);
-#endif
if (SUCCESS != http_request_pool_select(pool)) {
#ifdef PHP_WIN32
http_error(HE_WARNING, HTTP_E_SOCKET, WSAGetLastError());
}
#if HTTP_DEBUG_REQPOOLS
fprintf(stderr, "Finished sending %d HttpRequests of pool %p (still unfinished: %d)\n", zend_llist_count(&pool->handles), pool, pool->unfinished);
+ {
+ int remaining = 0;
+ CURLMsg *msg;
+ /*
+ * FIXXME: populate --somehow
+ */
+ do {
+ if (msg = curl_multi_info_read(pool->ch, &remaining))
+ fprintf(stderr, "CURL: %s (%d)\n", curl_easy_strerror(msg->data.result), msg->data.result);
+ } while (remaining);
+ }
#endif
zend_llist_apply(&pool->handles, (llist_apply_func_t) http_request_pool_responsehandler TSRMLS_CC);
return SUCCESS;
/*#*/
-/* {{{ static void http_request_pool_freebody(http_request_body **) */
-static void http_request_pool_freebody(http_request_body **body)
+/* {{{ static void http_request_pool_freebody(http_request_ctx **) */
+static void http_request_pool_freebody(http_request_callback_ctx **body)
{
- TSRMLS_FETCH();
- http_request_body_free(*body);
+ HTTP_REQUEST_CALLBACK_DATA(*body, http_request_body *, b);
+ http_request_body_free(b);
+ efree(*body);
}
/* }}} */