Skip to content

Commit

Permalink
lib-http: Support per-request timeout and max_attempts
Browse files Browse the repository at this point in the history
  • Loading branch information
sirainen committed Aug 7, 2016
1 parent 588a9f8 commit 41a9b7a
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 3 deletions.
7 changes: 5 additions & 2 deletions src/lib-http/http-client-connection.c
Expand Up @@ -358,7 +358,10 @@ http_client_connection_request_timeout(struct http_client_connection *conn)
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)
;
Expand Down Expand Up @@ -604,7 +607,7 @@ http_client_connection_return_response(
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);
Expand Down
2 changes: 2 additions & 0 deletions src/lib-http/http-client-private.h
Expand Up @@ -90,6 +90,8 @@ struct http_client_request {
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;
Expand Down
24 changes: 23 additions & 1 deletion src/lib-http/http-client-request.c
Expand Up @@ -78,6 +78,10 @@ http_client_request_new(struct http_client *client, const char *method,
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;
}
Expand Down Expand Up @@ -424,6 +428,24 @@ void http_client_request_set_timeout(struct http_client_request *req,
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)
{
Expand Down Expand Up @@ -1326,7 +1348,7 @@ bool http_client_request_try_retry(struct http_client_request *req)
(!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++;

Expand Down
7 changes: 7 additions & 0 deletions src/lib-http/http-client.h
Expand Up @@ -223,6 +223,13 @@ void http_client_request_set_timeout_msecs(struct http_client_request *req,
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);

Expand Down

0 comments on commit 41a9b7a

Please sign in to comment.