# HG changeset patch # User Stephan Bosch # Date 1490548098 -7200 # Node ID f72bff0714140e970226862c98ce1f3f70623280 # Parent bb83a37813019d0e449e6f46f3e2aa250693ac4e lib-http: client: Fix aborting a request that has a delayed error. Caused by recent changes in delayed error handling. diff -r bb83a3781301 -r f72bff071414 src/lib-http/http-client-request.c --- a/src/lib-http/http-client-request.c Sun Mar 19 15:35:14 2017 +0200 +++ b/src/lib-http/http-client-request.c Sun Mar 26 19:08:18 2017 +0200 @@ -290,6 +290,8 @@ 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 @@ *_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 -r bb83a3781301 -r f72bff071414 src/lib-http/test-http-client-errors.c --- a/src/lib-http/test-http-client-errors.c Sun Mar 19 15:35:14 2017 +0200 +++ b/src/lib-http/test-http-client-errors.c Sun Mar 26 19:08:18 2017 +0200 @@ -152,6 +152,84 @@ } /* + * 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_functions[])(void) = { test_unconfigured_ssl, + test_unconfigured_ssl_abort, test_invalid_url, test_host_lookup_failed, test_connection_refused,