From: Stephan Bosch Date: Sun, 26 Mar 2017 17:08:18 +0000 (+0200) Subject: lib-http: client: Fix aborting a request that has a delayed error. X-Git-Tag: 2.2.29.rc1~81 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c1b218cd6da5f6efcaedfad14e62c5710d254313;p=thirdparty%2Fdovecot%2Fcore.git lib-http: client: Fix aborting a request that has a delayed error. Caused by recent changes in delayed error handling. --- diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 00aa41a2b8..c13ba45dca 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -290,6 +290,8 @@ void http_client_request_destroy(struct http_client_request **_req) if (req->queue != NULL) http_client_queue_drop_request(req->queue, req); + if (req->delayed_error != NULL) + http_client_remove_request_error(req->client, req); if (req->destroy_callback != NULL) { void (*callback)(void *) = req->destroy_callback; @@ -1285,7 +1287,8 @@ void http_client_request_abort(struct http_client_request **_req) *_req = NULL; - if (req->state >= HTTP_REQUEST_STATE_FINISHED) + if (req->state >= HTTP_REQUEST_STATE_FINISHED && + req->delayed_error_status == 0) return; req->callback = NULL; diff --git a/src/lib-http/test-http-client-errors.c b/src/lib-http/test-http-client-errors.c index 33577e7617..572b0bd3e7 100644 --- a/src/lib-http/test-http-client-errors.c +++ b/src/lib-http/test-http-client-errors.c @@ -151,6 +151,84 @@ static void test_unconfigured_ssl(void) test_end(); } +/* + * Unconfigured SSL abort + */ + +/* client */ + +struct _unconfigured_ssl_abort { + unsigned int count; +}; + +static void +test_client_unconfigured_ssl_abort_response1( + const struct http_response *resp, + struct _unconfigured_ssl_abort *ctx ATTR_UNUSED) +{ + if (debug) + i_debug("RESPONSE: %u %s", resp->status, resp->reason); + + test_out_quiet("inappropriate callback", FALSE); +} + +static void +test_client_unconfigured_ssl_abort_response2( + const struct http_response *resp, + struct _unconfigured_ssl_abort *ctx) +{ + if (debug) + i_debug("RESPONSE: %u %s", resp->status, resp->reason); + + test_assert(resp->status == HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED); + test_assert(resp->reason != NULL && *resp->reason != '\0'); + + i_free(ctx); + io_loop_stop(ioloop); +} + +static bool +test_client_unconfigured_ssl_abort(const struct http_client_settings *client_set) +{ + struct http_client_request *hreq; + struct _unconfigured_ssl_abort *ctx; + + ctx = i_new(struct _unconfigured_ssl_abort, 1); + ctx->count = 1; + + http_client = http_client_init(client_set); + + hreq = http_client_request(http_client, + "GET", "127.0.0.1", "/unconfigured-ssl.txt", + test_client_unconfigured_ssl_abort_response1, ctx); + http_client_request_set_ssl(hreq, TRUE); + http_client_request_submit(hreq); + http_client_request_abort(&hreq); + + hreq = http_client_request(http_client, + "GET", "127.0.0.1", "/unconfigured-ssl2.txt", + test_client_unconfigured_ssl_abort_response2, ctx); + http_client_request_set_ssl(hreq, TRUE); + http_client_request_submit(hreq); + + return TRUE; +} + +/* test */ + +static void test_unconfigured_ssl_abort(void) +{ + struct http_client_settings http_client_set; + + test_client_defaults(&http_client_set); + + test_begin("unconfigured ssl abort"); + test_run_client_server(&http_client_set, + test_client_unconfigured_ssl_abort, + NULL, 0, NULL); + test_end(); +} + /* * Invalid URL */ @@ -2745,6 +2823,7 @@ static void test_reconnect_failure(void) static void (*test_functions[])(void) = { test_unconfigured_ssl, + test_unconfigured_ssl_abort, test_invalid_url, test_host_lookup_failed, test_connection_refused,