From: Stephan Bosch Date: Sat, 12 Oct 2013 07:54:10 +0000 (+0300) Subject: lib-http: http-client: When client request is retried based on a response received... X-Git-Tag: 2.2.7~80 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0252ab930ea091e4c5ff18974ea2a21df00cab52;p=thirdparty%2Fdovecot%2Fcore.git lib-http: http-client: When client request is retried based on a response received from server, return full response to caller if retry is not possible. Before, it would construct a dummy-response that basically retains only the status and reason elements. This is currently only relevant for the way a 417 Expectation Failed response from the server is handled. --- diff --git a/src/lib-http/http-client-connection.c b/src/lib-http/http-client-connection.c index 4e2ca69368..072d25dd50 100644 --- a/src/lib-http/http-client-connection.c +++ b/src/lib-http/http-client-connection.c @@ -593,7 +593,7 @@ static void http_client_connection_input(struct connection *_conn) req->payload_sync = FALSE; conn->output_locked = FALSE; conn->peer->no_payload_sync = TRUE; - http_client_request_retry(req, response.status, response.reason); + http_client_request_retry_response(req, &response); } else if (response.status / 100 == 3 && response.status != 304 && response.location != NULL) { diff --git a/src/lib-http/http-client-private.h b/src/lib-http/http-client-private.h index 378efce670..ddf554991f 100644 --- a/src/lib-http/http-client-private.h +++ b/src/lib-http/http-client-private.h @@ -240,6 +240,8 @@ bool http_client_request_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_retry_response(struct http_client_request *req, + struct http_response *response); void http_client_request_error(struct http_client_request *req, unsigned int status, const char *error); void http_client_request_redirect(struct http_client_request *req, diff --git a/src/lib-http/http-client-request.c b/src/lib-http/http-client-request.c index 448ff429b6..86a6c3c3ae 100644 --- a/src/lib-http/http-client-request.c +++ b/src/lib-http/http-client-request.c @@ -773,6 +773,16 @@ void http_client_request_retry(struct http_client_request *req, http_client_request_error(req, status, error); } +void http_client_request_retry_response(struct http_client_request *req, + struct http_response *response) +{ + if (!http_client_request_try_retry(req)) { + i_assert(req->submitted || req->state >= HTTP_REQUEST_STATE_FINISHED); + (void)http_client_request_callback(req, response); + http_client_request_unref(&req); + } +} + bool http_client_request_try_retry(struct http_client_request *req) { /* limit the number of attempts for each request */