annotate src/lib-http/http-client-queue.c @ 22656:1789bf2a1e01

director: Make sure HOST-RESET-USERS isn't used with max_moving_users=0 The reset command would just hang in that case. doveadm would never have sent this, so this is just an extra sanity check.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Sun, 05 Nov 2017 23:51:56 +0200
parents 1b4a0735b158
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21263
diff changeset
1 /* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
2
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
3 #include "lib.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
4 #include "net.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
5 #include "str.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
6 #include "hash.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
7 #include "array.h"
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
8 #include "bsearch-insert-pos.h"
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
9 #include "llist.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
10 #include "ioloop.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
11 #include "istream.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
12 #include "ostream.h"
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
13 #include "time-util.h"
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
14 #include "dns-lookup.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
15 #include "http-response-parser.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
16
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
17 #include "http-client-private.h"
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
18
17879
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
19 #define TIMEOUT_CMP_MARGIN_USECS 2000
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
20
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
21 static void
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
22 http_client_queue_fail(struct http_client_queue *queue,
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
23 unsigned int status, const char *error);
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
24 static void
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
25 http_client_queue_set_delay_timer(struct http_client_queue *queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
26 struct timeval time);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
27 static void
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
28 http_client_queue_set_request_timer(struct http_client_queue *queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
29 const struct timeval *time);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
30
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
31 /*
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
32 * Logging
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
33 */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
34
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
35 static inline void
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
36 http_client_queue_debug(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
37 const char *format, ...) ATTR_FORMAT(2, 3);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
38
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
39 static inline void
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
40 http_client_queue_debug(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
41 const char *format, ...)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
42 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
43 va_list args;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
44
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
45 if (queue->client->set.debug) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
46
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
47 va_start(args, format);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
48 i_debug("http-client: queue %s: %s",
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
49 queue->name, t_strdup_vprintf(format, args));
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
50 va_end(args);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
51 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
52 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
53
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
54 /*
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
55 * Queue object
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
56 */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
57
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
58 static struct http_client_queue *
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
59 http_client_queue_find(struct http_client_host *host,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
60 const struct http_client_peer_addr *addr)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
61 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
62 struct http_client_queue *const *queue_idx;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
63
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
64 array_foreach_modifiable(&host->queues, queue_idx) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
65 struct http_client_queue *queue = *queue_idx;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
66
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
67 if (http_client_peer_addr_cmp(&queue->addr, addr) == 0)
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
68 return queue;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
69 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
70
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
71 return NULL;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
72 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
73
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
74 struct http_client_queue *
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
75 http_client_queue_create(struct http_client_host *host,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
76 const struct http_client_peer_addr *addr)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
77 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
78 struct http_client_queue *queue;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
79
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
80 queue = http_client_queue_find(host, addr);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
81 if (queue == NULL) {
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
82 queue = i_new(struct http_client_queue, 1);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
83 queue->client = host->client;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
84 queue->host = host;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
85 queue->addr = *addr;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
86
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
87 switch (addr->type) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
88 case HTTP_CLIENT_PEER_ADDR_RAW:
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
89 queue->name =
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
90 i_strdup_printf("raw://%s:%u", host->name, addr->a.tcp.port);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
91 queue->addr.a.tcp.https_name = NULL;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
92 break;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
93 case HTTP_CLIENT_PEER_ADDR_HTTPS_TUNNEL:
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
94 case HTTP_CLIENT_PEER_ADDR_HTTPS:
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
95 queue->name =
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
96 i_strdup_printf("https://%s:%u", host->name, addr->a.tcp.port);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
97 queue->addr_name = i_strdup(addr->a.tcp.https_name);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
98 queue->addr.a.tcp.https_name = queue->addr_name;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
99 break;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
100 case HTTP_CLIENT_PEER_ADDR_HTTP:
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
101 queue->name =
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
102 i_strdup_printf("http://%s:%u", host->name, addr->a.tcp.port);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
103 queue->addr.a.tcp.https_name = NULL;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
104 break;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
105 case HTTP_CLIENT_PEER_ADDR_UNIX:
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
106 queue->name = i_strdup_printf("unix:%s", addr->a.un.path);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
107 queue->addr_name = i_strdup(addr->a.un.path);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
108 queue->addr.a.un.path = queue->addr_name;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
109 break;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
110 default:
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
111 i_unreached();
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
112 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
113
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
114 queue->ips_connect_idx = 0;
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
115 i_array_init(&queue->pending_peers, 8);
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
116 i_array_init(&queue->requests, 16);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
117 i_array_init(&queue->queued_requests, 16);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
118 i_array_init(&queue->queued_urgent_requests, 16);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
119 i_array_init(&queue->delayed_requests, 4);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
120 array_append(&host->queues, &queue, 1);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
121 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
122
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
123 return queue;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
124 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
125
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
126 void http_client_queue_free(struct http_client_queue *queue)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
127 {
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
128 struct http_client_peer *const *peer_idx;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
129 ARRAY_TYPE(http_client_peer) peers;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
130
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
131 http_client_queue_debug(queue, "Destroy");
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
132
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
133 /* unlink all peers */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
134 if (queue->cur_peer != NULL) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
135 struct http_client_peer *peer = queue->cur_peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
136 queue->cur_peer = NULL;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
137 http_client_peer_unlink_queue(peer, queue);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
138 }
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
139 t_array_init(&peers, array_count(&queue->pending_peers));
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
140 array_copy(&peers.arr, 0, &queue->pending_peers.arr, 0,
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
141 array_count(&queue->pending_peers));
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
142 array_foreach(&peers, peer_idx)
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
143 http_client_peer_unlink_queue(*peer_idx, queue);
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
144 array_free(&queue->pending_peers);
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
145
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
146 /* abort all requests */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
147 http_client_queue_fail
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
148 (queue, HTTP_CLIENT_REQUEST_ERROR_ABORTED, "Aborted");
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
149 array_free(&queue->requests);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
150 array_free(&queue->queued_requests);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
151 array_free(&queue->queued_urgent_requests);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
152 array_free(&queue->delayed_requests);
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
153
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
154 /* cancel timeouts */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
155 if (queue->to_connect != NULL)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
156 timeout_remove(&queue->to_connect);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
157 if (queue->to_delayed != NULL)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
158 timeout_remove(&queue->to_delayed);
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
159
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
160 /* free */
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
161 i_free(queue->addr_name);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
162 i_free(queue->name);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
163 i_free(queue);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
164 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
165
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
166 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
167 * Error handling
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
168 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
169
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
170 static void
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
171 http_client_queue_fail_full(struct http_client_queue *queue,
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
172 unsigned int status, const char *error, bool queued_only)
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
173 {
17852
b7678ce561c1 lib-http: client: The http_client_queue_fail() function aborted requests in an unsafe manner.
Stephan Bosch <stephan@rename-it.nl>
parents: 17851
diff changeset
174 ARRAY_TYPE(http_client_request) *req_arr, treqs;
b7678ce561c1 lib-http: client: The http_client_queue_fail() function aborted requests in an unsafe manner.
Stephan Bosch <stephan@rename-it.nl>
parents: 17851
diff changeset
175 struct http_client_request **req_idx;
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
176 unsigned int retained = 0;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
177
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
178 /* abort requests */
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
179 req_arr = &queue->requests;
17852
b7678ce561c1 lib-http: client: The http_client_queue_fail() function aborted requests in an unsafe manner.
Stephan Bosch <stephan@rename-it.nl>
parents: 17851
diff changeset
180 t_array_init(&treqs, array_count(req_arr));
b7678ce561c1 lib-http: client: The http_client_queue_fail() function aborted requests in an unsafe manner.
Stephan Bosch <stephan@rename-it.nl>
parents: 17851
diff changeset
181 array_copy(&treqs.arr, 0, &req_arr->arr, 0, array_count(req_arr));
b7678ce561c1 lib-http: client: The http_client_queue_fail() function aborted requests in an unsafe manner.
Stephan Bosch <stephan@rename-it.nl>
parents: 17851
diff changeset
182 array_foreach_modifiable(&treqs, req_idx) {
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
183 struct http_client_request *req = *req_idx;
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
184
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
185 i_assert(req->state >= HTTP_REQUEST_STATE_QUEUED);
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
186 if (queued_only &&
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
187 req->state != HTTP_REQUEST_STATE_QUEUED)
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
188 retained++;
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
189 else
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
190 http_client_request_error(&req, status, error);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
191 }
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
192
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
193 /* all queues should be empty now... unless new requests were submitted
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
194 from the callback. this invariant captures it all: */
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
195 i_assert((retained +
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
196 array_count(&queue->delayed_requests) +
17985
e479bce0633b lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents: 17969
diff changeset
197 array_count(&queue->queued_requests) +
e479bce0633b lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents: 17969
diff changeset
198 array_count(&queue->queued_urgent_requests)) ==
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
199 array_count(&queue->requests));
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
200 }
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
201
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
202 static void
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
203 http_client_queue_fail(struct http_client_queue *queue,
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
204 unsigned int status, const char *error)
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
205 {
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
206 http_client_queue_fail_full(queue, status, error, FALSE);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
207 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
208
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
209 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
210 * Connection management
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
211 */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
212
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
213 static bool
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
214 http_client_queue_is_last_connect_ip(struct http_client_queue *queue)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
215 {
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
216 const struct http_client_settings *set =
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
217 &queue->client->set;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
218 struct http_client_host *host = queue->host;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
219
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
220 i_assert(queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
221 i_assert(queue->ips_connect_idx < host->ips_count);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
222 i_assert(queue->ips_connect_start_idx < host->ips_count);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
223
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
224 /* if a maximum connect attempts > 1 is set, enforce it directly */
17942
b254b7dc717f lib-http: client: With the recent addition of a connection attempt limit, connection failures weren't always handled correctly.
Stephan Bosch <stephan@rename-it.nl>
parents: 17881
diff changeset
225 if (set->max_connect_attempts > 1 &&
b254b7dc717f lib-http: client: With the recent addition of a connection attempt limit, connection failures weren't always handled correctly.
Stephan Bosch <stephan@rename-it.nl>
parents: 17881
diff changeset
226 queue->connect_attempts >= set->max_connect_attempts)
b254b7dc717f lib-http: client: With the recent addition of a connection attempt limit, connection failures weren't always handled correctly.
Stephan Bosch <stephan@rename-it.nl>
parents: 17881
diff changeset
227 return TRUE;
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
228
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
229 /* otherwise, we'll always go through all the IPs. we don't necessarily
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
230 start connecting from the first IP, so we'll need to treat the IPs as
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
231 a ring buffer where we automatically wrap back to the first IP
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
232 when necessary. */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
233 return (queue->ips_connect_idx + 1) % host->ips_count ==
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
234 queue->ips_connect_start_idx;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
235 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
236
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
237 static void
21047
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
238 http_client_queue_recover_from_lookup(struct http_client_queue *queue)
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
239 {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
240 struct http_client_host *host = queue->host;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
241 struct http_client_peer_addr new_addr = queue->addr;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
242 unsigned int i;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
243
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
244 i_assert(queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
245
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
246 if (queue->cur_peer == NULL) {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
247 queue->ips_connect_idx = queue->ips_connect_start_idx = 0;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
248 return;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
249 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
250
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
251 /* try to find current peer amongst new IPs */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
252 for (i = 0; i < host->ips_count; i++) {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
253 new_addr.a.tcp.ip = host->ips[i];
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
254 if (http_client_peer_addr_cmp
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
255 (&new_addr, &queue->cur_peer->addr) == 0)
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
256 break;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
257 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
258
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
259 if (i < host->ips_count) {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
260 /* continue with current peer */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
261 queue->ips_connect_idx = queue->ips_connect_start_idx = i;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
262 } else {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
263 /* reset connect attempts */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
264 queue->ips_connect_idx = queue->ips_connect_start_idx = 0;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
265 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
266 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
267
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
268 static void
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
269 http_client_queue_soft_connect_timeout(struct http_client_queue *queue)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
270 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
271 struct http_client_host *host = queue->host;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
272 const struct http_client_peer_addr *addr = &queue->addr;
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
273 const char *https_name;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
274
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
275 i_assert(queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
276
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
277 if (queue->to_connect != NULL)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
278 timeout_remove(&queue->to_connect);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
279
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
280 if (http_client_queue_is_last_connect_ip(queue)) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
281 /* no more IPs to try */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
282 return;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
283 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
284
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
285 /* if our our previous connection attempt takes longer than the
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
286 soft_connect_timeout, we start a connection attempt to the next IP in
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
287 parallel */
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
288 https_name = http_client_peer_addr_get_https_name(addr);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
289 http_client_queue_debug(queue, "Connection to %s%s is taking a long time; "
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
290 "starting parallel connection attempt to next IP",
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
291 http_client_peer_addr2str(addr), (https_name == NULL ? "" :
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
292 t_strdup_printf(" (SSL=%s)", https_name)));
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
293
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
294 /* next IP */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
295 queue->ips_connect_idx = (queue->ips_connect_idx + 1) % host->ips_count;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
296
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
297 /* setup connection to new peer (can start new soft timeout) */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
298 http_client_queue_connection_setup(queue);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
299 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
300
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
301 static struct http_client_peer *
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
302 http_client_queue_connection_attempt(struct http_client_queue *queue)
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
303 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
304 struct http_client_host *host = queue->host;
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
305 struct http_client_peer *peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
306 struct http_client_peer_addr *addr = &queue->addr;
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
307 unsigned int num_requests =
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
308 array_count(&queue->queued_requests) +
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
309 array_count(&queue->queued_urgent_requests);
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
310 const char *ssl = "";
21047
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
311 int ret;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
312
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
313 if (num_requests == 0)
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
314 return NULL;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
315
21047
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
316 /* check whether host IPs are still up-to-date */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
317 if ((ret=http_client_host_refresh(host)) < 0) {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
318 /* performing asynchronous lookup */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
319 if (queue->to_connect != NULL)
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
320 timeout_remove(&queue->to_connect);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
321 return NULL;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
322 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
323 if (ret > 0) {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
324 /* new lookup performed */
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
325 http_client_queue_recover_from_lookup(queue);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
326 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
327
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
328 /* update our peer address */
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
329 if (queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX) {
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
330 i_assert(queue->ips_connect_idx < host->ips_count);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
331 queue->addr.a.tcp.ip = host->ips[queue->ips_connect_idx];
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
332 ssl = http_client_peer_addr_get_https_name(addr);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
333 ssl = (ssl == NULL ? "" : t_strdup_printf(" (SSL=%s)", ssl));
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
334 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
335
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
336 /* already got a peer? */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
337 peer = NULL;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
338 if (queue->cur_peer != NULL) {
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
339 i_assert(array_count(&queue->pending_peers) == 0);
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
340
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
341 /* is it still the one we want? */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
342 if (http_client_peer_addr_cmp(addr, &queue->cur_peer->addr) == 0) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
343 /* is it still connected? */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
344 if (http_client_peer_is_connected(queue->cur_peer)) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
345 /* yes */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
346 http_client_queue_debug(queue,
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
347 "Using existing connection to %s%s "
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
348 "(%u requests pending)",
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
349 http_client_peer_addr2str(addr), ssl, num_requests);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
350
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
351 /* handle requests; */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
352 http_client_peer_trigger_request_handler(queue->cur_peer);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
353 return queue->cur_peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
354 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
355 /* no */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
356 peer = queue->cur_peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
357 } else {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
358 /* peer is not relevant to this queue anymore */
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
359 http_client_peer_unlink_queue(queue->cur_peer, queue);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
360 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
361
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
362 queue->cur_peer = NULL;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
363 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
364
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
365 if (peer == NULL)
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
366 peer = http_client_peer_get(queue->client, addr);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
367
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
368 http_client_queue_debug(queue, "Setting up connection to %s%s "
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
369 "(%u requests pending)", http_client_peer_addr2str(addr), ssl,
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
370 num_requests);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
371
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
372 /* create provisional link between queue and peer */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
373 http_client_peer_link_queue(peer, queue);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
374
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
375 /* handle requests; creates new connections when needed/possible */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
376 http_client_peer_trigger_request_handler(peer);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
377
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
378 if (http_client_peer_is_connected(peer)) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
379 /* drop any pending peers */
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
380 if (array_count(&queue->pending_peers) > 0) {
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
381 struct http_client_peer *const *peer_idx;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
382
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
383 array_foreach(&queue->pending_peers, peer_idx) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
384 i_assert(http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) != 0);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
385 http_client_peer_unlink_queue(*peer_idx, queue);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
386 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
387 array_clear(&queue->pending_peers);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
388 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
389 queue->cur_peer = peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
390
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
391 } else {
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
392 struct http_client_peer *const *peer_idx;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
393 unsigned int msecs;
17172
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
394 bool new_peer = TRUE;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
395
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
396 /* not already connected, wait for connections */
17172
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
397
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
398 /* we may be waiting for this peer already */
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
399 array_foreach(&queue->pending_peers, peer_idx) {
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
400 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) {
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
401 i_assert(*peer_idx == peer);
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
402 new_peer = FALSE;
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
403 break;
17172
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
404 }
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
405 }
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
406 if (new_peer) {
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
407 http_client_queue_debug(queue, "Started new connection to %s%s",
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
408 http_client_peer_addr2str(addr), ssl);
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
409
17172
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
410 array_append(&queue->pending_peers, &peer, 1);
20152
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
411 if (queue->connect_attempts++ == 0)
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
412 queue->first_connect_time = ioloop_timeval;
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
413 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
414
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
415 /* start soft connect time-out (but only if we have another IP left) */
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
416 if (queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX) {
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
417 msecs = host->client->set.soft_connect_timeout_msecs;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
418 if (!http_client_queue_is_last_connect_ip(queue) && msecs > 0 &&
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
419 queue->to_connect == NULL) {
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
420 queue->to_connect =
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
421 timeout_add(msecs, http_client_queue_soft_connect_timeout, queue);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
422 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
423 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
424 }
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
425
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
426 return peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
427 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
428
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
429 void http_client_queue_connection_setup(struct http_client_queue *queue)
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
430 {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
431 (void)http_client_queue_connection_attempt(queue);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
432 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
433
21047
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
434 unsigned int
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
435 http_client_queue_host_lookup_done(struct http_client_queue *queue)
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
436 {
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
437 unsigned int reqs_pending =
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
438 http_client_queue_requests_pending(queue, NULL);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
439 http_client_queue_recover_from_lookup(queue);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
440 if (reqs_pending > 0)
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
441 http_client_queue_connection_setup(queue);
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
442 return reqs_pending;
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
443 }
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
444
22214
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
445 void http_client_queue_host_lookup_failure(
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
446 struct http_client_queue *queue, const char *error)
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
447 {
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
448 http_client_queue_fail_full(queue,
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
449 HTTP_CLIENT_REQUEST_ERROR_HOST_LOOKUP_FAILED,
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
450 error, TRUE);
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
451 }
1b4a0735b158 lib-http: client: Only drop queued requests when a DNS lookup fails; not also the ones that are already in progress.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21697
diff changeset
452
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
453 void
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
454 http_client_queue_connection_success(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
455 const struct http_client_peer_addr *addr)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
456 {
21047
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
457 if (queue->host->dns_lookup == NULL &&
3a481a8f2ff2 lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents: 21046
diff changeset
458 queue->addr.type != HTTP_CLIENT_PEER_ADDR_UNIX) {
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
459 /* we achieved at least one connection the the addr->ip */
21697
0d071dadb856 lib-http: client: Fixed i_unreached() failure occurring when a host's list of IPs changes while a connection is still pending.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21466
diff changeset
460 if (!http_client_host_get_ip_idx(queue->host,
0d071dadb856 lib-http: client: Fixed i_unreached() failure occurring when a host's list of IPs changes while a connection is still pending.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21466
diff changeset
461 &addr->a.tcp.ip, &queue->ips_connect_start_idx)) {
0d071dadb856 lib-http: client: Fixed i_unreached() failure occurring when a host's list of IPs changes while a connection is still pending.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21466
diff changeset
462 /* list of IPs changed during connect */
0d071dadb856 lib-http: client: Fixed i_unreached() failure occurring when a host's list of IPs changes while a connection is still pending.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21466
diff changeset
463 queue->ips_connect_start_idx = 0;
0d071dadb856 lib-http: client: Fixed i_unreached() failure occurring when a host's list of IPs changes while a connection is still pending.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21466
diff changeset
464 }
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
465 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
466
17774
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
467 /* reset attempt counter */
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
468 queue->connect_attempts = 0;
650629de6a73 lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents: 17172
diff changeset
469
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
470 /* stop soft connect time-out */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
471 if (queue->to_connect != NULL)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
472 timeout_remove(&queue->to_connect);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
473
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
474 /* drop all other attempts to the hport. note that we get here whenever
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
475 a connection is successfully created, so pending_peers array
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
476 may be empty. */
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
477 if (array_count(&queue->pending_peers) > 0) {
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
478 struct http_client_peer *const *peer_idx;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
479
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
480 array_foreach(&queue->pending_peers, peer_idx) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
481 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
482 /* don't drop any connections to the successfully
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
483 connected peer, even if some of the connections
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
484 are pending. they may be intended for urgent
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
485 requests. */
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
486 i_assert(queue->cur_peer == NULL);
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
487 queue->cur_peer = *peer_idx;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
488 continue;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
489 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
490 /* unlink this queue from the peer; if this was the last/only queue, the
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
491 peer will be freed, closing all connections.
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
492 */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
493 http_client_peer_unlink_queue(*peer_idx, queue);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
494 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
495 array_clear(&queue->pending_peers);
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
496 i_assert(queue->cur_peer != NULL);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
497 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
498 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
499
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
500 void
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
501 http_client_queue_connection_failure(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
502 const struct http_client_peer_addr *addr, const char *reason)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
503 {
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
504 const struct http_client_settings *set =
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
505 &queue->client->set;
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
506 const char *https_name = http_client_peer_addr_get_https_name(addr);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
507 struct http_client_host *host = queue->host;
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
508 struct http_client_peer *failed_peer;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
509 struct http_client_peer *const *peer_idx;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
510
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
511 http_client_queue_debug(queue,
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
512 "Failed to set up connection to %s%s: %s "
17171
22424f1a32ad lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
513 "(%u peers pending, %u requests pending)",
22424f1a32ad lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
514 http_client_peer_addr2str(addr),
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
515 (https_name == NULL ? "" :
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
516 t_strdup_printf(" (SSL=%s)", https_name)),
21045
c926a09729f0 lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents: 21044
diff changeset
517 reason, array_count(&queue->pending_peers),
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
518 array_count(&queue->requests));
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
519
21466
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
520 if (queue->cur_peer != NULL) {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
521 if (http_client_peer_is_connected(queue->cur_peer)) {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
522 /* The peer still has some working connections, which means that
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
523 pending requests wait until they're picked up by those connections
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
524 or the remaining connections fail as well. In the latter case,
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
525 connecting to different peer can resolve the situation, but only
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
526 if there is more than one IP. In any other case, the requests will
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
527 eventually fail. In the future we could start connections to the next
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
528 IP at this point already, but that is no small change. */
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
529 i_assert(array_count(&queue->pending_peers) == 0);
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
530 return;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
531 }
21466
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
532
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
533 failed_peer = queue->cur_peer;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
534 http_client_peer_unlink_queue(queue->cur_peer, queue);
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
535 queue->cur_peer = NULL;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
536
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
537 } else {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
538 /* we're still doing the initial connections to this hport. if
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
539 we're also doing parallel connections with soft timeouts
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
540 (pending_peer_count>1), wait for them to finish
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
541 first. */
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
542 failed_peer = NULL;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
543 array_foreach(&queue->pending_peers, peer_idx) {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
544 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
545 failed_peer = *peer_idx;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
546 array_delete(&queue->pending_peers,
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
547 array_foreach_idx(&queue->pending_peers, peer_idx), 1);
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
548 break;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
549 }
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
550 }
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
551 i_assert(failed_peer != NULL);
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
552 if (array_count(&queue->pending_peers) > 0) {
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
553 http_client_queue_debug(queue,
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
554 "Waiting for remaining pending peers.");
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
555 http_client_peer_unlink_queue(failed_peer, queue);
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
556 return;
10103d3a4ad4 lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21390
diff changeset
557 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
558 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
559
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
560 /* one of the connections failed. if we're not using soft timeouts,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
561 we need to try to connect to the next IP. if we are using soft
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
562 timeouts, we've already tried all of the IPs by now. */
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
563 if (queue->to_connect != NULL)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
564 timeout_remove(&queue->to_connect);
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
565
19039
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
566 if (queue->addr.type == HTTP_CLIENT_PEER_ADDR_UNIX) {
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
567 http_client_queue_fail(queue,
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
568 HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED, reason);
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
569 return;
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
570 }
8f8f768937f5 http-client: Added support for using an HTTP proxy running on a unix socket.
Stephan Bosch <stephan@rename-it.nl>
parents: 18137
diff changeset
571
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
572 if (http_client_queue_is_last_connect_ip(queue)) {
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
573 /* all IPs failed, but retry all of them again if we have more
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
574 connect attempts left or on the next request. */
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
575 queue->ips_connect_idx = queue->ips_connect_start_idx =
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
576 (queue->ips_connect_idx + 1) % host->ips_count;
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
577
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
578 if (set->max_connect_attempts == 0 ||
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
579 queue->connect_attempts >= set->max_connect_attempts) {
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
580 http_client_queue_debug(queue,
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
581 "Failed to set up any connection; failing all queued requests");
20152
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
582 if (queue->connect_attempts > 1) {
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
583 unsigned int total_msecs =
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
584 timeval_diff_msecs(&ioloop_timeval, &queue->first_connect_time);
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
585 reason = t_strdup_printf("%s (%u attempts in %u.%03u secs)",
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
586 reason, queue->connect_attempts,
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
587 total_msecs/1000, total_msecs%1000);
b983a3ab3fcf lib-http: If connect fails, include attempt count and total time in error.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
588 }
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
589 queue->connect_attempts = 0;
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
590 http_client_peer_unlink_queue(failed_peer, queue);
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
591 http_client_queue_fail(queue,
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
592 HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED, reason);
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
593 return;
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
594 }
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
595 } else {
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
596 queue->ips_connect_idx = (queue->ips_connect_idx + 1) % host->ips_count;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
597 }
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
598
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
599 if (http_client_queue_connection_attempt(queue) != failed_peer)
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
600 http_client_peer_unlink_queue(failed_peer, queue);
17969
c9ea647cba87 lib-http: client: Fixed behavior for max_connect_attempts with fewer IPs than attempts.
Stephan Bosch <stephan@rename-it.nl>
parents: 17942
diff changeset
601 return;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
602 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
603
21035
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
604 void
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
605 http_client_queue_peer_disconnected(struct http_client_queue *queue,
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
606 struct http_client_peer *peer)
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
607 {
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
608 struct http_client_peer *const *peer_idx;
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
609
21044
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
610 if (queue->cur_peer == peer) {
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
611 queue->cur_peer = NULL;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
612 return;
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
613 }
66c79e8a1132 lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents: 21035
diff changeset
614
21035
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
615 array_foreach(&queue->pending_peers, peer_idx) {
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
616 if (*peer_idx == peer) {
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
617 array_delete(&queue->pending_peers,
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
618 array_foreach_idx(&queue->pending_peers, peer_idx), 1);
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
619 break;
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
620 }
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
621 }
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
622 }
1590d1ff0551 lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents: 20344
diff changeset
623
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
624 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
625 * Main request queue
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
626 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
627
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
628 void
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
629 http_client_queue_drop_request(struct http_client_queue *queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
630 struct http_client_request *req)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
631 {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
632 struct http_client_request **reqs;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
633 unsigned int count, i;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
634
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
635 http_client_queue_debug(queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
636 "Dropping request %s", http_client_request_label(req));
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
637
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
638 /* drop from queue */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
639 if (req->urgent) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
640 reqs = array_get_modifiable(&queue->queued_urgent_requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
641 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
642 if (reqs[i] == req) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
643 array_delete(&queue->queued_urgent_requests, i, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
644 break;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
645 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
646 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
647 } else {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
648 reqs = array_get_modifiable(&queue->queued_requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
649 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
650 if (reqs[i] == req) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
651 array_delete(&queue->queued_requests, i, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
652 break;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
653 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
654 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
655 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
656
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
657 /* drop from delay queue */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
658 if (req->release_time.tv_sec > 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
659 reqs = array_get_modifiable(&queue->delayed_requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
660 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
661 if (reqs[i] == req)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
662 break;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
663 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
664 if (i < count) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
665 if (i == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
666 if (queue->to_delayed != NULL) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
667 timeout_remove(&queue->to_delayed);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
668 if (count > 1) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
669 i_assert(reqs[1]->release_time.tv_sec > 0);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
670 http_client_queue_set_request_timer(queue, &reqs[1]->release_time);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
671 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
672 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
673 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
674 array_delete(&queue->delayed_requests, i, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
675 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
676 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
677
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
678 /* drop from main request list */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
679 reqs = array_get_modifiable(&queue->requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
680 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
681 if (reqs[i] == req)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
682 break;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
683 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
684 i_assert(i < count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
685
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
686 if (i == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
687 if (queue->to_request != NULL) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
688 timeout_remove(&queue->to_request);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
689 if (count > 1 && reqs[1]->timeout_time.tv_sec > 0)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
690 http_client_queue_set_request_timer(queue, &reqs[1]->timeout_time);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
691 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
692 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
693 req->queue = NULL;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
694 array_delete(&queue->requests, i, 1);
21048
4180c1dd0aa2 lib-http: client: Destroy host and associated queue objects after no more requests remain and an idle timeout expires.
Stephan Bosch <stephan@dovecot.fi>
parents: 21047
diff changeset
695
4180c1dd0aa2 lib-http: client: Destroy host and associated queue objects after no more requests remain and an idle timeout expires.
Stephan Bosch <stephan@dovecot.fi>
parents: 21047
diff changeset
696 if (array_count(&queue->requests) == 0)
4180c1dd0aa2 lib-http: client: Destroy host and associated queue objects after no more requests remain and an idle timeout expires.
Stephan Bosch <stephan@dovecot.fi>
parents: 21047
diff changeset
697 http_client_host_check_idle(queue->host);
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
698 return;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
699 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
700
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
701 static void
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
702 http_client_queue_request_timeout(struct http_client_queue *queue)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
703 {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
704 struct http_client_request *const *reqs;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
705 ARRAY_TYPE(http_client_request) failed_requests;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
706 struct timeval new_to = { 0, 0 };
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
707 unsigned int count, i;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
708
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
709 http_client_queue_debug(queue, "Timeout (now: %s.%03lu)",
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
710 t_strflocaltime("%Y-%m-%d %H:%M:%S", ioloop_timeval.tv_sec),
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
711 ((unsigned long)ioloop_timeval.tv_usec)/1000);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
712
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
713 if (queue->to_request != NULL)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
714 timeout_remove(&queue->to_request);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
715
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
716 /* collect failed requests */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
717 reqs = array_get(&queue->requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
718 i_assert(count > 0);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
719 t_array_init(&failed_requests, count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
720 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
721 if (reqs[i]->timeout_time.tv_sec > 0 &&
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
722 timeval_cmp_margin(&reqs[i]->timeout_time,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
723 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
724 break;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
725 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
726 array_append(&failed_requests, &reqs[i], 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
727 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
728
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
729 /* update timout */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
730 if (i < count)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
731 new_to = reqs[i]->timeout_time;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
732
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
733 /* abort all failed request */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
734 reqs = array_get(&failed_requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
735 i_assert(count > 0); /* at least one request timed out */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
736 for (i = 0; i < count; i++) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
737 struct http_client_request *req = reqs[i];
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
738
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
739 http_client_queue_debug(queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
740 "Request %s timed out", http_client_request_label(req));
20344
2b71a1c2febc lib-http: Changed http_client_request_error to set request to NULL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20332
diff changeset
741 http_client_request_error(&req,
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
742 HTTP_CLIENT_REQUEST_ERROR_TIMED_OUT,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
743 "Timed out");
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
744 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
745
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
746 if (new_to.tv_sec > 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
747 http_client_queue_debug(queue, "New timeout");
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
748 http_client_queue_set_request_timer(queue, &new_to);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
749 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
750 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
751
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
752 static void
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
753 http_client_queue_set_request_timer(struct http_client_queue *queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
754 const struct timeval *time)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
755 {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
756 i_assert(time->tv_sec > 0);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
757 if (queue->to_request != NULL)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
758 timeout_remove(&queue->to_request);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
759
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
760 if (queue->client->set.debug) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
761 http_client_queue_debug(queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
762 "Set request timeout to %s.%03lu (now: %s.%03lu)",
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
763 t_strflocaltime("%Y-%m-%d %H:%M:%S", time->tv_sec),
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
764 ((unsigned long)time->tv_usec)/1000,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
765 t_strflocaltime("%Y-%m-%d %H:%M:%S", ioloop_timeval.tv_sec),
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
766 ((unsigned long)ioloop_timeval.tv_usec)/1000);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
767 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
768
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
769 /* set timer */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
770 queue->to_request = timeout_add_absolute
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
771 (time, http_client_queue_request_timeout, queue);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
772 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
773
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
774 static int
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
775 http_client_queue_request_timeout_cmp(struct http_client_request *const *req1,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
776 struct http_client_request *const *req2)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
777 {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
778 int ret;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
779
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
780 /* 0 means no timeout */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
781 if ((*req1)->timeout_time.tv_sec == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
782 if ((*req2)->timeout_time.tv_sec == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
783 /* sort by age */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
784 if ((ret=timeval_cmp(&(*req1)->submit_time, &(*req2)->submit_time)) != 0)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
785 return ret;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
786
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
787 } else {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
788 return 1;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
789 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
790 } else if ((*req2)->timeout_time.tv_sec == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
791 return -1;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
792
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
793 /* sort by timeout */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
794 } else if
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
795 ((ret=timeval_cmp(&(*req1)->timeout_time, &(*req2)->timeout_time)) != 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
796 return ret;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
797 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
798
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
799 /* sort by minumum attempts for fairness */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
800 return ((*req2)->attempts - (*req1)->attempts);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
801 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
802
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
803 static void http_client_queue_submit_now(struct http_client_queue *queue,
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
804 struct http_client_request *req)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
805 {
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
806 ARRAY_TYPE(http_client_request) *req_queue;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
807
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
808 req->release_time.tv_sec = 0;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
809 req->release_time.tv_usec = 0;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
810
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
811 if (req->urgent)
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
812 req_queue = &queue->queued_urgent_requests;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
813 else
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
814 req_queue = &queue->queued_requests;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
815
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
816 /* enqueue */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
817 if (req->timeout_time.tv_sec == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
818 /* no timeout; enqueue at end */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
819 array_append(req_queue, &req, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
820
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
821 } else if (timeval_diff_msecs(&req->timeout_time, &ioloop_timeval) <= 1) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
822 /* pretty much already timed out; don't bother */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
823
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
824 } else {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
825 unsigned int insert_idx;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
826
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
827 /* keep transmission queue sorted earliest timeout first */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
828 (void)array_bsearch_insert_pos(req_queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
829 &req, http_client_queue_request_timeout_cmp, &insert_idx);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
830 array_insert(req_queue, insert_idx, &req, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
831 }
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
832 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
833
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
834 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
835 * Delayed request queue
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
836 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
837
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
838 static void
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
839 http_client_queue_delay_timeout(struct http_client_queue *queue)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
840 {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
841 struct http_client_request *const *reqs;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
842 unsigned int count, i, finished;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
843
20166
b65cd55896a7 lib-http: Queue's delayed timeout handler wasn't removed after work was done.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20152
diff changeset
844 timeout_remove(&queue->to_delayed);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
845 io_loop_time_refresh();
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
846
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
847 finished = 0;
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
848 reqs = array_get(&queue->delayed_requests, &count);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
849 for (i = 0; i < count; i++) {
17879
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
850 if (timeval_cmp_margin(&reqs[i]->release_time,
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
851 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) {
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
852 break;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
853 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
854
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
855 http_client_queue_debug(queue,
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
856 "Activated delayed request %s%s",
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
857 http_client_request_label(reqs[i]),
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
858 (reqs[i]->urgent ? " (urgent)" : ""));
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
859 http_client_queue_submit_now(queue, reqs[i]);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
860 finished++;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
861 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
862 if (i < count) {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
863 http_client_queue_set_delay_timer(queue, reqs[i]->release_time);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
864 }
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
865 array_delete(&queue->delayed_requests, 0, finished);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
866
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
867 http_client_queue_connection_setup(queue);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
868 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
869
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
870 static void
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
871 http_client_queue_set_delay_timer(struct http_client_queue *queue,
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
872 struct timeval time)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
873 {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
874 int usecs = timeval_diff_usecs(&time, &ioloop_timeval);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
875 int msecs;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
876
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
877 /* round up to nearest microsecond */
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
878 msecs = (usecs + 999) / 1000;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
879
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
880 /* set timer */
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
881 if (queue->to_delayed != NULL)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
882 timeout_remove(&queue->to_delayed);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
883 queue->to_delayed = timeout_add
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
884 (msecs, http_client_queue_delay_timeout, queue);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
885 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
886
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
887 static int
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
888 http_client_queue_delayed_cmp(struct http_client_request *const *req1,
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
889 struct http_client_request *const *req2)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
890 {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
891 return timeval_cmp(&(*req1)->release_time, &(*req2)->release_time);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
892 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
893
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
894 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
895 * Request submission
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
896 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
897
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
898 void http_client_queue_submit_request(struct http_client_queue *queue,
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
899 struct http_client_request *req)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
900 {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
901 unsigned int insert_idx;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
902
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
903 if (req->queue != NULL)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
904 http_client_queue_drop_request(req->queue, req);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
905 req->queue = queue;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
906
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
907 /* check delay vs timeout */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
908 if (req->release_time.tv_sec > 0 && req->timeout_time.tv_sec > 0 &&
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
909 timeval_cmp_margin(&req->release_time,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
910 &req->timeout_time, TIMEOUT_CMP_MARGIN_USECS) >= 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
911 /* release time is later than absolute timeout */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
912 req->release_time.tv_sec = 0;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
913 req->release_time.tv_usec = 0;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
914
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
915 /* timeout rightaway */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
916 req->timeout_time = ioloop_timeval;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
917
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
918 http_client_queue_debug(queue,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
919 "Delayed request %s%s already timed out",
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
920 http_client_request_label(req),
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
921 (req->urgent ? " (urgent)" : ""));
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
922 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
923
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
924 /* add to main request list */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
925 if (req->timeout_time.tv_sec == 0) {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
926 /* no timeout; just append */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
927 array_append(&queue->requests, &req, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
928
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
929 } else {
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
930 unsigned int insert_idx;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
931
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
932 /* keep main request list sorted earliest timeout first */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
933 (void)array_bsearch_insert_pos(&queue->requests,
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
934 &req, http_client_queue_request_timeout_cmp, &insert_idx);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
935 array_insert(&queue->requests, insert_idx, &req, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
936
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
937 /* now first in queue; update timer */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
938 if (insert_idx == 0)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
939 http_client_queue_set_request_timer(queue, &req->timeout_time);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
940 }
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
941
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
942 /* handle delay */
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
943 if (req->release_time.tv_sec > 0) {
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
944 io_loop_time_refresh();
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
945
17879
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
946 if (timeval_cmp_margin(&req->release_time,
94ba0150905b lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17852
diff changeset
947 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) {
20332
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
948 http_client_queue_debug(queue,
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
949 "Delayed request %s%s submitted (time remaining: %d msecs)",
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
950 http_client_request_label(req),
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
951 (req->urgent ? " (urgent)" : ""),
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
952 timeval_diff_msecs(&req->release_time, &ioloop_timeval));
498fec031039 lib-http: client: Added more debug logging about the submission of delayed requests.
Stephan Bosch <stephan@dovecot.fi>
parents: 20166
diff changeset
953
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
954 (void)array_bsearch_insert_pos(&queue->delayed_requests,
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
955 &req, http_client_queue_delayed_cmp, &insert_idx);
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
956 array_insert(&queue->delayed_requests, insert_idx, &req, 1);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
957 if (insert_idx == 0)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
958 http_client_queue_set_delay_timer(queue, req->release_time);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
959 return;
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
960 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
961 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
962
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
963 http_client_queue_submit_now(queue, req);
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
964 }
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
965
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
966 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
967 * Request retrieval
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
968 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
969
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
970 struct http_client_request *
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
971 http_client_queue_claim_request(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
972 const struct http_client_peer_addr *addr, bool no_urgent)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
973 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
974 struct http_client_request *const *requests;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
975 struct http_client_request *req;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
976 unsigned int i, count;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
977
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
978 count = 0;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
979 if (!no_urgent)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
980 requests = array_get(&queue->queued_urgent_requests, &count);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
981
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
982 if (count == 0)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
983 requests = array_get(&queue->queued_requests, &count);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
984 if (count == 0)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
985 return NULL;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
986 i = 0;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
987 req = requests[i];
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
988 if (req->urgent)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
989 array_delete(&queue->queued_urgent_requests, i, 1);
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
990 else
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
991 array_delete(&queue->queued_requests, i, 1);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
992
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
993 http_client_queue_debug(queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
994 "Connection to peer %s claimed request %s %s",
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
995 http_client_peer_addr2str(addr), http_client_request_label(req),
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
996 (req->urgent ? "(urgent)" : ""));
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
997
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
998 return req;
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
999 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1000
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1001 unsigned int
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1002 http_client_queue_requests_pending(struct http_client_queue *queue,
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1003 unsigned int *num_urgent_r)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1004 {
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1005 unsigned int urg_count = array_count(&queue->queued_urgent_requests);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1006
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1007 if (num_urgent_r != NULL)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1008 *num_urgent_r = urg_count;
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1009 return array_count(&queue->queued_requests) + urg_count;
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1010 }
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1011
21046
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1012 unsigned int
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1013 http_client_queue_requests_active(struct http_client_queue *queue)
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1014 {
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1015 return array_count(&queue->requests);
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1016 }
5b3dc5fef64c lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents: 21045
diff changeset
1017
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1018 /*
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1019 * ioloop
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1020 */
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1021
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1022 void http_client_queue_switch_ioloop(struct http_client_queue *queue)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1023 {
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1024 if (queue->to_connect != NULL)
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1025 queue->to_connect = io_loop_move_timeout(&queue->to_connect);
17881
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1026 if (queue->to_request != NULL)
4f175c27bea5 lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents: 17879
diff changeset
1027 queue->to_request = io_loop_move_timeout(&queue->to_request);
17005
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
1028 if (queue->to_delayed != NULL)
d2f2423615d7 http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents: 17002
diff changeset
1029 queue->to_delayed = io_loop_move_timeout(&queue->to_delayed);
17002
160e489d7c12 http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff changeset
1030 }