return req;
}
+static void
+http_client_request_add(struct http_client_request *req)
+{
+ struct http_client *client = req->client;
+
+ DLLIST_PREPEND(&client->requests_list, req);
+ client->requests_count++;
+ req->listed = TRUE;
+}
+
+static void
+http_client_request_remove(struct http_client_request *req)
+{
+ struct http_client *client = req->client;
+
+ if (req->listed) {
+ /* only decrease pending request counter if this request was submitted */
+ DLLIST_REMOVE(&client->requests_list, req);
+ client->requests_count--;
+ }
+ req->listed = FALSE;
+
+ if (client->requests_count == 0 && client->ioloop != NULL)
+ io_loop_stop(client->ioloop);
+}
+
void http_client_request_ref(struct http_client_request *req)
{
i_assert(req->refcount > 0);
req->destroy_callback = NULL;
}
- /* only decrease pending request counter if this request was submitted */
- if (req->submitted) {
- DLLIST_REMOVE(&client->requests_list, req);
- client->requests_count--;
- }
+ http_client_request_remove(req);
if (client->requests_count == 0 && client->ioloop != NULL)
io_loop_stop(client->ioloop);
http_client_request_debug(req, "Destroy (requests left=%d)",
client->requests_count);
+ if (req->state < HTTP_REQUEST_STATE_FINISHED)
+ req->state = HTTP_REQUEST_STATE_ABORTED;
+ req->callback = NULL;
+
if (req->queue != NULL)
http_client_queue_drop_request(req->queue, req);
req->destroy_callback = NULL;
callback(req->destroy_context);
}
+ http_client_request_remove(req);
http_client_request_unref(&req);
}
void http_client_request_submit(struct http_client_request *req)
{
- struct http_client *client = req->client;
-
req->submit_time = ioloop_timeval;
http_client_request_do_submit(req);
http_client_request_debug(req, "Submitted");
req->submitted = TRUE;
- DLLIST_PREPEND(&client->requests_list, req);
- client->requests_count++;
+ http_client_request_add(req);
}
void
void http_client_deinit(struct http_client **_client)
{
struct http_client *client = *_client;
- struct http_client_request *req, *const *req_idx;
+ struct http_client_request *req;
struct http_client_host *host;
struct http_client_peer *peer;
*_client = NULL;
- /* drop delayed failing requests */
- while (array_count(&client->delayed_failing_requests) > 0) {
- req_idx = array_idx(&client->delayed_failing_requests, 0);
- req = *req_idx;
-
- i_assert(req->refcount == 1);
- http_client_request_error_delayed(&req);
+ /* destroy requests without calling callbacks */
+ req = client->requests_list;
+ while (req != NULL) {
+ struct http_client_request *next_req = req->next;
+ http_client_request_destroy(&req);
+ req = next_req;
}
- array_free(&client->delayed_failing_requests);
-
- if (client->to_failing_requests != NULL)
- timeout_remove(&client->to_failing_requests);
+ i_assert(client->requests_count == 0);
/* free peers */
while (client->peers_list != NULL) {
}
hash_table_destroy(&client->hosts);
+ array_free(&client->delayed_failing_requests);
+ if (client->to_failing_requests != NULL)
+ timeout_remove(&client->to_failing_requests);
+
connection_list_deinit(&client->conn_list);
if (client->ssl_ctx != NULL)