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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
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
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
269 else {
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
270 struct http_client_peer *const *peer_idx;
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
271
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
272 /* we may be waiting for this peer already */
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
273 array_foreach(&queue->pending_peers, peer_idx) {
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
274 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) {
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
275 new_peer = FALSE;
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
276 break;
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
277 }
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
278 }
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
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
57638bf8ee3e lib-http: Fixed a hang
Timo Sirainen <tss@iki.fi>
parents: 17171
diff changeset
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 }