void http_client_request_error_delayed(struct http_client_request **_req)
{
struct http_client_request *req = *_req;
+ const char *error = req->delayed_error;
+ unsigned int status = req->delayed_error_status;
bool destroy;
i_assert(req->state == HTTP_REQUEST_STATE_ABORTED);
*_req = NULL;
+ req->delayed_error = NULL;
+ req->delayed_error_status = 0;
- i_assert(req->delayed_error != NULL && req->delayed_error_status != 0);
- destroy = http_client_request_send_error(req, req->delayed_error_status,
- req->delayed_error);
+ i_assert(error != NULL && status != 0);
+ destroy = http_client_request_send_error(req, status, error);
if (req->queue != NULL)
http_client_queue_drop_request(req->queue, req);
if (destroy)
*_req = NULL;
+ i_assert(req->delayed_error_status == 0);
i_assert(req->state < HTTP_REQUEST_STATE_FINISHED);
req->state = HTTP_REQUEST_STATE_ABORTED;
/* we're still in http_client_request_submit() or in the callback
during a retry attempt. delay reporting the error, so the caller
doesn't have to handle immediate or nested callbacks. */
- i_assert(req->delayed_error == NULL);
req->delayed_error = p_strdup(req->pool, error);
req->delayed_error_status = status;
http_client_delay_request_error(req->client, req);
static void
http_client_handle_request_errors(struct http_client *client)
{
+ struct http_client_request *const *req_idx;
+
timeout_remove(&client->to_failing_requests);
- while (array_count(&client->delayed_failing_requests) > 0) {
- struct http_client_request *const *req_idx =
- array_idx(&client->delayed_failing_requests, 0);
+ array_foreach(&client->delayed_failing_requests, req_idx) {
struct http_client_request *req = *req_idx;
i_assert(req->refcount == 1);