Mercurial > dovecot > core-2.2
annotate src/lib-http/http-client-queue.c @ 17002:160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Peer and request objects now reference the queue object directly rather
than the host object. This way, there is no need to find the matching
host:port in the host anymore. This makes the queueing structure more
intuitive and more efficient. This is a first step towards support for
connecting to HTTP services through unix sockets or directing requests at
specific hosts (so not from the URL). This patch also fixes a potential
timeout leak (to_connect) in http_client_host_port (now http_client_queue)
and makes sure it is moved during switch_ioloop(). Finally it updates the
structure comment at the top of http-client.c.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Fri, 22 Nov 2013 22:07:41 +0200 |
parents | |
children | d2f2423615d7 |
rev | line source |
---|---|
17002
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
1 /* Copyright (c) 2013 Dovecot authors, see the included COPYING file */ |
160e489d7c12
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" |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
8 #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
|
9 #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
|
10 #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
|
11 #include "ostream.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 "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
|
13 #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
|
14 |
160e489d7c12
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-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
|
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 /* |
160e489d7c12
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 * 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
|
19 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
20 |
160e489d7c12
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 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
|
22 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
|
23 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
|
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, ...) |
160e489d7c12
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 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
|
30 |
160e489d7c12
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 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
|
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_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
|
34 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
|
35 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
|
36 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
|
37 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
38 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
39 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
40 /* |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
41 * 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
|
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 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
|
45 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
|
46 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
|
47 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
48 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
|
49 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
50 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
|
51 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
|
52 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
53 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
|
54 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
|
55 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
|
56 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
57 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
58 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
|
59 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
60 |
160e489d7c12
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 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
|
62 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
|
63 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
|
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 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
|
66 |
160e489d7c12
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 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
|
68 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
|
69 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
|
70 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
71 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
|
72 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
|
73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 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
|
83 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
|
84 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
85 |
160e489d7c12
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 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
|
87 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
|
88 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
|
89 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
|
90 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
|
91 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
|
92 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
|
93 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
|
94 i_array_init(&queue->request_queue, 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
|
95 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
|
96 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
99 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
102 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
103 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
|
104 (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
|
105 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
|
106 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
|
107 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
|
108 array_free(&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
|
109 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
|
110 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
|
111 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
|
112 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
|
113 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
114 |
160e489d7c12
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 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
|
116 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
|
117 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
118 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
|
119 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
120 /* abort all pending 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
|
121 array_foreach_modifiable(&queue->request_queue, 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
|
122 http_client_request_error(*req, status, 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
|
123 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
124 array_clear(&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
|
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 |
160e489d7c12
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 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
|
129 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
|
130 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
131 ARRAY_TYPE(http_client_request) *req_arr = &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
|
132 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
|
133 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
134 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
|
135 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
|
136 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
|
137 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
|
138 } |
160e489d7c12
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 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
140 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
141 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
142 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
|
143 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
|
144 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
145 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
|
146 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
147 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
|
148 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
|
149 |
160e489d7c12
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 /* we'll always go through all the IPs. we don't necessarily start |
160e489d7c12
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 connecting from the first IP, so we'll need to treat the IPs as |
160e489d7c12
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 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
|
153 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
|
154 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
|
155 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
|
156 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
159 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
|
160 { |
160e489d7c12
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 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
|
162 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
|
163 |
160e489d7c12
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 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
|
165 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
|
166 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
167 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
|
168 /* 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
|
169 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
|
170 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
171 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
172 /* 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
|
173 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
|
174 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
|
175 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
|
176 "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
|
177 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
|
178 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
|
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 /* 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
|
181 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
|
182 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
183 /* 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
|
184 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
|
185 } |
160e489d7c12
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 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
|
188 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
189 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
|
190 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
|
191 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
|
192 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
|
193 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
194 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
|
195 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
|
196 |
160e489d7c12
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 /* 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
|
198 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
|
199 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
|
200 |
160e489d7c12
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 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
|
202 "(%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
|
203 (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
|
204 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
|
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 /* 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
|
207 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
|
208 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
|
209 |
160e489d7c12
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 /* 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
|
211 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
|
212 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
213 if (!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
|
214 unsigned int 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
|
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 /* 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
|
217 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
|
218 i_array_init(&queue->pending_peers, 8); |
160e489d7c12
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 array_append(&queue->pending_peers, &peer, 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
|
220 |
160e489d7c12
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 /* 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
|
222 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
|
223 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
|
224 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
|
225 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
|
226 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
|
227 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
228 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
229 } |
160e489d7c12
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 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
|
232 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
|
233 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
|
234 { |
160e489d7c12
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 /* 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
|
236 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
|
237 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
|
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 /* 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
|
240 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
|
241 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
|
242 |
160e489d7c12
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 /* 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
|
244 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
|
245 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
|
246 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
|
247 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
|
248 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
|
249 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
250 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
|
251 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
|
252 /* 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
|
253 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
|
254 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
|
255 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
|
256 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
|
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 /* 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
|
259 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
|
260 */ |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
261 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
|
262 } |
160e489d7c12
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 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
|
264 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
265 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
266 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
267 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
|
268 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
|
269 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
|
270 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
271 struct http_client_host *host = queue->host; |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
272 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
273 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
|
274 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
|
275 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
|
276 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
277 /* 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
|
278 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
|
279 (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
|
280 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
|
281 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
|
282 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
|
283 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
|
284 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
|
285 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
|
286 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
287 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
288 if (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
|
289 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
|
290 } |
160e489d7c12
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 /* 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
|
293 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
|
294 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
|
295 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
|
296 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
|
297 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
298 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
|
299 /* 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
|
300 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
|
301 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
|
302 (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
|
303 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
|
304 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
|
305 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
|
306 } |
160e489d7c12
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 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
|
308 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
|
309 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
|
310 } |
160e489d7c12
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 |
160e489d7c12
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 void http_client_queue_submit_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
|
313 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
|
314 { |
160e489d7c12
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 req->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
|
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 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
|
318 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
|
319 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
|
320 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
|
321 } |
160e489d7c12
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 |
160e489d7c12
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 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
|
324 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
|
325 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
|
326 { |
160e489d7c12
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 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
|
328 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
|
329 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
|
330 |
160e489d7c12
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 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 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
|
337 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
|
338 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
|
339 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
340 } |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
341 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
|
342 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
|
343 |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
344 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
|
345 "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
|
346 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
|
347 (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
|
348 |
160e489d7c12
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 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
|
350 } |
160e489d7c12
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 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
|
353 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
|
354 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
|
355 { |
160e489d7c12
http-client: Changed struct http_client_host_port into a struct http_client_queue object.
Stephan Bosch <stephan@rename-it.nl>
parents:
diff
changeset
|
356 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
|
357 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
|
358 |
160e489d7c12
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 *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
|
360 |
160e489d7c12
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 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
|
362 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
|
363 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
|
364 (*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
|
365 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
|
366 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
|
367 } |
160e489d7c12
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 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
|
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 |
160e489d7c12
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 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
|
372 { |
160e489d7c12
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 queue->to_connect = io_loop_move_timeout(&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 } |