]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-http: http_client_deinit() calls any pending delayed failure callbacks.
authorTimo Sirainen <tss@iki.fi>
Wed, 10 Apr 2013 14:53:24 +0000 (17:53 +0300)
committerTimo Sirainen <tss@iki.fi>
Wed, 10 Apr 2013 14:53:24 +0000 (17:53 +0300)
src/lib-http/http-client-host.c
src/lib-http/http-client-request.c

index 5ba25bfa594a4582497fb1bde9e9bb176baf94a2..59f04633cc8ce472252cdb8d49a36881f73c2ddd 100644 (file)
@@ -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);
index 4f248cd96070b8a47d5ec75affc53e0624f92120..30bdafc81b53b6e623fc25dfdd22946786ae9f64 100644 (file)
@@ -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);
 }