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);