Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 404 } |
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 | 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 } |