From c6494255de7b934281dd052960fd8ab5aa48e79e Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 10 Apr 2013 17:53:24 +0300 Subject: [PATCH] lib-http: http_client_deinit() calls any pending delayed failure callbacks. --- src/lib-http/http-client-host.c | 9 ++++++- src/lib-http/http-client-request.c | 40 ++++++++++++++++-------------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/lib-http/http-client-host.c b/src/lib-http/http-client-host.c index 5ba25bfa59..59f04633cc 100644 --- a/src/lib-http/http-client-host.c +++ b/src/lib-http/http-client-host.c @@ -379,6 +379,7 @@ void http_client_host_free(struct http_client_host **_host) { struct http_client_host *host = *_host; struct http_client_host_port *hport; + struct http_client_request *req, *const *reqp; const char *hostname = host->name; http_client_host_debug(host, "Host destroy"); @@ -395,7 +396,13 @@ void http_client_host_free(struct http_client_host **_host) } array_free(&host->ports); - i_assert(array_count(&host->delayed_failing_requests) == 0); + while (array_count(&host->delayed_failing_requests) > 0) { + reqp = array_idx(&host->delayed_failing_requests, 0); + req = *reqp; + + i_assert(req->refcount == 1); + http_client_request_unref(&req); + } array_free(&host->delayed_failing_requests); i_free(host->ips); diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 4f248cd960..30bdafc81b 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -49,6 +49,7 @@ http_client_request_debug(struct http_client_request *req, /* * Request */ +static void http_client_request_remove_delayed(struct http_client_request *req); #undef http_client_request struct http_client_request * @@ -81,23 +82,6 @@ void http_client_request_ref(struct http_client_request *req) req->refcount++; } -static void http_client_request_remove_delayed(struct http_client_request *req) -{ - struct http_client_request *const *reqs; - unsigned int i, count; - - timeout_remove(&req->to_delayed_error); - - reqs = array_get(&req->host->delayed_failing_requests, &count); - for (i = 0; i < count; i++) { - if (reqs[i] == req) { - array_delete(&req->host->delayed_failing_requests, i, 1); - return; - } - } - i_unreached(); -} - void http_client_request_unref(struct http_client_request **_req) { struct http_client_request *req = *_req; @@ -487,11 +471,29 @@ http_client_request_send_error(struct http_client_request *req, } } -static void http_client_request_error_delayed(struct http_client_request *req) +static void http_client_request_remove_delayed(struct http_client_request *req) { - http_client_request_remove_delayed(req); + struct http_client_request *const *reqs; + unsigned int i, count; + http_client_request_send_error(req, req->delayed_error_status, req->delayed_error); + + timeout_remove(&req->to_delayed_error); + + reqs = array_get(&req->host->delayed_failing_requests, &count); + for (i = 0; i < count; i++) { + if (reqs[i] == req) { + array_delete(&req->host->delayed_failing_requests, i, 1); + return; + } + } + i_unreached(); +} + +static void http_client_request_error_delayed(struct http_client_request *req) +{ + http_client_request_remove_delayed(req); http_client_request_unref(&req); } -- 2.47.3