This enables the following pattern:
<?php
use http\Client;
function handle_response_and_dequeue($res) {
var_dump($res->getResponseCode());
return true; //dequeue
}
$client = new Client;
$client->enqueue(new Client\Request(...),"handle_response_and_dequeue");
$client->enqueue(new Client\Request(...),"handle_response_and_dequeue");
$client->enqueue(new Client\Request(...),"handle_response_and_dequeue");
while (count($client)) {
try {
$client->send();
} catch (Exception $e) {
echo $e->getMessage(),"\n";
}
}
static void php_http_curlm_responsehandler(php_http_client_t *context)
{
static void php_http_curlm_responsehandler(php_http_client_t *context)
{
+ int err_count = 0, remaining = 0;
+ php_http_curle_storage_t *st, *err = NULL;
php_http_client_enqueue_t *enqueue;
php_http_client_curl_t *curl = context->ctx;
TSRMLS_FETCH_FROM_CTX(context->ts);
php_http_client_enqueue_t *enqueue;
php_http_client_curl_t *curl = context->ctx;
TSRMLS_FETCH_FROM_CTX(context->ts);
if (msg && CURLMSG_DONE == msg->msg) {
if (CURLE_OK != msg->data.result) {
if (msg && CURLMSG_DONE == msg->msg) {
if (CURLE_OK != msg->data.result) {
- php_http_curle_storage_t *st = php_http_curle_get_storage(msg->easy_handle);
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s; %s (%s)", curl_easy_strerror(st->errorcode = msg->data.result), STR_PTR(st->errorbuffer), STR_PTR(st->url));
+ st = php_http_curle_get_storage(msg->easy_handle);
+ st->errorcode = msg->data.result;
+
+ /* defer the warnings/exceptions, so the callback is still called for this request */
+ if (!err) {
+ err = ecalloc(remaining + 1, sizeof(*err));
+ }
+ memcpy(&err[err_count], st, sizeof(*st));
+ if (st->url) {
+ err[err_count].url = estrdup(st->url);
+ }
+ err_count++;
}
if ((enqueue = php_http_client_enqueued(context, msg->easy_handle, compare_queue))) {
}
if ((enqueue = php_http_client_enqueued(context, msg->easy_handle, compare_queue))) {
+
+ if (err_count) {
+ int i = 0;
+
+ do {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s; %s (%s)", curl_easy_strerror(err[i].errorcode), err[i].errorbuffer, STR_PTR(err[i].url));
+ if (err[i].url) {
+ efree(err[i].url);
+ }
+ } while (++i < err_count);
+
+ efree(err);
+ }
}
#if PHP_HTTP_HAVE_EVENT
}
#if PHP_HTTP_HAVE_EVENT
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error in event_base_dispatch()");
return FAILURE;
}
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error in event_base_dispatch()");
return FAILURE;
}
- } while (curl->unfinished);
+ } while (curl->unfinished && !EG(exception));
- while (php_http_client_curl_once(h)) {
+ while (php_http_client_curl_once(h) && !EG(exception)) {
if (SUCCESS != php_http_client_curl_wait(h, NULL)) {
#ifdef PHP_WIN32
/* see http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp */
if (SUCCESS != php_http_client_curl_wait(h, NULL)) {
#ifdef PHP_WIN32
/* see http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp */