Mercurial > dovecot > core-2.2
annotate src/lib-http/http-client-queue.c @ 21466:10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
The addressed problem occurs in a very specific situation in which the original successful connection is dropped, yet a new connection fails.
It manifests as an assertion failure or panic:
Panic: file ioloop-epoll.c: line 189 (io_loop_handler_run_internal): assertion failed: (msecs >= 0)
Panic: BUG: No IOs or timeouts set. Not waiting for infinity.
The timing is very critical. However, this doesn't mean that the occurrence of this problem is very unlikely; it can happen frequently under high load.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Thu, 02 Feb 2017 01:36:50 +0100 |
parents | 2e2563132d5f |
children | 0d071dadb856 |
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 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
22 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
|
23 struct timeval time); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
24 static void |
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_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
|
26 const struct timeval *time); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
27 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
28 |
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
|
29 /* |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
30 * 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
|
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 |
160e489d7c12
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 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
|
34 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
|
35 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
|
36 |
160e489d7c12
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 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
|
38 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
|
39 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
|
40 { |
160e489d7c12
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 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
|
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 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
|
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 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
|
46 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
|
47 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
|
48 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
|
49 } |
160e489d7c12
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 } |
160e489d7c12
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 /* |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
53 * 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
|
54 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
55 |
160e489d7c12
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 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
|
57 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
|
58 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
|
59 { |
160e489d7c12
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 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
|
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 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
|
63 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
|
64 |
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
|
65 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
|
66 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
|
67 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
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 |
160e489d7c12
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 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
|
73 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
|
74 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
|
75 { |
160e489d7c12
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 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
|
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 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
85 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
|
86 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
|
87 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 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
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 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
|
101 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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 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
|
110 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 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
|
119 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
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 |
160e489d7c12
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 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
|
125 { |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
126 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
|
127 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
|
128 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
129 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
|
130 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
131 /* unlink all peers */ |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
132 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
|
133 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
|
134 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 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
|
136 } |
21045
c926a09729f0
lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents:
21044
diff
changeset
|
137 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
|
138 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
|
139 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_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
|
141 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
|
142 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
|
143 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
144 /* 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
|
145 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
|
146 (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
|
147 array_free(&queue->requests); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
148 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
|
149 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
|
150 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
|
151 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
152 /* 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
|
153 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
|
154 timeout_remove(&queue->to_connect); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
155 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
156 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
|
157 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
158 /* 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
|
159 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
|
160 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
|
161 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
|
162 } |
160e489d7c12
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 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
164 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
165 * Error handling |
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 |
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
|
168 void http_client_queue_fail(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
|
169 unsigned int status, const char *error) |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
170 { |
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
|
171 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
|
172 struct http_client_request **req_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
|
173 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
174 /* abort all pending requests */ |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
175 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
|
176 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
|
177 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
|
178 array_foreach_modifiable(&treqs, req_idx) { |
20344
2b71a1c2febc
lib-http: Changed http_client_request_error to set request to NULL
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20332
diff
changeset
|
179 http_client_request_error(req_idx, 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
|
180 } |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
181 |
17985
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
182 /* all queues should be empty now... unless new requests were submitted |
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
183 from the callback. this invariant captures it all: */ |
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
184 i_assert((array_count(&queue->delayed_requests) + |
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
185 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
|
186 array_count(&queue->queued_urgent_requests)) == |
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
187 array_count(&queue->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
|
188 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
189 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
190 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
191 * Connection management |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
192 */ |
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
|
193 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
194 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
|
195 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
|
196 { |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
197 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
|
198 &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
|
199 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
|
200 |
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
|
201 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
|
202 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
|
203 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
|
204 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
205 /* 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
|
206 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
|
207 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
|
208 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
|
209 |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
210 /* 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
|
211 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
|
212 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
|
213 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
|
214 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
|
215 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
|
216 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
217 |
160e489d7c12
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 static void |
21047
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
219 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
|
220 { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
221 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
|
222 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
|
223 unsigned int i; |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
224 |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
225 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
|
226 |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
227 if (queue->cur_peer == NULL) { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
228 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
|
229 return; |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
230 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
231 |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
232 /* 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
|
233 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
|
234 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
|
235 if (http_client_peer_addr_cmp |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
236 (&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
|
237 break; |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
238 } |
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 if (i < host->ips_count) { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
241 /* continue with current peer */ |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
242 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
|
243 } else { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
244 /* reset connect attempts */ |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
245 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
|
246 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
247 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
248 |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
249 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
|
250 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
|
251 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
252 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
|
253 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
|
254 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
|
255 |
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
|
256 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
|
257 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
258 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
|
259 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
|
260 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
261 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
|
262 /* 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
|
263 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
|
264 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
265 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
266 /* 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
|
267 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
|
268 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
|
269 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
|
270 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
|
271 "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
|
272 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
|
273 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
|
274 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
275 /* 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
|
276 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
|
277 |
160e489d7c12
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 /* 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
|
279 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
|
280 } |
160e489d7c12
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 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
282 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
|
283 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
|
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 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
|
286 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
|
287 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
|
288 unsigned int num_requests = |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
289 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
|
290 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
|
291 const char *ssl = ""; |
21047
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
292 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
|
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 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
|
295 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
|
296 |
21047
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
297 /* 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
|
298 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
|
299 /* performing asynchronous lookup */ |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
300 if (queue->to_connect != NULL) |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
301 timeout_remove(&queue->to_connect); |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
302 return NULL; |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
303 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
304 if (ret > 0) { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
305 /* new lookup performed */ |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
306 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
|
307 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
308 |
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
|
309 /* 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
|
310 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
|
311 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
|
312 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
|
313 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
|
314 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
|
315 } |
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
|
316 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
317 /* 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
|
318 peer = NULL; |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
319 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
|
320 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
|
321 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
322 /* 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
|
323 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
|
324 /* 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
|
325 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
|
326 /* yes */ |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
327 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
|
328 "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
|
329 "(%u requests pending)", |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
330 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
|
331 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
332 /* handle requests; */ |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
333 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
|
334 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
|
335 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
336 /* no */ |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
337 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
|
338 } else { |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
339 /* 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
|
340 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
|
341 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
342 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
343 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
|
344 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
345 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
346 if (peer == NULL) |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
347 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
|
348 |
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
|
349 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
|
350 "(%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
|
351 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
|
352 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
353 /* 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
|
354 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
|
355 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
356 /* 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
|
357 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
|
358 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
359 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
|
360 /* 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
|
361 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
|
362 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
|
363 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
364 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
|
365 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
|
366 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
|
367 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
368 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
|
369 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
370 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
|
371 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
372 } else { |
21045
c926a09729f0
lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents:
21044
diff
changeset
|
373 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
|
374 unsigned int msecs; |
17172 | 375 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
|
376 |
160e489d7c12
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 /* not already connected, wait for connections */ |
17172 | 378 |
21045
c926a09729f0
lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents:
21044
diff
changeset
|
379 /* 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
|
380 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
|
381 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
|
382 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
|
383 new_peer = FALSE; |
c926a09729f0
lib-http: client: Create queue->pending_peers array from the beginning.
Stephan Bosch <stephan@dovecot.fi>
parents:
21044
diff
changeset
|
384 break; |
17172 | 385 } |
386 } | |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
387 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
|
388 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
|
389 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
|
390 |
17172 | 391 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
|
392 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
|
393 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
|
394 } |
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 /* 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
|
397 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
|
398 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
|
399 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
|
400 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
|
401 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
|
402 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
|
403 } |
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
|
404 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
405 } |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
406 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
407 return peer; |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
408 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
409 |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
410 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
|
411 { |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
412 (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
|
413 } |
160e489d7c12
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 |
21047
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
415 unsigned int |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
416 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
|
417 { |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
418 unsigned int reqs_pending = |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
419 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
|
420 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
|
421 if (reqs_pending > 0) |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
422 http_client_queue_connection_setup(queue); |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
423 return reqs_pending; |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
424 } |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
425 |
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
|
426 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
|
427 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
|
428 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
|
429 { |
21047
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
430 if (queue->host->dns_lookup == NULL && |
3a481a8f2ff2
lib-http: client: Implemented host name lookup TTL.
Stephan Bosch <stephan@dovecot.fi>
parents:
21046
diff
changeset
|
431 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
|
432 /* we achieved at least one connection the the addr->ip */ |
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
|
433 queue->ips_connect_start_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
|
434 http_client_host_get_ip_idx(queue->host, &addr->a.tcp.ip); |
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
|
435 } |
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
|
436 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
437 /* 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
|
438 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
|
439 |
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
|
440 /* 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
|
441 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
|
442 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
|
443 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
444 /* 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
|
445 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
|
446 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
|
447 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
|
448 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
|
449 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
450 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
|
451 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
|
452 /* 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
|
453 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
|
454 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
|
455 requests. */ |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
456 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
|
457 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
|
458 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
|
459 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
460 /* 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
|
461 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
|
462 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
463 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
|
464 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
465 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
|
466 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
|
467 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
468 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
469 |
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
|
470 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
|
471 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
|
472 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
|
473 { |
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
|
474 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
|
475 &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
|
476 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
|
477 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
|
478 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
|
479 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
|
480 |
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
|
481 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
|
482 "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
|
483 "(%u peers pending, %u requests pending)", |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
484 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
|
485 (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
|
486 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
|
487 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
|
488 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
|
489 |
21466
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
490 if (queue->cur_peer != NULL) { |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
491 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
|
492 /* 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
|
493 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
|
494 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
|
495 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
|
496 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
|
497 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
|
498 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
|
499 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
|
500 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
|
501 } |
21466
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
502 |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
503 failed_peer = queue->cur_peer; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
504 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
|
505 queue->cur_peer = NULL; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
506 |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
507 } else { |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
508 /* 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
|
509 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
|
510 (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
|
511 first. */ |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
512 failed_peer = NULL; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
513 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
|
514 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
|
515 failed_peer = *peer_idx; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
516 array_delete(&queue->pending_peers, |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
517 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
|
518 break; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
519 } |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
520 } |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
521 i_assert(failed_peer != NULL); |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
522 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
|
523 http_client_queue_debug(queue, |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
524 "Waiting for remaining pending peers."); |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
525 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
|
526 return; |
10103d3a4ad4
lib-http: client: Fixed peer reconnection failure handling.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
527 } |
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
|
528 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
529 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
530 /* 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
|
531 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
|
532 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
|
533 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
|
534 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
|
535 |
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
|
536 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
|
537 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
|
538 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
|
539 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
|
540 } |
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
|
541 |
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
|
542 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
|
543 /* 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
|
544 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
|
545 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
|
546 (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
|
547 |
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
|
548 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
|
549 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
|
550 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
|
551 "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
|
552 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
|
553 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
|
554 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
|
555 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
|
556 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
|
557 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
|
558 } |
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
|
559 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
|
560 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
|
561 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
|
562 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
|
563 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
|
564 } |
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
|
565 } 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
|
566 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
|
567 } |
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
|
568 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
569 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
|
570 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
|
571 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
|
572 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
573 |
21035
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
574 void |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
575 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
|
576 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
|
577 { |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
578 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
|
579 |
21044
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
580 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
|
581 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
|
582 return; |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
583 } |
66c79e8a1132
lib-http: client: Link peers to queue earlier: during connection attempts.
Stephan Bosch <stephan@dovecot.fi>
parents:
21035
diff
changeset
|
584 |
21035
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
585 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
|
586 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
|
587 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
|
588 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
|
589 break; |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
590 } |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
591 } |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
592 } |
1590d1ff0551
lib-http: client: Unlink all queues from peer when it is disconnected.
Stephan Bosch <stephan@dovecot.fi>
parents:
20344
diff
changeset
|
593 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
594 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
595 * Main request queue |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
596 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
597 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
598 void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
599 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
|
600 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
|
601 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
602 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
|
603 unsigned int count, i; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
604 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
605 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
|
606 "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
|
607 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
608 /* drop from queue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
609 if (req->urgent) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
610 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
|
611 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
|
612 if (reqs[i] == req) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
613 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
|
614 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
615 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
616 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
617 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
618 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
|
619 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
|
620 if (reqs[i] == req) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
621 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
|
622 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
623 } |
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 } |
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 /* drop from delay queue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
628 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
|
629 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
|
630 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
|
631 if (reqs[i] == req) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
632 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
633 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
634 if (i < count) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
635 if (i == 0) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
636 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
|
637 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
|
638 if (count > 1) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
639 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
|
640 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
|
641 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
642 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
643 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
644 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
|
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 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
648 /* 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
|
649 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
|
650 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
|
651 if (reqs[i] == req) |
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 i_assert(i < count); |
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 if (i == 0) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
657 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
|
658 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
|
659 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
|
660 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
|
661 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
662 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
663 req->queue = NULL; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
664 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
|
665 |
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
|
666 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
|
667 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
|
668 return; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
669 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
670 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
671 static void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
672 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
|
673 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
674 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
|
675 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
|
676 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
|
677 unsigned int count, i; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
678 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
679 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
|
680 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
|
681 ((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
|
682 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
683 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
|
684 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
|
685 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
686 /* collect failed requests */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
687 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
|
688 i_assert(count > 0); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
689 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
|
690 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
|
691 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
|
692 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
|
693 &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
|
694 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
695 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
696 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
|
697 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
698 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
699 /* update timout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
700 if (i < count) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
701 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
|
702 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
703 /* abort all failed request */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
704 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
|
705 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
|
706 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
|
707 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
|
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, |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
710 "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
|
711 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
|
712 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
|
713 "Timed out"); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
714 } |
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 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
|
717 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
|
718 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
|
719 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
720 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
721 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
722 static void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
723 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
|
724 const struct timeval *time) |
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 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
|
727 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
|
728 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
|
729 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
730 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
|
731 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
|
732 "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
|
733 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
|
734 ((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
|
735 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
|
736 ((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
|
737 } |
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 /* set timer */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
740 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
|
741 (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
|
742 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
743 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
744 static int |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
745 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
|
746 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
|
747 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
748 int ret; |
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 /* 0 means no timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
751 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
|
752 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
|
753 /* sort by age */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
754 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
|
755 return ret; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
756 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
757 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
758 return 1; |
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 } 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
|
761 return -1; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
762 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
763 /* sort by timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
764 } else if |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
765 ((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
|
766 return ret; |
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 /* 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
|
770 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
|
771 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
772 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
773 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
|
774 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
|
775 { |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
776 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
|
777 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
778 req->release_time.tv_sec = 0; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
779 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
|
780 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
781 if (req->urgent) |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
782 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
|
783 else |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
784 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
|
785 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
786 /* enqueue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
787 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
|
788 /* 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
|
789 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
|
790 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
791 } 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
|
792 /* 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
|
793 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
794 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
795 unsigned int insert_idx; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
796 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
797 /* 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
|
798 (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
|
799 &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
|
800 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
|
801 } |
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
|
802 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
803 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
804 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
805 * Delayed request queue |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
806 */ |
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 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
809 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
|
810 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
811 struct http_client_request *const *reqs; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
812 unsigned int count, i, finished; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
813 |
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
|
814 timeout_remove(&queue->to_delayed); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
815 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
816 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
817 finished = 0; |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
818 reqs = array_get(&queue->delayed_requests, &count); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
819 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
|
820 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
|
821 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) { |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
822 break; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
823 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
824 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
825 http_client_queue_debug(queue, |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
826 "Activated delayed request %s%s", |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
827 http_client_request_label(reqs[i]), |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
828 (reqs[i]->urgent ? " (urgent)" : "")); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
829 http_client_queue_submit_now(queue, reqs[i]); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
830 finished++; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
831 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
832 if (i < count) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
833 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
|
834 } |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
835 array_delete(&queue->delayed_requests, 0, finished); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
836 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
837 http_client_queue_connection_setup(queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
838 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
839 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
840 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
841 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
|
842 struct timeval time) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
843 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
844 int usecs = timeval_diff_usecs(&time, &ioloop_timeval); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
845 int msecs; |
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 /* round up to nearest microsecond */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
848 msecs = (usecs + 999) / 1000; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
849 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
850 /* set timer */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
851 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
852 timeout_remove(&queue->to_delayed); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
853 queue->to_delayed = timeout_add |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
854 (msecs, http_client_queue_delay_timeout, queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
855 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
856 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
857 static int |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
858 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
|
859 struct http_client_request *const *req2) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
860 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
861 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
|
862 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
863 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
864 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
865 * Request submission |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
866 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
867 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
868 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
|
869 struct http_client_request *req) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
870 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
871 unsigned int insert_idx; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
872 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
873 if (req->queue != NULL) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
874 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
|
875 req->queue = queue; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
876 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
877 /* check delay vs timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
878 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
|
879 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
|
880 &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
|
881 /* 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
|
882 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
|
883 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
|
884 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
885 /* timeout rightaway */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
886 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
|
887 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
888 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
|
889 "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
|
890 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
|
891 (req->urgent ? " (urgent)" : "")); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
892 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
893 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
894 /* 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
|
895 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
|
896 /* no timeout; just append */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
897 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
|
898 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
899 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
900 unsigned int insert_idx; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
901 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
902 /* 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
|
903 (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
|
904 &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
|
905 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
|
906 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
907 /* 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
|
908 if (insert_idx == 0) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
909 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
|
910 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
911 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
912 /* handle delay */ |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
913 if (req->release_time.tv_sec > 0) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
914 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
915 |
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
|
916 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
|
917 &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
|
918 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
|
919 "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
|
920 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
|
921 (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
|
922 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
|
923 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
924 (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
|
925 &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
|
926 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
|
927 if (insert_idx == 0) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
928 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
|
929 return; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
930 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
931 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
932 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
933 http_client_queue_submit_now(queue, req); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
934 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
935 |
17881
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 * Request retrieval |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
938 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
939 |
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
|
940 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
|
941 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
|
942 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
|
943 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
944 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
|
945 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
|
946 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
|
947 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
948 count = 0; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
949 if (!no_urgent) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
950 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
|
951 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
952 if (count == 0) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
953 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
|
954 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
|
955 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
|
956 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
|
957 req = requests[i]; |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
958 if (req->urgent) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
959 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
|
960 else |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
961 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
|
962 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
963 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
|
964 "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
|
965 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
|
966 (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
|
967 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
968 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
|
969 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
972 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
|
973 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
|
974 { |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
975 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
|
976 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
977 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
|
978 *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
|
979 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
|
980 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
981 |
21046
5b3dc5fef64c
lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents:
21045
diff
changeset
|
982 unsigned int |
5b3dc5fef64c
lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents:
21045
diff
changeset
|
983 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
|
984 { |
5b3dc5fef64c
lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents:
21045
diff
changeset
|
985 return array_count(&queue->requests); |
5b3dc5fef64c
lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents:
21045
diff
changeset
|
986 } |
5b3dc5fef64c
lib-http: client: Added http_client_queue_requests_active().
Stephan Bosch <stephan@dovecot.fi>
parents:
21045
diff
changeset
|
987 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
988 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
989 * ioloop |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
990 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
991 |
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 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
|
993 { |
160e489d7c12
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 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
|
995 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
|
996 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
|
997 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
|
998 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
999 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
|
1000 } |