From: Stephan Bosch Date: Fri, 24 Oct 2014 22:38:42 +0000 (+0300) Subject: lib-http: client: Fixed conflict between request abort and request delayed error. X-Git-Tag: 2.2.15~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9145c8b5eda526d05bd4a7ced20f6f6f2ff8df03;p=thirdparty%2Fdovecot%2Fcore.git lib-http: client: Fixed conflict between request abort and request delayed error. --- diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index 1dc0d1760d..c6fb50bcb6 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -273,8 +273,6 @@ void http_client_request_connect_callback(struct http_client_request *req, void http_client_request_resubmit(struct http_client_request *req); void http_client_request_retry(struct http_client_request *req, unsigned int status, const char *error); -void http_client_request_send_error(struct http_client_request *req, - unsigned int status, const char *error); void http_client_request_error_delayed(struct http_client_request **_req); void http_client_request_error(struct http_client_request *req, unsigned int status, const char *error); diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 760a1e67ba..8f72bd654f 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -54,6 +54,10 @@ http_client_request_debug(struct http_client_request *req, * Request */ +static void +http_client_request_send_error(struct http_client_request *req, + unsigned int status, const char *error); + static struct http_client_request * http_client_request_new(struct http_client *client, const char *method, http_client_request_callback_t *callback, void *context) @@ -861,15 +865,13 @@ bool http_client_request_callback(struct http_client_request *req, return TRUE; } -void +static void http_client_request_send_error(struct http_client_request *req, unsigned int status, const char *error) { http_client_request_callback_t *callback; bool sending = (req->state == HTTP_REQUEST_STATE_PAYLOAD_OUT); - if (req->state >= HTTP_REQUEST_STATE_FINISHED) - return; req->state = HTTP_REQUEST_STATE_ABORTED; callback = req->callback; @@ -890,8 +892,7 @@ void http_client_request_error_delayed(struct http_client_request **_req) { struct http_client_request *req = *_req; - if (req->state >= HTTP_REQUEST_STATE_FINISHED) - return; + i_assert(req->state == HTTP_REQUEST_STATE_ABORTED); i_assert(req->delayed_error != NULL && req->delayed_error_status != 0); http_client_request_send_error(req, req->delayed_error_status, @@ -906,6 +907,7 @@ void http_client_request_error(struct http_client_request *req, { if (req->state >= HTTP_REQUEST_STATE_FINISHED) return; + req->state = HTTP_REQUEST_STATE_ABORTED; if (req->queue != NULL) http_client_queue_drop_request(req->queue, req);