Mercurial > dovecot > core-2.2
annotate src/lib-http/http-client-queue.c @ 19552:0f22db71df7a
global: freshen copyright
git ls-files | xargs perl -p -i -e 's/(\d+)-201[0-5]/$1-2016/g;s/ (201[0-5]) Dovecot/ $1-2016 Dovecot/'
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Wed, 13 Jan 2016 12:24:03 +0200 |
parents | 8f8f768937f5 |
children | b983a3ab3fcf |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19039
diff
changeset
|
1 /* Copyright (c) 2013-2016 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; |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 } |
160e489d7c12
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 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
|
121 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
122 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
123 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
|
124 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
125 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
|
126 (queue, HTTP_CLIENT_REQUEST_ERROR_ABORTED, "Aborted"); |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
127 if (array_is_created(&queue->pending_peers)) |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
128 array_free(&queue->pending_peers); |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
129 array_free(&queue->requests); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
130 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
|
131 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
|
132 array_free(&queue->delayed_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
|
133 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
|
134 timeout_remove(&queue->to_connect); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
135 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
136 timeout_remove(&queue->to_delayed); |
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
|
137 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
|
138 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
|
139 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
|
140 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
141 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
142 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
143 * Error handling |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
144 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
145 |
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
|
146 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
|
147 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
|
148 { |
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
|
149 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
|
150 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
|
151 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
152 /* 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
|
153 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
|
154 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
|
155 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
|
156 array_foreach_modifiable(&treqs, req_idx) { |
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
|
157 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
|
158 } |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
159 |
17985
e479bce0633b
lib-http: client: Assertion in http_client_queue_fail() was wrong.
Stephan Bosch <stephan@rename-it.nl>
parents:
17969
diff
changeset
|
160 /* 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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
167 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
168 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
169 * Connection management |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
170 */ |
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
|
171 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
172 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
|
173 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
|
174 { |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
175 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
|
176 &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
|
177 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
|
178 |
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
|
179 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
|
180 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
|
181 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
|
182 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
183 /* 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
|
184 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
|
185 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
|
186 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
|
187 |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
188 /* 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
|
189 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
|
190 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
|
191 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
|
192 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
|
193 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
|
194 } |
160e489d7c12
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 |
160e489d7c12
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 static 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
|
197 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
|
198 { |
160e489d7c12
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 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
|
201 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
|
202 |
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
|
203 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
|
204 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
205 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
|
206 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
|
207 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
208 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
|
209 /* 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
|
210 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
|
211 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
212 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
213 /* 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
|
214 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
|
215 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
|
216 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
|
217 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
|
218 "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
|
219 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
|
220 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
|
221 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
222 /* 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
|
223 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
|
224 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
225 /* 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
|
226 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
|
227 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
228 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
229 void http_client_queue_connection_setup(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
|
230 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
231 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
|
232 struct http_client_peer *peer = 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
|
233 const 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
|
234 unsigned int num_requests = |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
235 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
|
236 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
|
237 const char *ssl = ""; |
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
|
238 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
239 if (num_requests == 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
|
240 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
|
241 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
242 /* 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
|
243 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 } |
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
|
249 |
160e489d7c12
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_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
|
251 "(%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
|
252 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
|
253 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
254 |
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
|
255 /* create/get 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
|
256 peer = http_client_peer_get(queue->client, 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
|
257 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
|
258 |
160e489d7c12
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 /* 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
|
260 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
|
261 |
160e489d7c12
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 if (!http_client_peer_is_connected(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
|
263 unsigned int msecs; |
17172 | 264 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
|
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 /* not already connected, wait for 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
|
267 if (!array_is_created(&queue->pending_peers)) |
160e489d7c12
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 i_array_init(&queue->pending_peers, 8); |
17172 | 269 else { |
270 struct http_client_peer *const *peer_idx; | |
271 | |
272 /* we may be waiting for this peer already */ | |
273 array_foreach(&queue->pending_peers, peer_idx) { | |
274 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) { | |
275 new_peer = FALSE; | |
276 break; | |
277 } | |
278 } | |
279 } | |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
280 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
|
281 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
|
282 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
|
283 |
17172 | 284 array_append(&queue->pending_peers, &peer, 1); |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
285 queue->connect_attempts++; |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
286 } |
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
|
287 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
288 /* 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
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 } |
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 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
297 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
298 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
299 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
300 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
|
301 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
|
302 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
|
303 { |
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
|
304 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
|
305 /* 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
|
306 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
|
307 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
|
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 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
310 /* 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
|
311 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
|
312 |
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
|
313 /* 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
|
314 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
|
315 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
|
316 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
317 /* 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
|
318 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
|
319 may be empty. */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
320 if (array_is_created(&queue->pending_peers) && |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
321 array_count(&queue->pending_peers) > 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
|
322 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
|
323 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
324 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
|
325 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
|
326 /* 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
|
327 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
|
328 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
|
329 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
|
330 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
|
331 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
332 /* 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
|
333 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
|
334 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
335 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
|
336 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
337 array_clear(&queue->pending_peers); |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
338 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
339 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
340 |
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
|
341 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
|
342 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
|
343 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
|
344 { |
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
|
345 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
|
346 &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
|
347 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
|
348 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
|
349 |
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 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
|
351 "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
|
352 "(%u peers pending, %u requests pending)", |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
353 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
|
354 (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
|
355 t_strdup_printf(" (SSL=%s)", 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
|
356 reason, (array_is_created(&queue->pending_peers) ? |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
357 array_count(&queue->pending_peers): 0), |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
358 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
|
359 |
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
|
360 if (array_is_created(&queue->pending_peers) && |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
361 array_count(&queue->pending_peers) > 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
|
362 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
|
363 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
364 /* we're still doing the initial connections to this hport. if |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
365 we're also doing parallel connections with 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
|
366 (pending_peer_count>1), wait for them to finish |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
367 first. */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
368 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
|
369 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
|
370 array_delete(&queue->pending_peers, |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
371 array_foreach_idx(&queue->pending_peers, peer_idx), 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
|
372 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
|
373 } |
160e489d7c12
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 } |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
375 if (array_count(&queue->pending_peers) > 0) { |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
376 http_client_queue_debug(queue, |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
377 "Waiting for remaining pending peers."); |
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
|
378 return; |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
379 } |
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
|
380 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
381 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
382 /* 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
|
383 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
|
384 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
|
385 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
|
386 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
|
387 |
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
|
388 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
|
389 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
|
390 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
|
391 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
|
392 } |
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
|
393 |
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
|
394 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
|
395 /* 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
|
396 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
|
397 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
|
398 (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
|
399 |
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
|
400 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
|
401 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
|
402 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
|
403 "Failed to set up any connection; failing all queued requests"); |
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
|
404 queue->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
|
405 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
|
406 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
|
407 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
|
408 } |
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
|
409 } 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
|
410 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
|
411 } |
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
|
412 |
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 http_client_queue_connection_setup(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
|
414 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
|
415 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
416 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
417 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
418 * Main request queue |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
419 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
420 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
421 void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
422 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
|
423 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
|
424 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
425 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
|
426 unsigned int count, i; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
427 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
428 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
|
429 "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
|
430 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
431 /* drop from queue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
432 if (req->urgent) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
433 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
|
434 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
|
435 if (reqs[i] == req) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
436 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
|
437 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
438 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
439 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
440 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
441 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
|
442 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
|
443 if (reqs[i] == req) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
444 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
|
445 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
446 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
447 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
448 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
449 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
450 /* drop from delay queue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
451 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
|
452 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
|
453 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
|
454 if (reqs[i] == req) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
455 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
456 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
457 if (i < count) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
458 if (i == 0) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
459 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
|
460 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
|
461 if (count > 1) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
462 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
|
463 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
|
464 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
465 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
466 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
467 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
|
468 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
469 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
470 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
471 /* 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
|
472 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
|
473 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
|
474 if (reqs[i] == req) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
475 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
476 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
477 i_assert(i < count); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
478 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
479 if (i == 0) { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 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
|
484 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
485 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
486 req->queue = NULL; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
487 array_delete(&queue->requests, i, 1); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
488 return; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
489 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
490 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
491 static void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
492 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
|
493 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
494 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
|
495 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
|
496 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
|
497 unsigned int count, i; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
498 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
499 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
|
500 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
|
501 ((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
|
502 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
503 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
|
504 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
|
505 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
506 /* collect failed requests */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
507 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
|
508 i_assert(count > 0); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
509 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
|
510 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
|
511 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
|
512 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
|
513 &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
|
514 break; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
515 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
516 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
|
517 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
518 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
519 /* update timout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
520 if (i < count) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
521 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
|
522 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
523 /* abort all failed request */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
524 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
|
525 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
|
526 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
|
527 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
|
528 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
529 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
|
530 "Request %s timed out", 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
|
531 http_client_request_error(req, |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
532 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
|
533 "Timed out"); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
534 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
535 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
536 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
|
537 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
|
538 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
|
539 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
540 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
541 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
542 static void |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
543 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
|
544 const struct timeval *time) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
545 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
546 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
|
547 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
|
548 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
|
549 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
550 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
|
551 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
|
552 "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
|
553 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
|
554 ((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
|
555 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
|
556 ((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
|
557 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
558 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
559 /* set timer */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
560 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
|
561 (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
|
562 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
563 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
564 static int |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
565 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
|
566 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
|
567 { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
568 int ret; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
569 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
570 /* 0 means no timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
571 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
|
572 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
|
573 /* sort by age */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
574 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
|
575 return ret; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
576 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
577 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
578 return 1; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
579 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
580 } 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
|
581 return -1; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
582 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
583 /* sort by timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
584 } else if |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
585 ((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
|
586 return ret; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
587 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
588 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
589 /* 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
|
590 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
|
591 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
592 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
593 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
|
594 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
|
595 { |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
596 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
|
597 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
598 req->release_time.tv_sec = 0; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
599 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
|
600 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
601 if (req->urgent) |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
602 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
|
603 else |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
604 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
|
605 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
606 /* enqueue */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
607 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
|
608 /* 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
|
609 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
|
610 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
611 } 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
|
612 /* 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
|
613 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
614 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
615 unsigned int insert_idx; |
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 /* 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
|
618 (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
|
619 &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
|
620 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
|
621 } |
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
|
622 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
623 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
624 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
625 * Delayed request queue |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
626 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
627 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
628 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
629 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
|
630 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
631 struct http_client_request *const *reqs; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
632 unsigned int count, i, finished; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
633 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
634 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
635 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
636 finished = 0; |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
637 reqs = array_get(&queue->delayed_requests, &count); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
638 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
|
639 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
|
640 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) { |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
641 break; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
642 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
643 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
644 http_client_queue_debug(queue, |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
645 "Activated delayed request %s%s", |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
646 http_client_request_label(reqs[i]), |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
647 (reqs[i]->urgent ? " (urgent)" : "")); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
648 http_client_queue_submit_now(queue, reqs[i]); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
649 finished++; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
650 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
651 if (i < count) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
652 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
|
653 } |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
654 array_delete(&queue->delayed_requests, 0, finished); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
655 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
656 http_client_queue_connection_setup(queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
657 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
658 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
659 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
660 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
|
661 struct timeval time) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
662 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
663 int usecs = timeval_diff_usecs(&time, &ioloop_timeval); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
664 int msecs; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
665 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
666 /* round up to nearest microsecond */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
667 msecs = (usecs + 999) / 1000; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
668 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
669 /* set timer */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
670 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
671 timeout_remove(&queue->to_delayed); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
672 queue->to_delayed = timeout_add |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
673 (msecs, http_client_queue_delay_timeout, queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
674 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
675 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
676 static int |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
677 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
|
678 struct http_client_request *const *req2) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
679 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
680 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
|
681 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
682 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
683 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
684 * Request submission |
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 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
687 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
|
688 struct http_client_request *req) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
689 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
690 unsigned int insert_idx; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
691 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
692 if (req->queue != NULL) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
693 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
|
694 req->queue = queue; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
695 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
696 /* check delay vs timeout */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
697 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
|
698 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
|
699 &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
|
700 /* 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
|
701 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
|
702 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
|
703 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
704 /* timeout rightaway */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
705 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
|
706 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
707 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
|
708 "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
|
709 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
|
710 (req->urgent ? " (urgent)" : "")); |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
711 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
712 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
713 /* 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
|
714 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
|
715 /* no timeout; just append */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
716 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
|
717 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
718 } else { |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
719 unsigned int insert_idx; |
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 /* 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
|
722 (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
|
723 &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
|
724 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
|
725 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
726 /* 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
|
727 if (insert_idx == 0) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
728 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
|
729 } |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
730 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
731 /* handle delay */ |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
732 if (req->release_time.tv_sec > 0) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
733 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
734 |
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
|
735 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
|
736 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) { |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
737 (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
|
738 &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
|
739 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
|
740 if (insert_idx == 0) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
741 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
|
742 return; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
743 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
744 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
745 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
746 http_client_queue_submit_now(queue, req); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
747 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
748 |
17881
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 * Request retrieval |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
751 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
752 |
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
|
753 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
|
754 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
|
755 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
|
756 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
757 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
|
758 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
|
759 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
|
760 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
761 count = 0; |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
762 if (!no_urgent) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
763 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
|
764 |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
765 if (count == 0) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
766 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
|
767 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
|
768 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
|
769 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
|
770 req = requests[i]; |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
771 if (req->urgent) |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
772 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
|
773 else |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
774 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
|
775 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
776 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
|
777 "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
|
778 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
|
779 (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
|
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 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
|
782 } |
160e489d7c12
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 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
784 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
|
785 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
|
786 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
|
787 { |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
788 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
|
789 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
790 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
|
791 *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
|
792 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
|
793 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
794 |
17881
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
795 /* |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
796 * ioloop |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
797 */ |
4f175c27bea5
lib-http: client: Added support for absolute request timeout.
Stephan Bosch <stephan@rename-it.nl>
parents:
17879
diff
changeset
|
798 |
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
|
799 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
|
800 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
801 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
|
802 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
|
803 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
|
804 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
|
805 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
806 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
|
807 } |