Mercurial > dovecot > core-2.2
annotate src/lib-http/http-client-queue.c @ 17879:94ba0150905b
lib-http: client queue: Start using new timeval_cmp_margin function for delay handling.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Sat, 04 Oct 2014 17:31:38 +0300 |
parents | b7678ce561c1 |
children | 4f175c27bea5 |
rev | line source |
---|---|
17130
add8c00fb3cc
Updated copyright notices to include year 2014.
Timo Sirainen <tss@iki.fi>
parents:
17037
diff
changeset
|
1 /* Copyright (c) 2013-2014 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 |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
21 /* |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
22 * 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
|
23 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
24 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
25 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
|
26 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
|
27 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
|
28 |
160e489d7c12
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 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
|
30 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
|
31 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
|
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 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
|
34 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
35 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
|
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 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
|
38 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
|
39 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
|
40 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
|
41 } |
160e489d7c12
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 |
160e489d7c12
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 * 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
|
46 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
47 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
48 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
49 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
|
50 struct timeval time); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
51 |
17002
160e489d7c12
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 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
|
53 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
|
54 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
|
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 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
|
57 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
58 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
|
59 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
|
60 |
160e489d7c12
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 if (queue->addr.type == addr->type && queue->addr.port == addr->port && |
160e489d7c12
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 null_strcmp(queue->addr.https_name, addr->https_name) == 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
|
63 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
|
64 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
65 |
160e489d7c12
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 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
|
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 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
|
70 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
|
71 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
|
72 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
73 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
|
74 |
160e489d7c12
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 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
|
76 if (queue == 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
|
77 char *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
|
78 |
160e489d7c12
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 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
|
80 case HTTP_CLIENT_PEER_ADDR_RAW: |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
81 name = i_strdup_printf("raw://%s:%u", host->name, addr->port); |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
82 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
|
83 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
|
84 case HTTP_CLIENT_PEER_ADDR_HTTPS: |
160e489d7c12
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 name = i_strdup_printf("https://%s:%u", host->name, addr->port); |
160e489d7c12
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 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
|
87 case HTTP_CLIENT_PEER_ADDR_HTTP: |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
88 name = i_strdup_printf("http://%s:%u", host->name, addr->port); |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
89 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
|
90 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
|
91 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
|
92 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
93 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
94 queue = i_new(struct http_client_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
|
95 queue->client = host->client; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
96 queue->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
|
97 queue->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
|
98 queue->https_name = i_strdup(addr->https_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
|
99 queue->addr.https_name = queue->https_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
|
100 queue->name = 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
|
101 queue->ips_connect_idx = 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
|
102 i_array_init(&queue->request_queue, 16); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
103 i_array_init(&queue->delayed_request_queue, 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
|
104 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
|
105 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
106 |
160e489d7c12
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 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
|
108 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
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 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
|
113 (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
|
114 i_free(queue->https_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
|
115 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
|
116 array_free(&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
|
117 array_free(&queue->request_queue); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
118 array_free(&queue->delayed_request_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
|
119 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
|
120 timeout_remove(&queue->to_connect); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
121 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
122 timeout_remove(&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
|
123 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
|
124 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
|
125 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
126 |
160e489d7c12
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 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
|
128 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
|
129 { |
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
|
130 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
|
131 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
|
132 |
160e489d7c12
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 /* abort all pending 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
|
134 req_arr = &queue->request_queue; |
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
|
135 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
|
136 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
|
137 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
|
138 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
|
139 } |
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
|
140 array_clear(req_arr); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
141 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
142 /* abort all delayed 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
|
143 req_arr = &queue->delayed_request_queue; |
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
|
144 array_clear(&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
|
145 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
|
146 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
|
147 http_client_request_error(*req_idx, status, error); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
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_clear(req_arr); |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
150 } |
160e489d7c12
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 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
|
153 http_client_queue_drop_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
|
154 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
|
155 { |
17851
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
156 ARRAY_TYPE(http_client_request) *req_arr; |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
157 struct http_client_request **req_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
|
158 |
17851
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
159 /* remove from main queue */ |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
160 req_arr = &queue->request_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
|
161 array_foreach_modifiable(req_arr, req_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
|
162 if (*req_idx == 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
|
163 array_delete(req_arr, array_foreach_idx(req_arr, req_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
|
164 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
|
165 } |
160e489d7c12
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 } |
17851
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
167 |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
168 /* remove from delay queue */ |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
169 if (req->release_time.tv_sec > 0) { |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
170 req_arr = &queue->delayed_request_queue; |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
171 array_foreach_modifiable(req_arr, req_idx) { |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
172 if (*req_idx == req) { |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
173 array_delete(req_arr, array_foreach_idx(req_arr, req_idx), 1); |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
174 break; |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
175 } |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
176 } |
3773fec28b4d
lib-http: client: Fixed crash occurring sometimes when delay timeout expired.
Stephan Bosch <stephan@rename-it.nl>
parents:
17774
diff
changeset
|
177 } |
17002
160e489d7c12
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 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
179 |
160e489d7c12
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 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
|
181 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
|
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 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
|
184 &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
|
185 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
|
186 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
187 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
|
188 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
|
189 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
190 /* if a maximum connect attempts > 1 is set, enforce it directly */ |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
191 if (set->max_connect_attempts > 1) { |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
192 return queue->connect_attempts >= set->max_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
|
193 } |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
194 |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
195 /* 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
|
196 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
|
197 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
|
198 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
|
199 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
|
200 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
|
201 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
202 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
203 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
|
204 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
|
205 { |
160e489d7c12
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 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
|
207 const struct http_client_peer_addr *addr = &queue->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
|
208 |
160e489d7c12
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 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
|
210 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
|
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 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
|
213 /* 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
|
214 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
|
215 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
216 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
217 /* 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
|
218 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
|
219 parallel */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
220 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
|
221 "starting parallel connection attempt to 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
|
222 http_client_peer_addr2str(addr), addr->https_name == 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
|
223 t_strdup_printf(" (SSL=%s)", addr->https_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
|
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 /* 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
|
226 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
|
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 /* 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
|
229 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
|
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 |
160e489d7c12
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 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
|
233 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
234 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
|
235 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
|
236 const struct http_client_peer_addr *addr = &queue->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
|
237 unsigned int num_requests = array_count(&queue->request_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
|
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 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
243 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
|
244 queue->addr.ip = host->ips[queue->ips_connect_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
|
245 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
246 http_client_queue_debug(queue, "Setting up connection to %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
|
247 "(%u requests pending)", http_client_peer_addr2str(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
|
248 (addr->https_name == 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
|
249 t_strdup_printf(" (SSL=%s)", addr->https_name)), num_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
|
250 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
251 /* 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
|
252 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
|
253 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
|
254 |
160e489d7c12
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 /* 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
|
256 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
|
257 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
258 if (!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
|
259 unsigned int msecs; |
17172 | 260 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
|
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 /* 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
|
263 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
|
264 i_array_init(&queue->pending_peers, 8); |
17172 | 265 else { |
266 struct http_client_peer *const *peer_idx; | |
267 | |
268 /* we may be waiting for this peer already */ | |
269 array_foreach(&queue->pending_peers, peer_idx) { | |
270 if (http_client_peer_addr_cmp(&(*peer_idx)->addr, addr) == 0) { | |
271 new_peer = FALSE; | |
272 break; | |
273 } | |
274 } | |
275 } | |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
276 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
|
277 http_client_queue_debug(queue, "Started new connection to %s%s", |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
278 http_client_peer_addr2str(addr), (addr->https_name == NULL ? "" : |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
279 t_strdup_printf(" (SSL=%s)", addr->https_name))); |
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
280 |
17172 | 281 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
|
282 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
|
283 } |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
284 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
285 /* start soft connect time-out (but only if we have another IP left) */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
286 msecs = host->client->set.soft_connect_timeout_msecs; |
160e489d7c12
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 if (!http_client_queue_is_last_connect_ip(queue) && msecs > 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
|
288 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
|
289 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
|
290 timeout_add(msecs, http_client_queue_soft_connect_timeout, 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
|
291 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
292 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
293 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
294 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
295 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
|
296 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
|
297 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
|
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 /* we achieved at least one connection the the addr->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
|
300 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
|
301 http_client_host_get_ip_idx(queue->host, &addr->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
|
302 |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
303 /* 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
|
304 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
|
305 |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
306 /* 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
|
307 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
|
308 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
|
309 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
310 /* 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
|
311 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
|
312 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
|
313 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
|
314 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
|
315 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
|
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 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
|
318 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
|
319 /* 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
|
320 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
|
321 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
|
322 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
|
323 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
|
324 } |
160e489d7c12
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 /* 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
|
326 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
|
327 */ |
160e489d7c12
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 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
|
329 } |
160e489d7c12
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 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
|
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 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
335 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
|
336 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
|
337 { |
160e489d7c12
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 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
|
339 |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
340 http_client_queue_debug(queue, "Failed to set up connection to %s%s: %s " |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
341 "(%u peers pending, %u requests pending)", |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
342 http_client_peer_addr2str(addr), |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
343 (addr->https_name == NULL ? "" : |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
344 t_strdup_printf(" (SSL=%s)", addr->https_name)), reason, |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
345 (array_is_created(&queue->pending_peers) ? |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
346 array_count(&queue->pending_peers): 0), |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
347 array_count(&queue->request_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
|
348 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
|
349 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
|
350 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
|
351 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
352 /* 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
|
353 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
|
354 (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
|
355 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
|
356 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
|
357 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
|
358 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
|
359 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
|
360 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
|
361 } |
160e489d7c12
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 } |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
363 if (array_count(&queue->pending_peers) > 0) { |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
364 http_client_queue_debug(queue, |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
365 "Waiting for remaining pending peers."); |
17002
160e489d7c12
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 return TRUE; |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
367 } |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
368 } |
160e489d7c12
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 |
160e489d7c12
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 /* 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
|
371 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
|
372 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
|
373 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
|
374 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
|
375 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
376 if (http_client_queue_is_last_connect_ip(queue)) { |
17171
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
377 http_client_queue_debug(queue, |
22424f1a32ad
lib-http: Added debug logging.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
378 "Failed to set up any connection; failing all queued requests"); |
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 /* all IPs failed, but retry all of them again on 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
|
381 next 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
|
382 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
|
383 (queue->ips_connect_idx + 1) % host->ips_count; |
17774
650629de6a73
lib-http: client: Added support for attempting a single IP several times.
Stephan Bosch <stephan@rename-it.nl>
parents:
17172
diff
changeset
|
384 queue->connect_attempts = 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
|
385 http_client_queue_fail(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
|
386 HTTP_CLIENT_REQUEST_ERROR_CONNECT_FAILED, 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
|
387 return FALSE; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
388 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
389 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
|
390 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
|
391 return TRUE; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
392 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
393 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
394 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
|
395 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
|
396 { |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
397 req->release_time.tv_sec = 0; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
398 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
|
399 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
400 if (req->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
|
401 array_insert(&queue->request_queue, 0, &req, 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
|
402 else |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
403 array_append(&queue->request_queue, &req, 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
|
404 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
405 |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
406 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
407 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
|
408 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
409 struct http_client_request *const *reqs; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
410 unsigned int count, i, finished; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
411 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
412 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
413 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
414 finished = 0; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
415 reqs = array_get(&queue->delayed_request_queue, &count); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
416 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
|
417 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
|
418 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) { |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
419 break; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
420 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
421 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
422 http_client_queue_debug(queue, |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
423 "Activated delayed request %s%s", |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
424 http_client_request_label(reqs[i]), |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
425 (reqs[i]->urgent ? " (urgent)" : "")); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
426 http_client_queue_submit_now(queue, reqs[i]); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
427 finished++; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
428 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
429 if (i < count) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
430 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
|
431 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
432 array_delete(&queue->delayed_request_queue, 0, finished); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
433 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
434 http_client_queue_connection_setup(queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
435 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
436 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
437 static void |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
438 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
|
439 struct timeval time) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
440 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
441 int usecs = timeval_diff_usecs(&time, &ioloop_timeval); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
442 int msecs; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
443 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
444 /* round up to nearest microsecond */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
445 msecs = (usecs + 999) / 1000; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
446 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
447 /* set timer */ |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
448 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
449 timeout_remove(&queue->to_delayed); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
450 queue->to_delayed = timeout_add |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
451 (msecs, http_client_queue_delay_timeout, queue); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
452 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
453 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
454 static int |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
455 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
|
456 struct http_client_request *const *req2) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
457 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
458 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
|
459 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
460 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
461 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
|
462 struct http_client_request *req) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
463 { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
464 unsigned int insert_idx; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
465 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
466 req->queue = queue; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
467 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
468 if (req->release_time.tv_sec > 0) { |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
469 io_loop_time_refresh(); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
470 |
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
|
471 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
|
472 &ioloop_timeval, TIMEOUT_CMP_MARGIN_USECS) > 0) { |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
473 (void)array_bsearch_insert_pos(&queue->delayed_request_queue, |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
474 &req, http_client_queue_delayed_cmp, &insert_idx); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
475 array_insert(&queue->delayed_request_queue, insert_idx, &req, 1); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
476 if (insert_idx == 0) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
477 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
|
478 return; |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
479 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
480 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
481 |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
482 http_client_queue_submit_now(queue, req); |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
483 } |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
484 |
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
485 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
|
486 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
|
487 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
|
488 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
489 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
|
490 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
|
491 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
|
492 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
493 requests = array_get(&queue->request_queue, &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
|
494 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
|
495 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
|
496 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
|
497 if (requests[0]->urgent && 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
|
498 for (; requests[i]->urgent; i++) { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
499 if (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
|
500 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
|
501 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
502 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
503 req = requests[i]; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
504 array_delete(&queue->request_queue, i, 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
|
505 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
506 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
|
507 "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
|
508 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
|
509 (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
|
510 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
511 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
|
512 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
513 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
514 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
|
515 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
|
516 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
|
517 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
518 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
|
519 unsigned int count, i; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
520 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
521 *num_urgent_r = 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
|
522 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
523 requests = array_get(&queue->request_queue, &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
|
524 for (i = 0; i < count; i++) { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
525 if (requests[i]->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
|
526 (*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
|
527 else |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
528 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
|
529 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
530 return 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
|
531 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
532 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
533 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
|
534 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
535 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
|
536 queue->to_connect = io_loop_move_timeout(&queue->to_connect); |
17005
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
537 if (queue->to_delayed != NULL) |
d2f2423615d7
http: Implemented delayed requests scheduling.
Stephan Bosch <stephan@rename-it.nl>
parents:
17002
diff
changeset
|
538 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
|
539 } |