Simplifies the following commits.
http_client_connection_get_settings(struct http_client_connection *conn)
{
i_assert(conn->peer != NULL);
- return &conn->peer->client->set;
+ return conn->peer->client->set;
}
static inline void
if (http_client_request_try_retry(req))
handled = TRUE;
/* Redirection */
- } else if (!req->client->set.no_auto_redirect &&
+ } else if (!req->client->set->no_auto_redirect &&
response.status / 100 == 3 &&
response.status != 304 &&
response.location != NULL) {
struct http_client_peer_pool *ppool = peer->ppool;
struct http_client_context *cctx = pshared->cctx;
struct http_client *client = peer->client;
- const struct http_client_settings *set = &client->set;
+ const struct http_client_settings *set = client->set;
struct http_client_connection *conn;
const struct http_client_peer_addr *addr = &pshared->addr;
const char *conn_type;
{
struct http_client_peer_pool *ppool;
struct ssl_iostream_context *ssl_ctx = client->ssl_ctx;
- const char *rawlog_dir = client->set.rawlog_dir;
+ const char *rawlog_dir = client->set->rawlog_dir;
i_assert(!http_client_peer_addr_is_https(&pshared->addr) ||
ssl_ctx != NULL);
peer = pshared->peers_list;
while (peer != NULL) {
- const struct http_client_settings *set = &peer->client->set;
+ const struct http_client_settings *set = peer->client->set;
unsigned int client_max_conns = set->max_parallel_connections;
if ((UINT_MAX - max_conns) <= client_max_conns)
/* Choose backoff times */
if (pshared->peers_list == NULL ||
- (client->set.connect_backoff_time_msecs <
+ (client->set->connect_backoff_time_msecs <
pshared->backoff_initial_time_msecs)) {
pshared->backoff_initial_time_msecs =
- client->set.connect_backoff_time_msecs;
+ client->set->connect_backoff_time_msecs;
}
if (pshared->peers_list == NULL ||
- (client->set.connect_backoff_max_time_msecs >
+ (client->set->connect_backoff_max_time_msecs >
pshared->backoff_max_time_msecs)) {
pshared->backoff_max_time_msecs =
- client->set.connect_backoff_max_time_msecs;
+ client->set->connect_backoff_max_time_msecs;
}
e_debug(peer->event, "Peer created");
while (peer != NULL) {
struct http_client *client = peer->client;
- if (client->set.connect_backoff_time_msecs <
+ if (client->set->connect_backoff_time_msecs <
pshared->backoff_initial_time_msecs) {
pshared->backoff_initial_time_msecs =
- client->set.connect_backoff_time_msecs;
+ client->set->connect_backoff_time_msecs;
}
- if (client->set.connect_backoff_max_time_msecs >
+ if (client->set->connect_backoff_max_time_msecs >
pshared->backoff_max_time_msecs) {
pshared->backoff_max_time_msecs =
- client->set.connect_backoff_max_time_msecs;
+ client->set->connect_backoff_max_time_msecs;
}
peer = peer->shared_next;
}
new_connections = 0;
} else {
if ((working_conn_count - connecting + num_urgent) >=
- peer->client->set.max_parallel_connections) {
+ peer->client->set->max_parallel_connections) {
/* Only create connections for urgent requests */
new_connections = (num_urgent > connecting ?
num_urgent - connecting : 0);
new_connections = (connecting == 0 ? 1 : 0);
}
} else if ((num_pending - connecting) >
- (peer->client->set.max_parallel_connections -
+ (peer->client->set->max_parallel_connections -
working_conn_count)) {
/* Create maximum allowed connections */
new_connections =
- (peer->client->set.max_parallel_connections -
+ (peer->client->set->max_parallel_connections -
working_conn_count);
} else {
/* Create as many connections as we need */
/* Cannot create new connections for normal request; attempt pipelining
*/
if ((working_conn_count - connecting) >=
- peer->client->set.max_parallel_connections) {
+ peer->client->set->max_parallel_connections) {
unsigned int pipeline_level = 0, total_handled = 0, handled;
if (!pshared->allows_pipelining) {
struct http_client {
pool_t pool;
struct http_client_context *cctx;
- struct http_client_settings set;
+ struct http_client_settings *set;
struct http_client *prev, *next;
static bool
http_client_queue_is_last_connect_ip(struct http_client_queue *queue)
{
- const struct http_client_settings *set =
- &queue->client->set;
+ const struct http_client_settings *set = queue->client->set;
struct http_client_host *host = queue->host;
unsigned int ips_count = http_client_host_get_ips_count(host);
/* Start soft connect time-out
(but only if we have another IP left) */
if (queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX) {
- msecs = client->set.soft_connect_timeout_msecs;
+ msecs = client->set->soft_connect_timeout_msecs;
if (!http_client_queue_is_last_connect_ip(queue) &&
msecs > 0 && queue->to_connect == NULL) {
queue->to_connect = timeout_add_to(
struct http_client_peer *peer,
const char *reason)
{
- const struct http_client_settings *set =
- &queue->client->set;
+ const struct http_client_settings *set = queue->client->set;
const struct http_client_peer_addr *addr = &peer->shared->addr;
const char *https_name = http_client_peer_addr_get_https_name(addr);
struct http_client_host *host = queue->host;
EVENT_REASON_CODE);
/* Default to client-wide settings: */
- req->max_attempts = client->set.max_attempts;
- req->attempt_timeout_msecs = client->set.request_timeout_msecs;
+ req->max_attempts = client->set->max_attempts;
+ req->attempt_timeout_msecs = client->set->request_timeout_msecs;
req->state = HTTP_REQUEST_STATE_NEW;
return req;
return 0; /* no delay */
if (retry_after < ioloop_time)
return 0; /* delay already expired */
- max = (req->client->set.max_auto_retry_delay_secs == 0 ?
+ max = (req->client->set->max_auto_retry_delay_secs == 0 ?
req->attempt_timeout_msecs / 1000 :
- req->client->set.max_auto_retry_delay_secs);
+ req->client->set->max_auto_retry_delay_secs);
if ((unsigned int)(retry_after - ioloop_time) > max)
return -1; /* delay too long */
req->release_time.tv_sec = retry_after;
{
struct http_client *client = req->client;
struct http_client_host *host;
- const char *proxy_socket_path = client->set.proxy_socket_path;
- const struct http_url *proxy_url = client->set.proxy_url;
+ const char *proxy_socket_path = client->set->proxy_socket_path;
+ const struct http_url *proxy_url = client->set->proxy_url;
bool have_proxy =
((proxy_socket_path != NULL) || (proxy_url != NULL) ||
(req->host_socket != NULL) || (req->host_url != NULL));
/* Specific normal proxy */
req->host_socket = NULL;
} else if (req->origin_url.have_ssl &&
- !client->set.no_ssl_tunnel &&
+ !client->set->no_ssl_tunnel &&
!req->connect_tunnel) {
/* Tunnel to origin server */
req->host_url = &req->origin_url;
req->timeout_time = ioloop_timeval;
timeval_add_msecs(&req->timeout_time,
req->timeout_msecs);
- } else if (client->set.request_absolute_timeout_msecs > 0) {
+ } else if (client->set->request_absolute_timeout_msecs > 0) {
req->timeout_time = ioloop_timeval;
timeval_add_msecs(&req->timeout_time,
- client->set.request_absolute_timeout_msecs);
+ client->set->request_absolute_timeout_msecs);
}
}
static int
http_client_request_send_real(struct http_client_request *req, bool pipelined)
{
- const struct http_client_settings *set = &req->client->set;
+ const struct http_client_settings *set = req->client->set;
struct http_client_connection *conn = req->conn;
string_t *rtext = t_str_new(256);
struct const_iovec iov[3];
http_auth_create_credentials(rtext, &auth_creds);
str_append(rtext, "\r\n");
}
- if (!req->have_hdr_user_agent && req->client->set.user_agent != NULL) {
+ if (!req->have_hdr_user_agent && req->client->set->user_agent != NULL) {
str_printfa(rtext, "User-Agent: %s\r\n",
- req->client->set.user_agent);
+ req->client->set->user_agent);
}
if (!req->have_hdr_expect && req->payload_sync) {
str_append(rtext, "Expect: 100-continue\r\n");
return;
}
- i_assert(req->redirects <= req->client->set.max_redirects);
- if (++req->redirects > req->client->set.max_redirects) {
- if (req->client->set.max_redirects > 0) {
+ i_assert(req->redirects <= req->client->set->max_redirects);
+ if (++req->redirects > req->client->set->max_redirects) {
+ if (req->client->set->max_redirects > 0) {
http_client_request_error(
&req,
HTTP_CLIENT_REQUEST_ERROR_INVALID_REDIRECT,
t_strdup_printf(
"Redirected more than %d times",
- req->client->set.max_redirects));
+ req->client->set->max_redirects));
} else {
http_client_request_error(
&req,
void http_client_request_retry(struct http_client_request *req,
unsigned int status, const char *error)
{
- if (req->client == NULL || req->client->set.no_auto_retry ||
+ if (req->client == NULL || req->client->set->no_auto_retry ||
!http_client_request_try_retry(req))
http_client_request_error(&req, status, error);
}
event_add_category(client->event, &event_category_http_client);
event_set_append_log_prefix(client->event, log_prefix);
- client->set.dns_client_socket_path =
+ client->set = p_new(pool, struct http_client_settings, 1);
+ client->set->dns_client_socket_path =
p_strdup_empty(pool, set->dns_client_socket_path);
- client->set.dns_ttl_msecs = set->dns_ttl_msecs;
+ client->set->dns_ttl_msecs = set->dns_ttl_msecs;
if (set->user_agent != NULL && *set->user_agent != '\0')
- client->set.user_agent = p_strdup_empty(pool, set->user_agent);
+ client->set->user_agent = p_strdup_empty(pool, set->user_agent);
if (set->rawlog_dir != NULL && *set->rawlog_dir != '\0')
- client->set.rawlog_dir = p_strdup_empty(pool, set->rawlog_dir);
+ client->set->rawlog_dir = p_strdup_empty(pool, set->rawlog_dir);
if (set->proxy_socket_path != NULL && *set->proxy_socket_path != '\0') {
- client->set.proxy_socket_path = p_strdup(pool, set->proxy_socket_path);
- client->set.proxy_url = NULL;
+ client->set->proxy_socket_path = p_strdup(pool, set->proxy_socket_path);
+ client->set->proxy_url = NULL;
} else if (set->proxy_url != NULL) {
- client->set.proxy_url = http_url_clone(pool, set->proxy_url);
- client->set.proxy_socket_path = NULL;
+ client->set->proxy_url = http_url_clone(pool, set->proxy_url);
+ client->set->proxy_socket_path = NULL;
}
if (set->proxy_username != NULL && *set->proxy_username != '\0') {
- client->set.proxy_username = p_strdup_empty(pool, set->proxy_username);
- client->set.proxy_password = p_strdup(pool, set->proxy_password);
+ client->set->proxy_username = p_strdup_empty(pool, set->proxy_username);
+ client->set->proxy_password = p_strdup(pool, set->proxy_password);
} else if (set->proxy_url != NULL && set->proxy_url->user != NULL &&
*set->proxy_url->user != '\0') {
- client->set.proxy_username =
+ client->set->proxy_username =
p_strdup_empty(pool, set->proxy_url->user);
- client->set.proxy_password =
+ client->set->proxy_password =
p_strdup(pool, set->proxy_url->password);
}
if (set->max_idle_time_msecs > 0)
- client->set.max_idle_time_msecs = set->max_idle_time_msecs;
- client->set.max_pipelined_requests =
+ client->set->max_idle_time_msecs = set->max_idle_time_msecs;
+ client->set->max_pipelined_requests =
(set->max_pipelined_requests > 0 ?
set->max_pipelined_requests : 1);
- client->set.max_parallel_connections =
+ client->set->max_parallel_connections =
(set->max_parallel_connections > 0 ?
set->max_parallel_connections : 1);
if (set->max_attempts > 0)
- client->set.max_attempts = set->max_attempts;
+ client->set->max_attempts = set->max_attempts;
if (set->max_connect_attempts > 0)
- client->set.max_connect_attempts = set->max_connect_attempts;
- client->set.connect_backoff_time_msecs =
+ client->set->max_connect_attempts = set->max_connect_attempts;
+ client->set->connect_backoff_time_msecs =
set->connect_backoff_time_msecs > 0 ?
set->connect_backoff_time_msecs :
HTTP_CLIENT_DEFAULT_BACKOFF_TIME_MSECS;
- client->set.connect_backoff_max_time_msecs =
+ client->set->connect_backoff_max_time_msecs =
set->connect_backoff_max_time_msecs > 0 ?
set->connect_backoff_max_time_msecs :
HTTP_CLIENT_DEFAULT_BACKOFF_MAX_TIME_MSECS;
- client->set.no_auto_redirect =
- client->set.no_auto_redirect || set->no_auto_redirect;
- client->set.no_auto_retry =
- client->set.no_auto_retry || set->no_auto_retry;
- client->set.no_ssl_tunnel =
- client->set.no_ssl_tunnel || set->no_ssl_tunnel;
+ client->set->no_auto_redirect =
+ client->set->no_auto_redirect || set->no_auto_redirect;
+ client->set->no_auto_retry =
+ client->set->no_auto_retry || set->no_auto_retry;
+ client->set->no_ssl_tunnel =
+ client->set->no_ssl_tunnel || set->no_ssl_tunnel;
if (set->max_redirects > 0)
- client->set.max_redirects = set->max_redirects;
+ client->set->max_redirects = set->max_redirects;
if (set->request_absolute_timeout_msecs > 0) {
- client->set.request_absolute_timeout_msecs =
+ client->set->request_absolute_timeout_msecs =
set->request_absolute_timeout_msecs;
}
- client->set.request_timeout_msecs = set->request_timeout_msecs > 0 ?
+ client->set->request_timeout_msecs = set->request_timeout_msecs > 0 ?
set->request_timeout_msecs :
HTTP_CLIENT_DEFAULT_REQUEST_TIMEOUT_MSECS;
if (set->connect_timeout_msecs > 0)
- client->set.connect_timeout_msecs = set->connect_timeout_msecs;
+ client->set->connect_timeout_msecs = set->connect_timeout_msecs;
if (set->soft_connect_timeout_msecs > 0)
- client->set.soft_connect_timeout_msecs = set->soft_connect_timeout_msecs;
+ client->set->soft_connect_timeout_msecs = set->soft_connect_timeout_msecs;
if (set->socket_send_buffer_size > 0)
- client->set.socket_send_buffer_size = set->socket_send_buffer_size;
+ client->set->socket_send_buffer_size = set->socket_send_buffer_size;
if (set->socket_recv_buffer_size > 0)
- client->set.socket_recv_buffer_size = set->socket_recv_buffer_size;
+ client->set->socket_recv_buffer_size = set->socket_recv_buffer_size;
if (set->max_auto_retry_delay_secs > 0)
- client->set.max_auto_retry_delay_secs = set->max_auto_retry_delay_secs;
+ client->set->max_auto_retry_delay_secs = set->max_auto_retry_delay_secs;
i_array_init(&client->delayed_failing_requests, 1);
for (client = cctx->clients_list; client != NULL;
client = client->next) {
unsigned int dns_lookup_timeout_msecs =
- http_client_get_dns_lookup_timeout_msecs(&client->set);
+ http_client_get_dns_lookup_timeout_msecs(client->set);
if (cctx->dns_client == NULL)
cctx->dns_client = client->dns_client;
if (cctx->dns_client_socket_path == NULL) {
cctx->dns_client_socket_path =
- client->set.dns_client_socket_path;
+ client->set->dns_client_socket_path;
}
- if (client->set.dns_ttl_msecs != 0 &&
- cctx->dns_ttl_msecs > client->set.dns_ttl_msecs)
- cctx->dns_ttl_msecs = client->set.dns_ttl_msecs;
+ if (client->set->dns_ttl_msecs != 0 &&
+ cctx->dns_ttl_msecs > client->set->dns_ttl_msecs)
+ cctx->dns_ttl_msecs = client->set->dns_ttl_msecs;
if (dns_lookup_timeout_msecs != 0 &&
cctx->dns_lookup_timeout_msecs > dns_lookup_timeout_msecs) {
cctx->dns_lookup_timeout_msecs =