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