Mercurial > dovecot > core-2.2
changeset 20584:6ff9cfbbdf4c
lib-http: Support per-request timeout and max_attempts
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 04 Aug 2016 17:11:20 +0300 |
parents | c4cc24c77ad8 |
children | 3c5e3a14878b |
files | src/lib-http/http-client-connection.c src/lib-http/http-client-private.h src/lib-http/http-client-request.c src/lib-http/http-client.h |
diffstat | 4 files changed, 37 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-http/http-client-connection.c Tue Aug 02 23:25:57 2016 +0300 +++ b/src/lib-http/http-client-connection.c Thu Aug 04 17:11:20 2016 +0300 @@ -358,7 +358,10 @@ void http_client_connection_start_request_timeout( struct http_client_connection *conn) { - unsigned int timeout_msecs = conn->client->set.request_timeout_msecs; + unsigned int timeout_msecs = + conn->pending_request != NULL ? + conn->pending_request->attempt_timeout_msecs : + conn->client->set.request_timeout_msecs; if (timeout_msecs == 0) ; @@ -604,7 +607,7 @@ actual payload stream. */ conn->incoming_payload = response->payload = i_stream_create_timeout(response->payload, - conn->client->set.request_timeout_msecs); + req->attempt_timeout_msecs); i_stream_add_destroy_callback(response->payload, http_client_payload_destroyed, req);
--- a/src/lib-http/http-client-private.h Tue Aug 02 23:25:57 2016 +0300 +++ b/src/lib-http/http-client-private.h Thu Aug 04 17:11:20 2016 +0300 @@ -90,6 +90,8 @@ struct timeval response_time; struct timeval timeout_time; unsigned int timeout_msecs; + unsigned int attempt_timeout_msecs; + unsigned int max_attempts; unsigned int attempts; unsigned int redirects;
--- a/src/lib-http/http-client-request.c Tue Aug 02 23:25:57 2016 +0300 +++ b/src/lib-http/http-client-request.c Thu Aug 04 17:11:20 2016 +0300 @@ -78,6 +78,10 @@ req->context = context; req->date = (time_t)-1; + /* default to client-wide settings: */ + req->max_attempts = client->set.max_attempts; + req->attempt_timeout_msecs = client->set.request_timeout_msecs; + req->state = HTTP_REQUEST_STATE_NEW; return req; } @@ -424,6 +428,24 @@ req->timeout_msecs = 0; } +void http_client_request_set_attempt_timeout_msecs(struct http_client_request *req, + unsigned int msecs) +{ + i_assert(req->state == HTTP_REQUEST_STATE_NEW || + req->state == HTTP_REQUEST_STATE_GOT_RESPONSE); + + req->attempt_timeout_msecs = msecs; +} + +void http_client_request_set_max_attempts(struct http_client_request *req, + unsigned int max_attempts) +{ + i_assert(req->state == HTTP_REQUEST_STATE_NEW || + req->state == HTTP_REQUEST_STATE_GOT_RESPONSE); + + req->max_attempts = max_attempts; +} + void http_client_request_set_auth_simple(struct http_client_request *req, const char *username, const char *password) { @@ -1326,7 +1348,7 @@ (!req->payload_sync || req->payload_sync_continue)) return FALSE; /* limit the number of attempts for each request */ - if (req->attempts+1 >= req->client->set.max_attempts) + if (req->attempts+1 >= req->max_attempts) return FALSE; req->attempts++;
--- a/src/lib-http/http-client.h Tue Aug 02 23:25:57 2016 +0300 +++ b/src/lib-http/http-client.h Thu Aug 04 17:11:20 2016 +0300 @@ -223,6 +223,13 @@ void http_client_request_set_timeout(struct http_client_request *req, const struct timeval *time); +/* Override http_client_settings.request_timeout_msecs */ +void http_client_request_set_attempt_timeout_msecs(struct http_client_request *req, + unsigned int msecs); +/* Override http_client_settings.max_attempts */ +void http_client_request_set_max_attempts(struct http_client_request *req, + unsigned int max_attempts); + void http_client_request_set_auth_simple(struct http_client_request *req, const char *username, const char *password);