7a2c1c3507835f63856bb54b358b6be69016c5b7
[platform/upstream/curl.git] / lib / multi.c
1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
9  *
10  * This software is licensed as described in the file COPYING, which
11  * you should have received as part of this distribution. The terms
12  * are also available at https://curl.haxx.se/docs/copyright.html.
13  *
14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15  * copies of the Software, and permit persons to whom the Software is
16  * furnished to do so, under the terms of the COPYING file.
17  *
18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19  * KIND, either express or implied.
20  *
21  ***************************************************************************/
22
23 #include "curl_setup.h"
24
25 #include <curl/curl.h>
26
27 #include "urldata.h"
28 #include "transfer.h"
29 #include "url.h"
30 #include "connect.h"
31 #include "progress.h"
32 #include "easyif.h"
33 #include "share.h"
34 #include "psl.h"
35 #include "multiif.h"
36 #include "sendf.h"
37 #include "timeval.h"
38 #include "http.h"
39 #include "select.h"
40 #include "warnless.h"
41 #include "speedcheck.h"
42 #include "conncache.h"
43 #include "multihandle.h"
44 #include "pipeline.h"
45 #include "sigpipe.h"
46 #include "vtls/vtls.h"
47 #include "connect.h"
48 #include "http_proxy.h"
49 /* The last 3 #include files should be in this order */
50 #include "curl_printf.h"
51 #include "curl_memory.h"
52 #include "memdebug.h"
53
54 /*
55   CURL_SOCKET_HASH_TABLE_SIZE should be a prime number. Increasing it from 97
56   to 911 takes on a 32-bit machine 4 x 804 = 3211 more bytes.  Still, every
57   CURL handle takes 45-50 K memory, therefore this 3K are not significant.
58 */
59 #ifndef CURL_SOCKET_HASH_TABLE_SIZE
60 #define CURL_SOCKET_HASH_TABLE_SIZE 911
61 #endif
62
63 #ifndef CURL_CONNECTION_HASH_SIZE
64 #define CURL_CONNECTION_HASH_SIZE 97
65 #endif
66
67 #define CURL_MULTI_HANDLE 0x000bab1e
68
69 #define GOOD_MULTI_HANDLE(x) \
70   ((x) && (x)->type == CURL_MULTI_HANDLE)
71
72 static CURLMcode singlesocket(struct Curl_multi *multi,
73                               struct Curl_easy *data);
74 static int update_timer(struct Curl_multi *multi);
75
76 static CURLMcode add_next_timeout(struct curltime now,
77                                   struct Curl_multi *multi,
78                                   struct Curl_easy *d);
79 static CURLMcode multi_timeout(struct Curl_multi *multi,
80                                long *timeout_ms);
81 static void process_pending_handles(struct Curl_multi *multi);
82
83 #ifdef DEBUGBUILD
84 static const char * const statename[]={
85   "INIT",
86   "CONNECT_PEND",
87   "CONNECT",
88   "WAITRESOLVE",
89   "WAITCONNECT",
90   "WAITPROXYCONNECT",
91   "SENDPROTOCONNECT",
92   "PROTOCONNECT",
93   "WAITDO",
94   "DO",
95   "DOING",
96   "DO_MORE",
97   "DO_DONE",
98   "WAITPERFORM",
99   "PERFORM",
100   "TOOFAST",
101   "DONE",
102   "COMPLETED",
103   "MSGSENT",
104 };
105 #endif
106
107 /* function pointer called once when switching TO a state */
108 typedef void (*init_multistate_func)(struct Curl_easy *data);
109
110 static void Curl_init_completed(struct Curl_easy *data)
111 {
112   /* this is a completed transfer */
113
114   /* Important: reset the conn pointer so that we don't point to memory
115      that could be freed anytime */
116   data->easy_conn = NULL;
117   Curl_expire_clear(data); /* stop all timers */
118 }
119
120 /* always use this function to change state, to make debugging easier */
121 static void mstate(struct Curl_easy *data, CURLMstate state
122 #ifdef DEBUGBUILD
123                    , int lineno
124 #endif
125 )
126 {
127   CURLMstate oldstate = data->mstate;
128   static const init_multistate_func finit[CURLM_STATE_LAST] = {
129     NULL,              /* INIT */
130     NULL,              /* CONNECT_PEND */
131     Curl_init_CONNECT, /* CONNECT */
132     NULL,              /* WAITRESOLVE */
133     NULL,              /* WAITCONNECT */
134     NULL,              /* WAITPROXYCONNECT */
135     NULL,              /* SENDPROTOCONNECT */
136     NULL,              /* PROTOCONNECT */
137     NULL,              /* WAITDO */
138     Curl_connect_free, /* DO */
139     NULL,              /* DOING */
140     NULL,              /* DO_MORE */
141     NULL,              /* DO_DONE */
142     NULL,              /* WAITPERFORM */
143     NULL,              /* PERFORM */
144     NULL,              /* TOOFAST */
145     NULL,              /* DONE */
146     Curl_init_completed, /* COMPLETED */
147     NULL               /* MSGSENT */
148   };
149
150 #if defined(DEBUGBUILD) && defined(CURL_DISABLE_VERBOSE_STRINGS)
151   (void) lineno;
152 #endif
153
154   if(oldstate == state)
155     /* don't bother when the new state is the same as the old state */
156     return;
157
158   data->mstate = state;
159
160 #if defined(DEBUGBUILD) && !defined(CURL_DISABLE_VERBOSE_STRINGS)
161   if(data->mstate >= CURLM_STATE_CONNECT_PEND &&
162      data->mstate < CURLM_STATE_COMPLETED) {
163     long connection_id = -5000;
164
165     if(data->easy_conn)
166       connection_id = data->easy_conn->connection_id;
167
168     infof(data,
169           "STATE: %s => %s handle %p; line %d (connection #%ld)\n",
170           statename[oldstate], statename[data->mstate],
171           (void *)data, lineno, connection_id);
172   }
173 #endif
174
175   if(state == CURLM_STATE_COMPLETED)
176     /* changing to COMPLETED means there's one less easy handle 'alive' */
177     data->multi->num_alive--;
178
179   /* if this state has an init-function, run it */
180   if(finit[state])
181     finit[state](data);
182 }
183
184 #ifndef DEBUGBUILD
185 #define multistate(x,y) mstate(x,y)
186 #else
187 #define multistate(x,y) mstate(x,y, __LINE__)
188 #endif
189
190 /*
191  * We add one of these structs to the sockhash for a particular socket
192  */
193
194 struct Curl_sh_entry {
195   struct Curl_easy *easy;
196   int action;  /* what action READ/WRITE this socket waits for */
197   curl_socket_t socket; /* mainly to ease debugging */
198   void *socketp; /* settable by users with curl_multi_assign() */
199 };
200 /* bits for 'action' having no bits means this socket is not expecting any
201    action */
202 #define SH_READ  1
203 #define SH_WRITE 2
204
205 /* look up a given socket in the socket hash, skip invalid sockets */
206 static struct Curl_sh_entry *sh_getentry(struct curl_hash *sh,
207                                          curl_socket_t s)
208 {
209   if(s != CURL_SOCKET_BAD)
210     /* only look for proper sockets */
211     return Curl_hash_pick(sh, (char *)&s, sizeof(curl_socket_t));
212   return NULL;
213 }
214
215 /* make sure this socket is present in the hash for this handle */
216 static struct Curl_sh_entry *sh_addentry(struct curl_hash *sh,
217                                          curl_socket_t s,
218                                          struct Curl_easy *data)
219 {
220   struct Curl_sh_entry *there = sh_getentry(sh, s);
221   struct Curl_sh_entry *check;
222
223   if(there)
224     /* it is present, return fine */
225     return there;
226
227   /* not present, add it */
228   check = calloc(1, sizeof(struct Curl_sh_entry));
229   if(!check)
230     return NULL; /* major failure */
231
232   check->easy = data;
233   check->socket = s;
234
235   /* make/add new hash entry */
236   if(!Curl_hash_add(sh, (char *)&s, sizeof(curl_socket_t), check)) {
237     free(check);
238     return NULL; /* major failure */
239   }
240
241   return check; /* things are good in sockhash land */
242 }
243
244
245 /* delete the given socket + handle from the hash */
246 static void sh_delentry(struct curl_hash *sh, curl_socket_t s)
247 {
248   /* We remove the hash entry. This will end up in a call to
249      sh_freeentry(). */
250   Curl_hash_delete(sh, (char *)&s, sizeof(curl_socket_t));
251 }
252
253 /*
254  * free a sockhash entry
255  */
256 static void sh_freeentry(void *freethis)
257 {
258   struct Curl_sh_entry *p = (struct Curl_sh_entry *) freethis;
259
260   free(p);
261 }
262
263 static size_t fd_key_compare(void *k1, size_t k1_len, void *k2, size_t k2_len)
264 {
265   (void) k1_len; (void) k2_len;
266
267   return (*((curl_socket_t *) k1)) == (*((curl_socket_t *) k2));
268 }
269
270 static size_t hash_fd(void *key, size_t key_length, size_t slots_num)
271 {
272   curl_socket_t fd = *((curl_socket_t *) key);
273   (void) key_length;
274
275   return (fd % slots_num);
276 }
277
278 /*
279  * sh_init() creates a new socket hash and returns the handle for it.
280  *
281  * Quote from README.multi_socket:
282  *
283  * "Some tests at 7000 and 9000 connections showed that the socket hash lookup
284  * is somewhat of a bottle neck. Its current implementation may be a bit too
285  * limiting. It simply has a fixed-size array, and on each entry in the array
286  * it has a linked list with entries. So the hash only checks which list to
287  * scan through. The code I had used so for used a list with merely 7 slots
288  * (as that is what the DNS hash uses) but with 7000 connections that would
289  * make an average of 1000 nodes in each list to run through. I upped that to
290  * 97 slots (I believe a prime is suitable) and noticed a significant speed
291  * increase.  I need to reconsider the hash implementation or use a rather
292  * large default value like this. At 9000 connections I was still below 10us
293  * per call."
294  *
295  */
296 static int sh_init(struct curl_hash *hash, int hashsize)
297 {
298   return Curl_hash_init(hash, hashsize, hash_fd, fd_key_compare,
299                         sh_freeentry);
300 }
301
302 /*
303  * multi_addmsg()
304  *
305  * Called when a transfer is completed. Adds the given msg pointer to
306  * the list kept in the multi handle.
307  */
308 static CURLMcode multi_addmsg(struct Curl_multi *multi,
309                               struct Curl_message *msg)
310 {
311   Curl_llist_insert_next(&multi->msglist, multi->msglist.tail, msg,
312                          &msg->list);
313   return CURLM_OK;
314 }
315
316 /*
317  * multi_freeamsg()
318  *
319  * Callback used by the llist system when a single list entry is destroyed.
320  */
321 static void multi_freeamsg(void *a, void *b)
322 {
323   (void)a;
324   (void)b;
325 }
326
327 struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */
328                                      int chashsize) /* connection hash */
329 {
330   struct Curl_multi *multi = calloc(1, sizeof(struct Curl_multi));
331
332   if(!multi)
333     return NULL;
334
335   multi->type = CURL_MULTI_HANDLE;
336
337   if(Curl_mk_dnscache(&multi->hostcache))
338     goto error;
339
340   if(sh_init(&multi->sockhash, hashsize))
341     goto error;
342
343   if(Curl_conncache_init(&multi->conn_cache, chashsize))
344     goto error;
345
346   Curl_llist_init(&multi->msglist, multi_freeamsg);
347   Curl_llist_init(&multi->pending, multi_freeamsg);
348
349   multi->max_pipeline_length = 5;
350   multi->pipelining = CURLPIPE_MULTIPLEX;
351
352   /* -1 means it not set by user, use the default value */
353   multi->maxconnects = -1;
354   return multi;
355
356   error:
357
358   Curl_hash_destroy(&multi->sockhash);
359   Curl_hash_destroy(&multi->hostcache);
360   Curl_conncache_destroy(&multi->conn_cache);
361   Curl_llist_destroy(&multi->msglist, NULL);
362   Curl_llist_destroy(&multi->pending, NULL);
363
364   free(multi);
365   return NULL;
366 }
367
368 struct Curl_multi *curl_multi_init(void)
369 {
370   return Curl_multi_handle(CURL_SOCKET_HASH_TABLE_SIZE,
371                            CURL_CONNECTION_HASH_SIZE);
372 }
373
374 CURLMcode curl_multi_add_handle(struct Curl_multi *multi,
375                                 struct Curl_easy *data)
376 {
377   /* First, make some basic checks that the CURLM handle is a good handle */
378   if(!GOOD_MULTI_HANDLE(multi))
379     return CURLM_BAD_HANDLE;
380
381   /* Verify that we got a somewhat good easy handle too */
382   if(!GOOD_EASY_HANDLE(data))
383     return CURLM_BAD_EASY_HANDLE;
384
385   /* Prevent users from adding same easy handle more than once and prevent
386      adding to more than one multi stack */
387   if(data->multi)
388     return CURLM_ADDED_ALREADY;
389
390   if(multi->in_callback)
391     return CURLM_RECURSIVE_API_CALL;
392
393   /* Initialize timeout list for this handle */
394   Curl_llist_init(&data->state.timeoutlist, NULL);
395
396   /*
397    * No failure allowed in this function beyond this point. And no
398    * modification of easy nor multi handle allowed before this except for
399    * potential multi's connection cache growing which won't be undone in this
400    * function no matter what.
401    */
402   if(data->set.errorbuffer)
403     data->set.errorbuffer[0] = 0;
404
405   /* set the easy handle */
406   multistate(data, CURLM_STATE_INIT);
407
408   if((data->set.global_dns_cache) &&
409      (data->dns.hostcachetype != HCACHE_GLOBAL)) {
410     /* global dns cache was requested but still isn't */
411     struct curl_hash *global = Curl_global_host_cache_init();
412     if(global) {
413       /* only do this if the global cache init works */
414       data->dns.hostcache = global;
415       data->dns.hostcachetype = HCACHE_GLOBAL;
416     }
417   }
418   /* for multi interface connections, we share DNS cache automatically if the
419      easy handle's one is currently not set. */
420   else if(!data->dns.hostcache ||
421      (data->dns.hostcachetype == HCACHE_NONE)) {
422     data->dns.hostcache = &multi->hostcache;
423     data->dns.hostcachetype = HCACHE_MULTI;
424   }
425
426   /* Point to the shared or multi handle connection cache */
427   if(data->share && (data->share->specifier & (1<< CURL_LOCK_DATA_CONNECT)))
428     data->state.conn_cache = &data->share->conn_cache;
429   else
430     data->state.conn_cache = &multi->conn_cache;
431
432 #ifdef USE_LIBPSL
433   /* Do the same for PSL. */
434   if(data->share && (data->share->specifier & (1 << CURL_LOCK_DATA_PSL)))
435     data->psl = &data->share->psl;
436   else
437     data->psl = &multi->psl;
438 #endif
439
440   /* This adds the new entry at the 'end' of the doubly-linked circular
441      list of Curl_easy structs to try and maintain a FIFO queue so
442      the pipelined requests are in order. */
443
444   /* We add this new entry last in the list. */
445
446   data->next = NULL; /* end of the line */
447   if(multi->easyp) {
448     struct Curl_easy *last = multi->easylp;
449     last->next = data;
450     data->prev = last;
451     multi->easylp = data; /* the new last node */
452   }
453   else {
454     /* first node, make prev NULL! */
455     data->prev = NULL;
456     multi->easylp = multi->easyp = data; /* both first and last */
457   }
458
459   /* make the Curl_easy refer back to this multi handle */
460   data->multi = multi;
461
462   /* Set the timeout for this handle to expire really soon so that it will
463      be taken care of even when this handle is added in the midst of operation
464      when only the curl_multi_socket() API is used. During that flow, only
465      sockets that time-out or have actions will be dealt with. Since this
466      handle has no action yet, we make sure it times out to get things to
467      happen. */
468   Curl_expire(data, 0, EXPIRE_RUN_NOW);
469
470   /* increase the node-counter */
471   multi->num_easy++;
472
473   /* increase the alive-counter */
474   multi->num_alive++;
475
476   /* A somewhat crude work-around for a little glitch in update_timer() that
477      happens if the lastcall time is set to the same time when the handle is
478      removed as when the next handle is added, as then the check in
479      update_timer() that prevents calling the application multiple times with
480      the same timer info will not trigger and then the new handle's timeout
481      will not be notified to the app.
482
483      The work-around is thus simply to clear the 'lastcall' variable to force
484      update_timer() to always trigger a callback to the app when a new easy
485      handle is added */
486   memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
487
488   /* The closure handle only ever has default timeouts set. To improve the
489      state somewhat we clone the timeouts from each added handle so that the
490      closure handle always has the same timeouts as the most recently added
491      easy handle. */
492   data->state.conn_cache->closure_handle->set.timeout = data->set.timeout;
493   data->state.conn_cache->closure_handle->set.server_response_timeout =
494     data->set.server_response_timeout;
495   data->state.conn_cache->closure_handle->set.no_signal =
496     data->set.no_signal;
497
498   update_timer(multi);
499   return CURLM_OK;
500 }
501
502 #if 0
503 /* Debug-function, used like this:
504  *
505  * Curl_hash_print(multi->sockhash, debug_print_sock_hash);
506  *
507  * Enable the hash print function first by editing hash.c
508  */
509 static void debug_print_sock_hash(void *p)
510 {
511   struct Curl_sh_entry *sh = (struct Curl_sh_entry *)p;
512
513   fprintf(stderr, " [easy %p/magic %x/socket %d]",
514           (void *)sh->data, sh->data->magic, (int)sh->socket);
515 }
516 #endif
517
518 static CURLcode multi_done(struct connectdata **connp,
519                           CURLcode status,  /* an error if this is called
520                                                after an error was detected */
521                           bool premature)
522 {
523   CURLcode result;
524   struct connectdata *conn;
525   struct Curl_easy *data;
526   unsigned int i;
527
528   DEBUGASSERT(*connp);
529
530   conn = *connp;
531   data = conn->data;
532
533   DEBUGF(infof(data, "multi_done\n"));
534
535   if(data->state.done)
536     /* Stop if multi_done() has already been called */
537     return CURLE_OK;
538
539   /* Stop the resolver and free its own resources (but not dns_entry yet). */
540   Curl_resolver_kill(conn);
541
542   Curl_getoff_all_pipelines(data, conn);
543
544   /* Cleanup possible redirect junk */
545   Curl_safefree(data->req.newurl);
546   Curl_safefree(data->req.location);
547
548   switch(status) {
549   case CURLE_ABORTED_BY_CALLBACK:
550   case CURLE_READ_ERROR:
551   case CURLE_WRITE_ERROR:
552     /* When we're aborted due to a callback return code it basically have to
553        be counted as premature as there is trouble ahead if we don't. We have
554        many callbacks and protocols work differently, we could potentially do
555        this more fine-grained in the future. */
556     premature = TRUE;
557   default:
558     break;
559   }
560
561   /* this calls the protocol-specific function pointer previously set */
562   if(conn->handler->done)
563     result = conn->handler->done(conn, status, premature);
564   else
565     result = status;
566
567   if(CURLE_ABORTED_BY_CALLBACK != result) {
568     /* avoid this if we already aborted by callback to avoid this calling
569        another callback */
570     CURLcode rc = Curl_pgrsDone(conn);
571     if(!result && rc)
572       result = CURLE_ABORTED_BY_CALLBACK;
573   }
574
575   process_pending_handles(data->multi); /* connection / multiplex */
576
577   if(conn->send_pipe.size || conn->recv_pipe.size) {
578     /* Stop if pipeline is not empty . */
579     data->easy_conn = NULL;
580     DEBUGF(infof(data, "Connection still in use %zu/%zu, "
581                  "no more multi_done now!\n",
582                  conn->send_pipe.size, conn->recv_pipe.size));
583     return CURLE_OK;
584   }
585
586   data->state.done = TRUE; /* called just now! */
587
588   if(conn->dns_entry) {
589     Curl_resolv_unlock(data, conn->dns_entry); /* done with this */
590     conn->dns_entry = NULL;
591   }
592   Curl_hostcache_prune(data);
593   Curl_safefree(data->state.ulbuf);
594
595   /* if the transfer was completed in a paused state there can be buffered
596      data left to free */
597   for(i = 0; i < data->state.tempcount; i++) {
598     free(data->state.tempwrite[i].buf);
599   }
600   data->state.tempcount = 0;
601
602   /* if data->set.reuse_forbid is TRUE, it means the libcurl client has
603      forced us to close this connection. This is ignored for requests taking
604      place in a NTLM authentication handshake
605
606      if conn->bits.close is TRUE, it means that the connection should be
607      closed in spite of all our efforts to be nice, due to protocol
608      restrictions in our or the server's end
609
610      if premature is TRUE, it means this connection was said to be DONE before
611      the entire request operation is complete and thus we can't know in what
612      state it is for re-using, so we're forced to close it. In a perfect world
613      we can add code that keep track of if we really must close it here or not,
614      but currently we have no such detail knowledge.
615   */
616
617   if((data->set.reuse_forbid
618 #if defined(USE_NTLM)
619       && !(conn->ntlm.state == NTLMSTATE_TYPE2 ||
620            conn->proxyntlm.state == NTLMSTATE_TYPE2)
621 #endif
622      ) || conn->bits.close
623        || (premature && !(conn->handler->flags & PROTOPT_STREAM))) {
624     CURLcode res2 = Curl_disconnect(data, conn, premature);
625
626     /* If we had an error already, make sure we return that one. But
627        if we got a new error, return that. */
628     if(!result && res2)
629       result = res2;
630   }
631   else {
632     char buffer[256];
633     /* create string before returning the connection */
634     snprintf(buffer, sizeof(buffer),
635              "Connection #%ld to host %s left intact",
636              conn->connection_id,
637              conn->bits.socksproxy ? conn->socks_proxy.host.dispname :
638              conn->bits.httpproxy ? conn->http_proxy.host.dispname :
639              conn->bits.conn_to_host ? conn->conn_to_host.dispname :
640              conn->host.dispname);
641
642     /* the connection is no longer in use by this transfer */
643     if(Curl_conncache_return_conn(conn)) {
644       /* remember the most recently used connection */
645       data->state.lastconnect = conn;
646       infof(data, "%s\n", buffer);
647     }
648     else
649       data->state.lastconnect = NULL;
650   }
651
652   *connp = NULL; /* to make the caller of this function better detect that
653                     this was either closed or handed over to the connection
654                     cache here, and therefore cannot be used from this point on
655                  */
656   Curl_free_request_state(data);
657   return result;
658 }
659
660 CURLMcode curl_multi_remove_handle(struct Curl_multi *multi,
661                                    struct Curl_easy *data)
662 {
663   struct Curl_easy *easy = data;
664   bool premature;
665   bool easy_owns_conn;
666   struct curl_llist_element *e;
667
668   /* First, make some basic checks that the CURLM handle is a good handle */
669   if(!GOOD_MULTI_HANDLE(multi))
670     return CURLM_BAD_HANDLE;
671
672   /* Verify that we got a somewhat good easy handle too */
673   if(!GOOD_EASY_HANDLE(data))
674     return CURLM_BAD_EASY_HANDLE;
675
676   /* Prevent users from trying to remove same easy handle more than once */
677   if(!data->multi)
678     return CURLM_OK; /* it is already removed so let's say it is fine! */
679
680   if(multi->in_callback)
681     return CURLM_RECURSIVE_API_CALL;
682
683   premature = (data->mstate < CURLM_STATE_COMPLETED) ? TRUE : FALSE;
684   easy_owns_conn = (data->easy_conn && (data->easy_conn->data == easy)) ?
685     TRUE : FALSE;
686
687   /* If the 'state' is not INIT or COMPLETED, we might need to do something
688      nice to put the easy_handle in a good known state when this returns. */
689   if(premature) {
690     /* this handle is "alive" so we need to count down the total number of
691        alive connections when this is removed */
692     multi->num_alive--;
693   }
694
695   if(data->easy_conn &&
696      data->mstate > CURLM_STATE_DO &&
697      data->mstate < CURLM_STATE_COMPLETED) {
698     /* Set connection owner so that the DONE function closes it.  We can
699        safely do this here since connection is killed. */
700     data->easy_conn->data = easy;
701     /* If the handle is in a pipeline and has started sending off its
702        request but not received its response yet, we need to close
703        connection. */
704     streamclose(data->easy_conn, "Removed with partial response");
705     easy_owns_conn = TRUE;
706   }
707
708   /* The timer must be shut down before data->multi is set to NULL,
709      else the timenode will remain in the splay tree after
710      curl_easy_cleanup is called. */
711   Curl_expire_clear(data);
712
713   if(data->easy_conn) {
714
715     /* we must call multi_done() here (if we still own the connection) so that
716        we don't leave a half-baked one around */
717     if(easy_owns_conn) {
718
719       /* multi_done() clears the conn->data field to lose the association
720          between the easy handle and the connection
721
722          Note that this ignores the return code simply because there's
723          nothing really useful to do with it anyway! */
724       (void)multi_done(&data->easy_conn, data->result, premature);
725     }
726     else
727       /* Clear connection pipelines, if multi_done above was not called */
728       Curl_getoff_all_pipelines(data, data->easy_conn);
729   }
730
731   if(data->connect_queue.ptr)
732     /* the handle was in the pending list waiting for an available connection,
733        so go ahead and remove it */
734     Curl_llist_remove(&multi->pending, &data->connect_queue, NULL);
735
736   if(data->dns.hostcachetype == HCACHE_MULTI) {
737     /* stop using the multi handle's DNS cache, *after* the possible
738        multi_done() call above */
739     data->dns.hostcache = NULL;
740     data->dns.hostcachetype = HCACHE_NONE;
741   }
742
743   Curl_wildcard_dtor(&data->wildcard);
744
745   /* destroy the timeout list that is held in the easy handle, do this *after*
746      multi_done() as that may actually call Curl_expire that uses this */
747   Curl_llist_destroy(&data->state.timeoutlist, NULL);
748
749   /* as this was using a shared connection cache we clear the pointer to that
750      since we're not part of that multi handle anymore */
751   data->state.conn_cache = NULL;
752
753   /* change state without using multistate(), only to make singlesocket() do
754      what we want */
755   data->mstate = CURLM_STATE_COMPLETED;
756   singlesocket(multi, easy); /* to let the application know what sockets that
757                                 vanish with this handle */
758
759   /* Remove the association between the connection and the handle */
760   if(data->easy_conn) {
761     data->easy_conn->data = NULL;
762     data->easy_conn = NULL;
763   }
764
765 #ifdef USE_LIBPSL
766   /* Remove the PSL association. */
767   if(data->psl == &multi->psl)
768     data->psl = NULL;
769 #endif
770
771   data->multi = NULL; /* clear the association to this multi handle */
772
773   /* make sure there's no pending message in the queue sent from this easy
774      handle */
775
776   for(e = multi->msglist.head; e; e = e->next) {
777     struct Curl_message *msg = e->ptr;
778
779     if(msg->extmsg.easy_handle == easy) {
780       Curl_llist_remove(&multi->msglist, e, NULL);
781       /* there can only be one from this specific handle */
782       break;
783     }
784   }
785
786   /* make the previous node point to our next */
787   if(data->prev)
788     data->prev->next = data->next;
789   else
790     multi->easyp = data->next; /* point to first node */
791
792   /* make our next point to our previous node */
793   if(data->next)
794     data->next->prev = data->prev;
795   else
796     multi->easylp = data->prev; /* point to last node */
797
798   /* NOTE NOTE NOTE
799      We do not touch the easy handle here! */
800   multi->num_easy--; /* one less to care about now */
801
802   update_timer(multi);
803   return CURLM_OK;
804 }
805
806 /* Return TRUE if the application asked for a certain set of pipelining */
807 bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
808 {
809   return (multi && (multi->pipelining & bits)) ? TRUE : FALSE;
810 }
811
812 void Curl_multi_handlePipeBreak(struct Curl_easy *data)
813 {
814   data->easy_conn = NULL;
815 }
816
817 static int waitconnect_getsock(struct connectdata *conn,
818                                curl_socket_t *sock,
819                                int numsocks)
820 {
821   int i;
822   int s = 0;
823   int rc = 0;
824
825   if(!numsocks)
826     return GETSOCK_BLANK;
827
828 #ifdef USE_SSL
829   if(CONNECT_FIRSTSOCKET_PROXY_SSL())
830     return Curl_ssl_getsock(conn, sock, numsocks);
831 #endif
832
833   for(i = 0; i<2; i++) {
834     if(conn->tempsock[i] != CURL_SOCKET_BAD) {
835       sock[s] = conn->tempsock[i];
836       rc |= GETSOCK_WRITESOCK(s++);
837     }
838   }
839
840   return rc;
841 }
842
843 static int waitproxyconnect_getsock(struct connectdata *conn,
844                                     curl_socket_t *sock,
845                                     int numsocks)
846 {
847   if(!numsocks)
848     return GETSOCK_BLANK;
849
850   sock[0] = conn->sock[FIRSTSOCKET];
851
852   /* when we've sent a CONNECT to a proxy, we should rather wait for the
853      socket to become readable to be able to get the response headers */
854   if(conn->connect_state)
855     return GETSOCK_READSOCK(0);
856
857   return GETSOCK_WRITESOCK(0);
858 }
859
860 static int domore_getsock(struct connectdata *conn,
861                           curl_socket_t *socks,
862                           int numsocks)
863 {
864   if(conn && conn->handler->domore_getsock)
865     return conn->handler->domore_getsock(conn, socks, numsocks);
866   return GETSOCK_BLANK;
867 }
868
869 /* returns bitmapped flags for this handle and its sockets */
870 static int multi_getsock(struct Curl_easy *data,
871                          curl_socket_t *socks, /* points to numsocks number
872                                                   of sockets */
873                          int numsocks)
874 {
875   /* The no connection case can happen when this is called from
876      curl_multi_remove_handle() => singlesocket() => multi_getsock().
877   */
878   if(!data->easy_conn)
879     return 0;
880
881   if(data->mstate > CURLM_STATE_CONNECT &&
882      data->mstate < CURLM_STATE_COMPLETED) {
883     /* Set up ownership correctly */
884     data->easy_conn->data = data;
885   }
886
887   switch(data->mstate) {
888   default:
889 #if 0 /* switch back on these cases to get the compiler to check for all enums
890          to be present */
891   case CURLM_STATE_TOOFAST:  /* returns 0, so will not select. */
892   case CURLM_STATE_COMPLETED:
893   case CURLM_STATE_MSGSENT:
894   case CURLM_STATE_INIT:
895   case CURLM_STATE_CONNECT:
896   case CURLM_STATE_WAITDO:
897   case CURLM_STATE_DONE:
898   case CURLM_STATE_LAST:
899     /* this will get called with CURLM_STATE_COMPLETED when a handle is
900        removed */
901 #endif
902     return 0;
903
904   case CURLM_STATE_WAITRESOLVE:
905     return Curl_resolv_getsock(data->easy_conn, socks, numsocks);
906
907   case CURLM_STATE_PROTOCONNECT:
908   case CURLM_STATE_SENDPROTOCONNECT:
909     return Curl_protocol_getsock(data->easy_conn, socks, numsocks);
910
911   case CURLM_STATE_DO:
912   case CURLM_STATE_DOING:
913     return Curl_doing_getsock(data->easy_conn, socks, numsocks);
914
915   case CURLM_STATE_WAITPROXYCONNECT:
916     return waitproxyconnect_getsock(data->easy_conn, socks, numsocks);
917
918   case CURLM_STATE_WAITCONNECT:
919     return waitconnect_getsock(data->easy_conn, socks, numsocks);
920
921   case CURLM_STATE_DO_MORE:
922     return domore_getsock(data->easy_conn, socks, numsocks);
923
924   case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
925                                to waiting for the same as the *PERFORM
926                                states */
927   case CURLM_STATE_PERFORM:
928   case CURLM_STATE_WAITPERFORM:
929     return Curl_single_getsock(data->easy_conn, socks, numsocks);
930   }
931
932 }
933
934 CURLMcode curl_multi_fdset(struct Curl_multi *multi,
935                            fd_set *read_fd_set, fd_set *write_fd_set,
936                            fd_set *exc_fd_set, int *max_fd)
937 {
938   /* Scan through all the easy handles to get the file descriptors set.
939      Some easy handles may not have connected to the remote host yet,
940      and then we must make sure that is done. */
941   struct Curl_easy *data;
942   int this_max_fd = -1;
943   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
944   int i;
945   (void)exc_fd_set; /* not used */
946
947   if(!GOOD_MULTI_HANDLE(multi))
948     return CURLM_BAD_HANDLE;
949
950   if(multi->in_callback)
951     return CURLM_RECURSIVE_API_CALL;
952
953   data = multi->easyp;
954   while(data) {
955     int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
956
957     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
958       curl_socket_t s = CURL_SOCKET_BAD;
959
960       if((bitmap & GETSOCK_READSOCK(i)) && VALID_SOCK((sockbunch[i]))) {
961         FD_SET(sockbunch[i], read_fd_set);
962         s = sockbunch[i];
963       }
964       if((bitmap & GETSOCK_WRITESOCK(i)) && VALID_SOCK((sockbunch[i]))) {
965         FD_SET(sockbunch[i], write_fd_set);
966         s = sockbunch[i];
967       }
968       if(s == CURL_SOCKET_BAD)
969         /* this socket is unused, break out of loop */
970         break;
971       if((int)s > this_max_fd)
972         this_max_fd = (int)s;
973     }
974
975     data = data->next; /* check next handle */
976   }
977
978   *max_fd = this_max_fd;
979
980   return CURLM_OK;
981 }
982
983 #define NUM_POLLS_ON_STACK 10
984
985 CURLMcode Curl_multi_wait(struct Curl_multi *multi,
986                           struct curl_waitfd extra_fds[],
987                           unsigned int extra_nfds,
988                           int timeout_ms,
989                           int *ret,
990                           bool *gotsocket) /* if any socket was checked */
991 {
992   struct Curl_easy *data;
993   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
994   int bitmap;
995   unsigned int i;
996   unsigned int nfds = 0;
997   unsigned int curlfds;
998   struct pollfd *ufds = NULL;
999   bool ufds_malloc = FALSE;
1000   long timeout_internal;
1001   int retcode = 0;
1002   struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
1003
1004   if(gotsocket)
1005     *gotsocket = FALSE;
1006
1007   if(!GOOD_MULTI_HANDLE(multi))
1008     return CURLM_BAD_HANDLE;
1009
1010   if(multi->in_callback)
1011     return CURLM_RECURSIVE_API_CALL;
1012
1013   /* Count up how many fds we have from the multi handle */
1014   data = multi->easyp;
1015   while(data) {
1016     bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
1017
1018     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
1019       curl_socket_t s = CURL_SOCKET_BAD;
1020
1021       if(bitmap & GETSOCK_READSOCK(i)) {
1022         ++nfds;
1023         s = sockbunch[i];
1024       }
1025       if(bitmap & GETSOCK_WRITESOCK(i)) {
1026         ++nfds;
1027         s = sockbunch[i];
1028       }
1029       if(s == CURL_SOCKET_BAD) {
1030         break;
1031       }
1032     }
1033
1034     data = data->next; /* check next handle */
1035   }
1036
1037   /* If the internally desired timeout is actually shorter than requested from
1038      the outside, then use the shorter time! But only if the internal timer
1039      is actually larger than -1! */
1040   (void)multi_timeout(multi, &timeout_internal);
1041   if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms))
1042     timeout_ms = (int)timeout_internal;
1043
1044   curlfds = nfds; /* number of internal file descriptors */
1045   nfds += extra_nfds; /* add the externally provided ones */
1046
1047   if(nfds) {
1048     if(nfds > NUM_POLLS_ON_STACK) {
1049       /* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
1050          big, so at 2^29 sockets this value might wrap. When a process gets
1051          the capability to actually handle over 500 million sockets this
1052          calculation needs a integer overflow check. */
1053       ufds = malloc(nfds * sizeof(struct pollfd));
1054       if(!ufds)
1055         return CURLM_OUT_OF_MEMORY;
1056       ufds_malloc = TRUE;
1057     }
1058     else
1059       ufds = &a_few_on_stack[0];
1060   }
1061   nfds = 0;
1062
1063   /* only do the second loop if we found descriptors in the first stage run
1064      above */
1065
1066   if(curlfds) {
1067     /* Add the curl handles to our pollfds first */
1068     data = multi->easyp;
1069     while(data) {
1070       bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
1071
1072       for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
1073         curl_socket_t s = CURL_SOCKET_BAD;
1074
1075         if(bitmap & GETSOCK_READSOCK(i)) {
1076           ufds[nfds].fd = sockbunch[i];
1077           ufds[nfds].events = POLLIN;
1078           ++nfds;
1079           s = sockbunch[i];
1080         }
1081         if(bitmap & GETSOCK_WRITESOCK(i)) {
1082           ufds[nfds].fd = sockbunch[i];
1083           ufds[nfds].events = POLLOUT;
1084           ++nfds;
1085           s = sockbunch[i];
1086         }
1087         if(s == CURL_SOCKET_BAD) {
1088           break;
1089         }
1090       }
1091
1092       data = data->next; /* check next handle */
1093     }
1094   }
1095
1096   /* Add external file descriptions from poll-like struct curl_waitfd */
1097   for(i = 0; i < extra_nfds; i++) {
1098     ufds[nfds].fd = extra_fds[i].fd;
1099     ufds[nfds].events = 0;
1100     if(extra_fds[i].events & CURL_WAIT_POLLIN)
1101       ufds[nfds].events |= POLLIN;
1102     if(extra_fds[i].events & CURL_WAIT_POLLPRI)
1103       ufds[nfds].events |= POLLPRI;
1104     if(extra_fds[i].events & CURL_WAIT_POLLOUT)
1105       ufds[nfds].events |= POLLOUT;
1106     ++nfds;
1107   }
1108
1109   if(nfds) {
1110     int pollrc;
1111     /* wait... */
1112     pollrc = Curl_poll(ufds, nfds, timeout_ms);
1113
1114     if(pollrc > 0) {
1115       retcode = pollrc;
1116       /* copy revents results from the poll to the curl_multi_wait poll
1117          struct, the bit values of the actual underlying poll() implementation
1118          may not be the same as the ones in the public libcurl API! */
1119       for(i = 0; i < extra_nfds; i++) {
1120         unsigned short mask = 0;
1121         unsigned r = ufds[curlfds + i].revents;
1122
1123         if(r & POLLIN)
1124           mask |= CURL_WAIT_POLLIN;
1125         if(r & POLLOUT)
1126           mask |= CURL_WAIT_POLLOUT;
1127         if(r & POLLPRI)
1128           mask |= CURL_WAIT_POLLPRI;
1129
1130         extra_fds[i].revents = mask;
1131       }
1132     }
1133   }
1134
1135   if(ufds_malloc)
1136     free(ufds);
1137   if(ret)
1138     *ret = retcode;
1139   if(gotsocket && (extra_fds || curlfds))
1140     /* if any socket was checked */
1141     *gotsocket = TRUE;
1142
1143   return CURLM_OK;
1144 }
1145
1146 CURLMcode curl_multi_wait(struct Curl_multi *multi,
1147                           struct curl_waitfd extra_fds[],
1148                           unsigned int extra_nfds,
1149                           int timeout_ms,
1150                           int *ret)
1151 {
1152   return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, NULL);
1153 }
1154 /*
1155  * Curl_multi_connchanged() is called to tell that there is a connection in
1156  * this multi handle that has changed state (pipelining become possible, the
1157  * number of allowed streams changed or similar), and a subsequent use of this
1158  * multi handle should move CONNECT_PEND handles back to CONNECT to have them
1159  * retry.
1160  */
1161 void Curl_multi_connchanged(struct Curl_multi *multi)
1162 {
1163   multi->recheckstate = TRUE;
1164 }
1165
1166 /*
1167  * multi_ischanged() is called
1168  *
1169  * Returns TRUE/FALSE whether the state is changed to trigger a CONNECT_PEND
1170  * => CONNECT action.
1171  *
1172  * Set 'clear' to TRUE to have it also clear the state variable.
1173  */
1174 static bool multi_ischanged(struct Curl_multi *multi, bool clear)
1175 {
1176   bool retval = multi->recheckstate;
1177   if(clear)
1178     multi->recheckstate = FALSE;
1179   return retval;
1180 }
1181
1182 CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
1183                                  struct Curl_easy *data,
1184                                  struct connectdata *conn)
1185 {
1186   CURLMcode rc;
1187
1188   if(multi->in_callback)
1189     return CURLM_RECURSIVE_API_CALL;
1190
1191   rc = curl_multi_add_handle(multi, data);
1192   if(!rc) {
1193     struct SingleRequest *k = &data->req;
1194
1195     /* pass in NULL for 'conn' here since we don't want to init the
1196        connection, only this transfer */
1197     Curl_init_do(data, NULL);
1198
1199     /* take this handle to the perform state right away */
1200     multistate(data, CURLM_STATE_PERFORM);
1201     data->easy_conn = conn;
1202     k->keepon |= KEEP_RECV; /* setup to receive! */
1203   }
1204   return rc;
1205 }
1206
1207 static CURLcode multi_reconnect_request(struct connectdata **connp)
1208 {
1209   CURLcode result = CURLE_OK;
1210   struct connectdata *conn = *connp;
1211   struct Curl_easy *data = conn->data;
1212
1213   /* This was a re-use of a connection and we got a write error in the
1214    * DO-phase. Then we DISCONNECT this connection and have another attempt to
1215    * CONNECT and then DO again! The retry cannot possibly find another
1216    * connection to re-use, since we only keep one possible connection for
1217    * each.  */
1218
1219   infof(data, "Re-used connection seems dead, get a new one\n");
1220
1221   connclose(conn, "Reconnect dead connection"); /* enforce close */
1222   result = multi_done(&conn, result, FALSE); /* we are so done with this */
1223
1224   /* conn may no longer be a good pointer, clear it to avoid mistakes by
1225      parent functions */
1226   *connp = NULL;
1227
1228   /*
1229    * We need to check for CURLE_SEND_ERROR here as well. This could happen
1230    * when the request failed on a FTP connection and thus multi_done() itself
1231    * tried to use the connection (again).
1232    */
1233   if(!result || (CURLE_SEND_ERROR == result)) {
1234     bool async;
1235     bool protocol_done = TRUE;
1236
1237     /* Now, redo the connect and get a new connection */
1238     result = Curl_connect(data, connp, &async, &protocol_done);
1239     if(!result) {
1240       /* We have connected or sent away a name resolve query fine */
1241
1242       conn = *connp; /* setup conn to again point to something nice */
1243       if(async) {
1244         /* Now, if async is TRUE here, we need to wait for the name
1245            to resolve */
1246         result = Curl_resolver_wait_resolv(conn, NULL);
1247         if(result)
1248           return result;
1249
1250         /* Resolved, continue with the connection */
1251         result = Curl_once_resolved(conn, &protocol_done);
1252         if(result)
1253           return result;
1254       }
1255     }
1256   }
1257
1258   return result;
1259 }
1260
1261 /*
1262  * do_complete is called when the DO actions are complete.
1263  *
1264  * We init chunking and trailer bits to their default values here immediately
1265  * before receiving any header data for the current request in the pipeline.
1266  */
1267 static void do_complete(struct connectdata *conn)
1268 {
1269   conn->data->req.chunk = FALSE;
1270   conn->data->req.maxfd = (conn->sockfd>conn->writesockfd?
1271                            conn->sockfd:conn->writesockfd) + 1;
1272   Curl_pgrsTime(conn->data, TIMER_PRETRANSFER);
1273 }
1274
1275 static CURLcode multi_do(struct connectdata **connp, bool *done)
1276 {
1277   CURLcode result = CURLE_OK;
1278   struct connectdata *conn = *connp;
1279   struct Curl_easy *data = conn->data;
1280
1281   if(conn->handler->do_it) {
1282     /* generic protocol-specific function pointer set in curl_connect() */
1283     result = conn->handler->do_it(conn, done);
1284
1285     /* This was formerly done in transfer.c, but we better do it here */
1286     if((CURLE_SEND_ERROR == result) && conn->bits.reuse) {
1287       /*
1288        * If the connection is using an easy handle, call reconnect
1289        * to re-establish the connection.  Otherwise, let the multi logic
1290        * figure out how to re-establish the connection.
1291        */
1292       if(!data->multi) {
1293         result = multi_reconnect_request(connp);
1294
1295         if(!result) {
1296           /* ... finally back to actually retry the DO phase */
1297           conn = *connp; /* re-assign conn since multi_reconnect_request
1298                             creates a new connection */
1299           result = conn->handler->do_it(conn, done);
1300         }
1301       }
1302       else
1303         return result;
1304     }
1305
1306     if(!result && *done)
1307       /* do_complete must be called after the protocol-specific DO function */
1308       do_complete(conn);
1309   }
1310   return result;
1311 }
1312
1313 /*
1314  * multi_do_more() is called during the DO_MORE multi state. It is basically a
1315  * second stage DO state which (wrongly) was introduced to support FTP's
1316  * second connection.
1317  *
1318  * TODO: A future libcurl should be able to work away this state.
1319  *
1320  * 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
1321  * DOING state there's more work to do!
1322  */
1323
1324 static CURLcode multi_do_more(struct connectdata *conn, int *complete)
1325 {
1326   CURLcode result = CURLE_OK;
1327
1328   *complete = 0;
1329
1330   if(conn->handler->do_more)
1331     result = conn->handler->do_more(conn, complete);
1332
1333   if(!result && (*complete == 1))
1334     /* do_complete must be called after the protocol-specific DO function */
1335     do_complete(conn);
1336
1337   return result;
1338 }
1339
1340 static CURLMcode multi_runsingle(struct Curl_multi *multi,
1341                                  struct curltime now,
1342                                  struct Curl_easy *data)
1343 {
1344   struct Curl_message *msg = NULL;
1345   bool connected;
1346   bool async;
1347   bool protocol_connect = FALSE;
1348   bool dophase_done = FALSE;
1349   bool done = FALSE;
1350   CURLMcode rc;
1351   CURLcode result = CURLE_OK;
1352   struct SingleRequest *k;
1353   time_t timeout_ms;
1354   time_t recv_timeout_ms;
1355   timediff_t send_timeout_ms;
1356   int control;
1357
1358   if(!GOOD_EASY_HANDLE(data))
1359     return CURLM_BAD_EASY_HANDLE;
1360
1361   do {
1362     /* A "stream" here is a logical stream if the protocol can handle that
1363        (HTTP/2), or the full connection for older protocols */
1364     bool stream_error = FALSE;
1365     rc = CURLM_OK;
1366
1367     if(!data->easy_conn &&
1368        data->mstate > CURLM_STATE_CONNECT &&
1369        data->mstate < CURLM_STATE_DONE) {
1370       /* In all these states, the code will blindly access 'data->easy_conn'
1371          so this is precaution that it isn't NULL. And it silences static
1372          analyzers. */
1373       failf(data, "In state %d with no easy_conn, bail out!\n", data->mstate);
1374       return CURLM_INTERNAL_ERROR;
1375     }
1376
1377     if(multi_ischanged(multi, TRUE)) {
1378       DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n"));
1379       process_pending_handles(multi); /* pipelined/multiplexed */
1380     }
1381
1382     if(data->easy_conn && data->mstate > CURLM_STATE_CONNECT &&
1383        data->mstate < CURLM_STATE_COMPLETED) {
1384       /* Make sure we set the connection's current owner */
1385       data->easy_conn->data = data;
1386     }
1387
1388     if(data->easy_conn &&
1389        (data->mstate >= CURLM_STATE_CONNECT) &&
1390        (data->mstate < CURLM_STATE_COMPLETED)) {
1391       /* we need to wait for the connect state as only then is the start time
1392          stored, but we must not check already completed handles */
1393       timeout_ms = Curl_timeleft(data, &now,
1394                                  (data->mstate <= CURLM_STATE_WAITDO)?
1395                                  TRUE:FALSE);
1396
1397       if(timeout_ms < 0) {
1398         /* Handle timed out */
1399         if(data->mstate == CURLM_STATE_WAITRESOLVE)
1400           failf(data, "Resolving timed out after %ld milliseconds",
1401                 Curl_timediff(now, data->progress.t_startsingle));
1402         else if(data->mstate == CURLM_STATE_WAITCONNECT)
1403           failf(data, "Connection timed out after %ld milliseconds",
1404                 Curl_timediff(now, data->progress.t_startsingle));
1405         else {
1406           k = &data->req;
1407           if(k->size != -1) {
1408             failf(data, "Operation timed out after %ld milliseconds with %"
1409                   CURL_FORMAT_CURL_OFF_T " out of %"
1410                   CURL_FORMAT_CURL_OFF_T " bytes received",
1411                   Curl_timediff(now, data->progress.t_startsingle),
1412                   k->bytecount, k->size);
1413           }
1414           else {
1415             failf(data, "Operation timed out after %ld milliseconds with %"
1416                   CURL_FORMAT_CURL_OFF_T " bytes received",
1417                   Curl_timediff(now, data->progress.t_startsingle),
1418                   k->bytecount);
1419           }
1420         }
1421
1422         /* Force connection closed if the connection has indeed been used */
1423         if(data->mstate > CURLM_STATE_DO) {
1424           streamclose(data->easy_conn, "Disconnected with pending data");
1425           stream_error = TRUE;
1426         }
1427         result = CURLE_OPERATION_TIMEDOUT;
1428         (void)multi_done(&data->easy_conn, result, TRUE);
1429         /* Skip the statemachine and go directly to error handling section. */
1430         goto statemachine_end;
1431       }
1432     }
1433
1434     switch(data->mstate) {
1435     case CURLM_STATE_INIT:
1436       /* init this transfer. */
1437       result = Curl_pretransfer(data);
1438
1439       if(!result) {
1440         /* after init, go CONNECT */
1441         multistate(data, CURLM_STATE_CONNECT);
1442         Curl_pgrsTime(data, TIMER_STARTOP);
1443         rc = CURLM_CALL_MULTI_PERFORM;
1444       }
1445       break;
1446
1447     case CURLM_STATE_CONNECT_PEND:
1448       /* We will stay here until there is a connection available. Then
1449          we try again in the CURLM_STATE_CONNECT state. */
1450       break;
1451
1452     case CURLM_STATE_CONNECT:
1453       /* Connect. We want to get a connection identifier filled in. */
1454       Curl_pgrsTime(data, TIMER_STARTSINGLE);
1455       result = Curl_connect(data, &data->easy_conn,
1456                             &async, &protocol_connect);
1457       if(CURLE_NO_CONNECTION_AVAILABLE == result) {
1458         /* There was no connection available. We will go to the pending
1459            state and wait for an available connection. */
1460         multistate(data, CURLM_STATE_CONNECT_PEND);
1461
1462         /* add this handle to the list of connect-pending handles */
1463         Curl_llist_insert_next(&multi->pending, multi->pending.tail, data,
1464                                &data->connect_queue);
1465         result = CURLE_OK;
1466         break;
1467       }
1468
1469       if(!result) {
1470         /* Add this handle to the send or pend pipeline */
1471         result = Curl_add_handle_to_pipeline(data, data->easy_conn);
1472         if(result)
1473           stream_error = TRUE;
1474         else {
1475           if(async)
1476             /* We're now waiting for an asynchronous name lookup */
1477             multistate(data, CURLM_STATE_WAITRESOLVE);
1478           else {
1479             /* after the connect has been sent off, go WAITCONNECT unless the
1480                protocol connect is already done and we can go directly to
1481                WAITDO or DO! */
1482             rc = CURLM_CALL_MULTI_PERFORM;
1483
1484             if(protocol_connect)
1485               multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1486                          CURLM_STATE_WAITDO:CURLM_STATE_DO);
1487             else {
1488 #ifndef CURL_DISABLE_HTTP
1489               if(Curl_connect_ongoing(data->easy_conn))
1490                 multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1491               else
1492 #endif
1493                 multistate(data, CURLM_STATE_WAITCONNECT);
1494             }
1495           }
1496         }
1497       }
1498       break;
1499
1500     case CURLM_STATE_WAITRESOLVE:
1501       /* awaiting an asynch name resolve to complete */
1502     {
1503       struct Curl_dns_entry *dns = NULL;
1504       struct connectdata *conn = data->easy_conn;
1505       const char *hostname;
1506
1507       if(conn->bits.httpproxy)
1508         hostname = conn->http_proxy.host.name;
1509       else if(conn->bits.conn_to_host)
1510         hostname = conn->conn_to_host.name;
1511       else
1512         hostname = conn->host.name;
1513
1514       /* check if we have the name resolved by now */
1515       dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
1516
1517       if(dns) {
1518 #ifdef CURLRES_ASYNCH
1519         conn->async.dns = dns;
1520         conn->async.done = TRUE;
1521 #endif
1522         result = CURLE_OK;
1523         infof(data, "Hostname '%s' was found in DNS cache\n", hostname);
1524       }
1525
1526       if(!dns)
1527         result = Curl_resolv_check(data->easy_conn, &dns);
1528
1529       /* Update sockets here, because the socket(s) may have been
1530          closed and the application thus needs to be told, even if it
1531          is likely that the same socket(s) will again be used further
1532          down.  If the name has not yet been resolved, it is likely
1533          that new sockets have been opened in an attempt to contact
1534          another resolver. */
1535       singlesocket(multi, data);
1536
1537       if(dns) {
1538         /* Perform the next step in the connection phase, and then move on
1539            to the WAITCONNECT state */
1540         result = Curl_once_resolved(data->easy_conn, &protocol_connect);
1541
1542         if(result)
1543           /* if Curl_once_resolved() returns failure, the connection struct
1544              is already freed and gone */
1545           data->easy_conn = NULL;           /* no more connection */
1546         else {
1547           /* call again please so that we get the next socket setup */
1548           rc = CURLM_CALL_MULTI_PERFORM;
1549           if(protocol_connect)
1550             multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1551                        CURLM_STATE_WAITDO:CURLM_STATE_DO);
1552           else {
1553 #ifndef CURL_DISABLE_HTTP
1554             if(Curl_connect_ongoing(data->easy_conn))
1555               multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1556             else
1557 #endif
1558               multistate(data, CURLM_STATE_WAITCONNECT);
1559           }
1560         }
1561       }
1562
1563       if(result) {
1564         /* failure detected */
1565         stream_error = TRUE;
1566         break;
1567       }
1568     }
1569     break;
1570
1571 #ifndef CURL_DISABLE_HTTP
1572     case CURLM_STATE_WAITPROXYCONNECT:
1573       /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
1574       result = Curl_http_connect(data->easy_conn, &protocol_connect);
1575
1576       if(data->easy_conn->bits.proxy_connect_closed) {
1577         rc = CURLM_CALL_MULTI_PERFORM;
1578         /* connect back to proxy again */
1579         result = CURLE_OK;
1580         multi_done(&data->easy_conn, CURLE_OK, FALSE);
1581         multistate(data, CURLM_STATE_CONNECT);
1582       }
1583       else if(!result) {
1584         if((data->easy_conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
1585            data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
1586            Curl_connect_complete(data->easy_conn)) {
1587           rc = CURLM_CALL_MULTI_PERFORM;
1588           /* initiate protocol connect phase */
1589           multistate(data, CURLM_STATE_SENDPROTOCONNECT);
1590         }
1591       }
1592       else if(result)
1593         stream_error = TRUE;
1594       break;
1595 #endif
1596
1597     case CURLM_STATE_WAITCONNECT:
1598       /* awaiting a completion of an asynch TCP connect */
1599       result = Curl_is_connected(data->easy_conn, FIRSTSOCKET, &connected);
1600       if(connected && !result) {
1601 #ifndef CURL_DISABLE_HTTP
1602         if((data->easy_conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
1603             !data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
1604            Curl_connect_ongoing(data->easy_conn)) {
1605           multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1606           break;
1607         }
1608 #endif
1609         rc = CURLM_CALL_MULTI_PERFORM;
1610         multistate(data, data->easy_conn->bits.tunnel_proxy?
1611                    CURLM_STATE_WAITPROXYCONNECT:
1612                    CURLM_STATE_SENDPROTOCONNECT);
1613       }
1614       else if(result) {
1615         /* failure detected */
1616         /* Just break, the cleaning up is handled all in one place */
1617         stream_error = TRUE;
1618         break;
1619       }
1620       break;
1621
1622     case CURLM_STATE_SENDPROTOCONNECT:
1623       result = Curl_protocol_connect(data->easy_conn, &protocol_connect);
1624       if(!result && !protocol_connect)
1625         /* switch to waiting state */
1626         multistate(data, CURLM_STATE_PROTOCONNECT);
1627       else if(!result) {
1628         /* protocol connect has completed, go WAITDO or DO */
1629         multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1630                    CURLM_STATE_WAITDO:CURLM_STATE_DO);
1631         rc = CURLM_CALL_MULTI_PERFORM;
1632       }
1633       else if(result) {
1634         /* failure detected */
1635         Curl_posttransfer(data);
1636         multi_done(&data->easy_conn, result, TRUE);
1637         stream_error = TRUE;
1638       }
1639       break;
1640
1641     case CURLM_STATE_PROTOCONNECT:
1642       /* protocol-specific connect phase */
1643       result = Curl_protocol_connecting(data->easy_conn, &protocol_connect);
1644       if(!result && protocol_connect) {
1645         /* after the connect has completed, go WAITDO or DO */
1646         multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1647                    CURLM_STATE_WAITDO:CURLM_STATE_DO);
1648         rc = CURLM_CALL_MULTI_PERFORM;
1649       }
1650       else if(result) {
1651         /* failure detected */
1652         Curl_posttransfer(data);
1653         multi_done(&data->easy_conn, result, TRUE);
1654         stream_error = TRUE;
1655       }
1656       break;
1657
1658     case CURLM_STATE_WAITDO:
1659       /* Wait for our turn to DO when we're pipelining requests */
1660       if(Curl_pipeline_checkget_write(data, data->easy_conn)) {
1661         /* Grabbed the channel */
1662         multistate(data, CURLM_STATE_DO);
1663         rc = CURLM_CALL_MULTI_PERFORM;
1664       }
1665       break;
1666
1667     case CURLM_STATE_DO:
1668       if(data->set.connect_only) {
1669         /* keep connection open for application to use the socket */
1670         connkeep(data->easy_conn, "CONNECT_ONLY");
1671         multistate(data, CURLM_STATE_DONE);
1672         result = CURLE_OK;
1673         rc = CURLM_CALL_MULTI_PERFORM;
1674       }
1675       else {
1676         /* Perform the protocol's DO action */
1677         result = multi_do(&data->easy_conn, &dophase_done);
1678
1679         /* When multi_do() returns failure, data->easy_conn might be NULL! */
1680
1681         if(!result) {
1682           if(!dophase_done) {
1683             /* some steps needed for wildcard matching */
1684             if(data->state.wildcardmatch) {
1685               struct WildcardData *wc = &data->wildcard;
1686               if(wc->state == CURLWC_DONE || wc->state == CURLWC_SKIP) {
1687                 /* skip some states if it is important */
1688                 multi_done(&data->easy_conn, CURLE_OK, FALSE);
1689                 multistate(data, CURLM_STATE_DONE);
1690                 rc = CURLM_CALL_MULTI_PERFORM;
1691                 break;
1692               }
1693             }
1694             /* DO was not completed in one function call, we must continue
1695                DOING... */
1696             multistate(data, CURLM_STATE_DOING);
1697             rc = CURLM_OK;
1698           }
1699
1700           /* after DO, go DO_DONE... or DO_MORE */
1701           else if(data->easy_conn->bits.do_more) {
1702             /* we're supposed to do more, but we need to sit down, relax
1703                and wait a little while first */
1704             multistate(data, CURLM_STATE_DO_MORE);
1705             rc = CURLM_OK;
1706           }
1707           else {
1708             /* we're done with the DO, now DO_DONE */
1709             multistate(data, CURLM_STATE_DO_DONE);
1710             rc = CURLM_CALL_MULTI_PERFORM;
1711           }
1712         }
1713         else if((CURLE_SEND_ERROR == result) &&
1714                 data->easy_conn->bits.reuse) {
1715           /*
1716            * In this situation, a connection that we were trying to use
1717            * may have unexpectedly died.  If possible, send the connection
1718            * back to the CONNECT phase so we can try again.
1719            */
1720           char *newurl = NULL;
1721           followtype follow = FOLLOW_NONE;
1722           CURLcode drc;
1723
1724           drc = Curl_retry_request(data->easy_conn, &newurl);
1725           if(drc) {
1726             /* a failure here pretty much implies an out of memory */
1727             result = drc;
1728             stream_error = TRUE;
1729           }
1730
1731           Curl_posttransfer(data);
1732           drc = multi_done(&data->easy_conn, result, FALSE);
1733
1734           /* When set to retry the connection, we must to go back to
1735            * the CONNECT state */
1736           if(newurl) {
1737             if(!drc || (drc == CURLE_SEND_ERROR)) {
1738               follow = FOLLOW_RETRY;
1739               drc = Curl_follow(data, newurl, follow);
1740               if(!drc) {
1741                 multistate(data, CURLM_STATE_CONNECT);
1742                 rc = CURLM_CALL_MULTI_PERFORM;
1743                 result = CURLE_OK;
1744               }
1745               else {
1746                 /* Follow failed */
1747                 result = drc;
1748               }
1749             }
1750             else {
1751               /* done didn't return OK or SEND_ERROR */
1752               result = drc;
1753             }
1754           }
1755           else {
1756             /* Have error handler disconnect conn if we can't retry */
1757             stream_error = TRUE;
1758           }
1759           free(newurl);
1760         }
1761         else {
1762           /* failure detected */
1763           Curl_posttransfer(data);
1764           if(data->easy_conn)
1765             multi_done(&data->easy_conn, result, FALSE);
1766           stream_error = TRUE;
1767         }
1768       }
1769       break;
1770
1771     case CURLM_STATE_DOING:
1772       /* we continue DOING until the DO phase is complete */
1773       result = Curl_protocol_doing(data->easy_conn,
1774                                    &dophase_done);
1775       if(!result) {
1776         if(dophase_done) {
1777           /* after DO, go DO_DONE or DO_MORE */
1778           multistate(data, data->easy_conn->bits.do_more?
1779                      CURLM_STATE_DO_MORE:
1780                      CURLM_STATE_DO_DONE);
1781           rc = CURLM_CALL_MULTI_PERFORM;
1782         } /* dophase_done */
1783       }
1784       else {
1785         /* failure detected */
1786         Curl_posttransfer(data);
1787         multi_done(&data->easy_conn, result, FALSE);
1788         stream_error = TRUE;
1789       }
1790       break;
1791
1792     case CURLM_STATE_DO_MORE:
1793       /*
1794        * When we are connected, DO MORE and then go DO_DONE
1795        */
1796       result = multi_do_more(data->easy_conn, &control);
1797
1798       /* No need to remove this handle from the send pipeline here since that
1799          is done in multi_done() */
1800       if(!result) {
1801         if(control) {
1802           /* if positive, advance to DO_DONE
1803              if negative, go back to DOING */
1804           multistate(data, control == 1?
1805                      CURLM_STATE_DO_DONE:
1806                      CURLM_STATE_DOING);
1807           rc = CURLM_CALL_MULTI_PERFORM;
1808         }
1809         else
1810           /* stay in DO_MORE */
1811           rc = CURLM_OK;
1812       }
1813       else {
1814         /* failure detected */
1815         Curl_posttransfer(data);
1816         multi_done(&data->easy_conn, result, FALSE);
1817         stream_error = TRUE;
1818       }
1819       break;
1820
1821     case CURLM_STATE_DO_DONE:
1822       /* Move ourselves from the send to recv pipeline */
1823       Curl_move_handle_from_send_to_recv_pipe(data, data->easy_conn);
1824
1825       if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
1826         /* Check if we can move pending requests to send pipe */
1827         process_pending_handles(multi); /*  pipelined/multiplexed */
1828
1829       /* Only perform the transfer if there's a good socket to work with.
1830          Having both BAD is a signal to skip immediately to DONE */
1831       if((data->easy_conn->sockfd != CURL_SOCKET_BAD) ||
1832          (data->easy_conn->writesockfd != CURL_SOCKET_BAD))
1833         multistate(data, CURLM_STATE_WAITPERFORM);
1834       else {
1835         if(data->state.wildcardmatch &&
1836            ((data->easy_conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
1837            data->wildcard.state = CURLWC_DONE;
1838         }
1839         multistate(data, CURLM_STATE_DONE);
1840       }
1841       rc = CURLM_CALL_MULTI_PERFORM;
1842       break;
1843
1844     case CURLM_STATE_WAITPERFORM:
1845       /* Wait for our turn to PERFORM */
1846       if(Curl_pipeline_checkget_read(data, data->easy_conn)) {
1847         /* Grabbed the channel */
1848         multistate(data, CURLM_STATE_PERFORM);
1849         rc = CURLM_CALL_MULTI_PERFORM;
1850       }
1851       break;
1852
1853     case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */
1854       /* if both rates are within spec, resume transfer */
1855       if(Curl_pgrsUpdate(data->easy_conn))
1856         result = CURLE_ABORTED_BY_CALLBACK;
1857       else
1858         result = Curl_speedcheck(data, now);
1859
1860       if(!result) {
1861         send_timeout_ms = 0;
1862         if(data->set.max_send_speed > 0)
1863           send_timeout_ms =
1864             Curl_pgrsLimitWaitTime(data->progress.uploaded,
1865                                    data->progress.ul_limit_size,
1866                                    data->set.max_send_speed,
1867                                    data->progress.ul_limit_start,
1868                                    now);
1869
1870         recv_timeout_ms = 0;
1871         if(data->set.max_recv_speed > 0)
1872           recv_timeout_ms =
1873             Curl_pgrsLimitWaitTime(data->progress.downloaded,
1874                                    data->progress.dl_limit_size,
1875                                    data->set.max_recv_speed,
1876                                    data->progress.dl_limit_start,
1877                                    now);
1878
1879         if(!send_timeout_ms && !recv_timeout_ms) {
1880           multistate(data, CURLM_STATE_PERFORM);
1881           Curl_ratelimit(data, now);
1882         }
1883         else if(send_timeout_ms >= recv_timeout_ms)
1884           Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
1885         else
1886           Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
1887       }
1888       break;
1889
1890     case CURLM_STATE_PERFORM:
1891     {
1892       char *newurl = NULL;
1893       bool retry = FALSE;
1894       bool comeback = FALSE;
1895
1896       /* check if over send speed */
1897       send_timeout_ms = 0;
1898       if(data->set.max_send_speed > 0)
1899         send_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.uploaded,
1900                                                  data->progress.ul_limit_size,
1901                                                  data->set.max_send_speed,
1902                                                  data->progress.ul_limit_start,
1903                                                  now);
1904
1905       /* check if over recv speed */
1906       recv_timeout_ms = 0;
1907       if(data->set.max_recv_speed > 0)
1908         recv_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.downloaded,
1909                                                  data->progress.dl_limit_size,
1910                                                  data->set.max_recv_speed,
1911                                                  data->progress.dl_limit_start,
1912                                                  now);
1913
1914       if(send_timeout_ms || recv_timeout_ms) {
1915         Curl_ratelimit(data, now);
1916         multistate(data, CURLM_STATE_TOOFAST);
1917         if(send_timeout_ms >= recv_timeout_ms)
1918           Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
1919         else
1920           Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
1921         break;
1922       }
1923
1924       /* read/write data if it is ready to do so */
1925       result = Curl_readwrite(data->easy_conn, data, &done, &comeback);
1926
1927       k = &data->req;
1928
1929       if(!(k->keepon & KEEP_RECV))
1930         /* We're done receiving */
1931         Curl_pipeline_leave_read(data->easy_conn);
1932
1933       if(!(k->keepon & KEEP_SEND))
1934         /* We're done sending */
1935         Curl_pipeline_leave_write(data->easy_conn);
1936
1937       if(done || (result == CURLE_RECV_ERROR)) {
1938         /* If CURLE_RECV_ERROR happens early enough, we assume it was a race
1939          * condition and the server closed the re-used connection exactly when
1940          * we wanted to use it, so figure out if that is indeed the case.
1941          */
1942         CURLcode ret = Curl_retry_request(data->easy_conn, &newurl);
1943         if(!ret)
1944           retry = (newurl)?TRUE:FALSE;
1945         else if(!result)
1946           result = ret;
1947
1948         if(retry) {
1949           /* if we are to retry, set the result to OK and consider the
1950              request as done */
1951           result = CURLE_OK;
1952           done = TRUE;
1953         }
1954       }
1955
1956       if(result) {
1957         /*
1958          * The transfer phase returned error, we mark the connection to get
1959          * closed to prevent being re-used. This is because we can't possibly
1960          * know if the connection is in a good shape or not now.  Unless it is
1961          * a protocol which uses two "channels" like FTP, as then the error
1962          * happened in the data connection.
1963          */
1964
1965         if(!(data->easy_conn->handler->flags & PROTOPT_DUAL) &&
1966            result != CURLE_HTTP2_STREAM)
1967           streamclose(data->easy_conn, "Transfer returned error");
1968
1969         Curl_posttransfer(data);
1970         multi_done(&data->easy_conn, result, TRUE);
1971       }
1972       else if(done) {
1973         followtype follow = FOLLOW_NONE;
1974
1975         /* call this even if the readwrite function returned error */
1976         Curl_posttransfer(data);
1977
1978         /* we're no longer receiving */
1979         Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
1980
1981         /* expire the new receiving pipeline head */
1982         if(data->easy_conn->recv_pipe.head)
1983           Curl_expire(data->easy_conn->recv_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
1984
1985         /* When we follow redirects or is set to retry the connection, we must
1986            to go back to the CONNECT state */
1987         if(data->req.newurl || retry) {
1988           if(!retry) {
1989             /* if the URL is a follow-location and not just a retried request
1990                then figure out the URL here */
1991             free(newurl);
1992             newurl = data->req.newurl;
1993             data->req.newurl = NULL;
1994             follow = FOLLOW_REDIR;
1995           }
1996           else
1997             follow = FOLLOW_RETRY;
1998           result = multi_done(&data->easy_conn, CURLE_OK, FALSE);
1999           if(!result) {
2000             result = Curl_follow(data, newurl, follow);
2001             if(!result) {
2002               multistate(data, CURLM_STATE_CONNECT);
2003               rc = CURLM_CALL_MULTI_PERFORM;
2004             }
2005           }
2006           free(newurl);
2007         }
2008         else {
2009           /* after the transfer is done, go DONE */
2010
2011           /* but first check to see if we got a location info even though we're
2012              not following redirects */
2013           if(data->req.location) {
2014             free(newurl);
2015             newurl = data->req.location;
2016             data->req.location = NULL;
2017             result = Curl_follow(data, newurl, FOLLOW_FAKE);
2018             free(newurl);
2019             if(result) {
2020               stream_error = TRUE;
2021               result = multi_done(&data->easy_conn, result, TRUE);
2022             }
2023           }
2024
2025           if(!result) {
2026             multistate(data, CURLM_STATE_DONE);
2027             rc = CURLM_CALL_MULTI_PERFORM;
2028           }
2029         }
2030       }
2031       else if(comeback)
2032         rc = CURLM_CALL_MULTI_PERFORM;
2033       break;
2034     }
2035
2036     case CURLM_STATE_DONE:
2037       /* this state is highly transient, so run another loop after this */
2038       rc = CURLM_CALL_MULTI_PERFORM;
2039
2040       if(data->easy_conn) {
2041         CURLcode res;
2042
2043         /* Remove ourselves from the receive pipeline, if we are there. */
2044         Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
2045
2046         if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
2047           /* Check if we can move pending requests to connection */
2048           process_pending_handles(multi); /* pipelined/multiplexing */
2049
2050         /* post-transfer command */
2051         res = multi_done(&data->easy_conn, result, FALSE);
2052
2053         /* allow a previously set error code take precedence */
2054         if(!result)
2055           result = res;
2056
2057         /*
2058          * If there are other handles on the pipeline, multi_done won't set
2059          * easy_conn to NULL.  In such a case, curl_multi_remove_handle() can
2060          * access free'd data, if the connection is free'd and the handle
2061          * removed before we perform the processing in CURLM_STATE_COMPLETED
2062          */
2063         if(data->easy_conn)
2064           data->easy_conn = NULL;
2065       }
2066
2067       if(data->state.wildcardmatch) {
2068         if(data->wildcard.state != CURLWC_DONE) {
2069           /* if a wildcard is set and we are not ending -> lets start again
2070              with CURLM_STATE_INIT */
2071           multistate(data, CURLM_STATE_INIT);
2072           break;
2073         }
2074       }
2075
2076       /* after we have DONE what we're supposed to do, go COMPLETED, and
2077          it doesn't matter what the multi_done() returned! */
2078       multistate(data, CURLM_STATE_COMPLETED);
2079       break;
2080
2081     case CURLM_STATE_COMPLETED:
2082       break;
2083
2084     case CURLM_STATE_MSGSENT:
2085       data->result = result;
2086       return CURLM_OK; /* do nothing */
2087
2088     default:
2089       return CURLM_INTERNAL_ERROR;
2090     }
2091     statemachine_end:
2092
2093     if(data->mstate < CURLM_STATE_COMPLETED) {
2094       if(result) {
2095         /*
2096          * If an error was returned, and we aren't in completed state now,
2097          * then we go to completed and consider this transfer aborted.
2098          */
2099
2100         /* NOTE: no attempt to disconnect connections must be made
2101            in the case blocks above - cleanup happens only here */
2102
2103         /* Check if we can move pending requests to send pipe */
2104         process_pending_handles(multi); /* connection */
2105
2106         if(data->easy_conn) {
2107           /* if this has a connection, unsubscribe from the pipelines */
2108           Curl_pipeline_leave_write(data->easy_conn);
2109           Curl_pipeline_leave_read(data->easy_conn);
2110           Curl_removeHandleFromPipeline(data, &data->easy_conn->send_pipe);
2111           Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
2112
2113           if(stream_error) {
2114             /* Don't attempt to send data over a connection that timed out */
2115             bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
2116             /* disconnect properly */
2117             Curl_disconnect(data, data->easy_conn, dead_connection);
2118
2119             /* This is where we make sure that the easy_conn pointer is reset.
2120                We don't have to do this in every case block above where a
2121                failure is detected */
2122             data->easy_conn = NULL;
2123           }
2124         }
2125         else if(data->mstate == CURLM_STATE_CONNECT) {
2126           /* Curl_connect() failed */
2127           (void)Curl_posttransfer(data);
2128         }
2129
2130         multistate(data, CURLM_STATE_COMPLETED);
2131         rc = CURLM_CALL_MULTI_PERFORM;
2132       }
2133       /* if there's still a connection to use, call the progress function */
2134       else if(data->easy_conn && Curl_pgrsUpdate(data->easy_conn)) {
2135         /* aborted due to progress callback return code must close the
2136            connection */
2137         result = CURLE_ABORTED_BY_CALLBACK;
2138         streamclose(data->easy_conn, "Aborted by callback");
2139
2140         /* if not yet in DONE state, go there, otherwise COMPLETED */
2141         multistate(data, (data->mstate < CURLM_STATE_DONE)?
2142                    CURLM_STATE_DONE: CURLM_STATE_COMPLETED);
2143         rc = CURLM_CALL_MULTI_PERFORM;
2144       }
2145     }
2146
2147     if(CURLM_STATE_COMPLETED == data->mstate) {
2148       if(data->set.fmultidone) {
2149         /* signal via callback instead */
2150         data->set.fmultidone(data, result);
2151       }
2152       else {
2153         /* now fill in the Curl_message with this info */
2154         msg = &data->msg;
2155
2156         msg->extmsg.msg = CURLMSG_DONE;
2157         msg->extmsg.easy_handle = data;
2158         msg->extmsg.data.result = result;
2159
2160         rc = multi_addmsg(multi, msg);
2161         DEBUGASSERT(!data->easy_conn);
2162       }
2163       multistate(data, CURLM_STATE_MSGSENT);
2164     }
2165   } while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE));
2166
2167   data->result = result;
2168   return rc;
2169 }
2170
2171
2172 CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
2173 {
2174   struct Curl_easy *data;
2175   CURLMcode returncode = CURLM_OK;
2176   struct Curl_tree *t;
2177   struct curltime now = Curl_now();
2178
2179   if(!GOOD_MULTI_HANDLE(multi))
2180     return CURLM_BAD_HANDLE;
2181
2182   if(multi->in_callback)
2183     return CURLM_RECURSIVE_API_CALL;
2184
2185   data = multi->easyp;
2186   while(data) {
2187     CURLMcode result;
2188     SIGPIPE_VARIABLE(pipe_st);
2189
2190     sigpipe_ignore(data, &pipe_st);
2191     result = multi_runsingle(multi, now, data);
2192     sigpipe_restore(&pipe_st);
2193
2194     if(result)
2195       returncode = result;
2196
2197     data = data->next; /* operate on next handle */
2198   }
2199
2200   /*
2201    * Simply remove all expired timers from the splay since handles are dealt
2202    * with unconditionally by this function and curl_multi_timeout() requires
2203    * that already passed/handled expire times are removed from the splay.
2204    *
2205    * It is important that the 'now' value is set at the entry of this function
2206    * and not for the current time as it may have ticked a little while since
2207    * then and then we risk this loop to remove timers that actually have not
2208    * been handled!
2209    */
2210   do {
2211     multi->timetree = Curl_splaygetbest(now, multi->timetree, &t);
2212     if(t)
2213       /* the removed may have another timeout in queue */
2214       (void)add_next_timeout(now, multi, t->payload);
2215
2216   } while(t);
2217
2218   *running_handles = multi->num_alive;
2219
2220   if(CURLM_OK >= returncode)
2221     update_timer(multi);
2222
2223   return returncode;
2224 }
2225
2226 CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
2227 {
2228   struct Curl_easy *data;
2229   struct Curl_easy *nextdata;
2230
2231   if(GOOD_MULTI_HANDLE(multi)) {
2232     if(multi->in_callback)
2233       return CURLM_RECURSIVE_API_CALL;
2234
2235     multi->type = 0; /* not good anymore */
2236
2237     /* Firsrt remove all remaining easy handles */
2238     data = multi->easyp;
2239     while(data) {
2240       nextdata = data->next;
2241       if(!data->state.done && data->easy_conn)
2242         /* if DONE was never called for this handle */
2243         (void)multi_done(&data->easy_conn, CURLE_OK, TRUE);
2244       if(data->dns.hostcachetype == HCACHE_MULTI) {
2245         /* clear out the usage of the shared DNS cache */
2246         Curl_hostcache_clean(data, data->dns.hostcache);
2247         data->dns.hostcache = NULL;
2248         data->dns.hostcachetype = HCACHE_NONE;
2249       }
2250
2251       /* Clear the pointer to the connection cache */
2252       data->state.conn_cache = NULL;
2253       data->multi = NULL; /* clear the association */
2254
2255 #ifdef USE_LIBPSL
2256       if(data->psl == &multi->psl)
2257         data->psl = NULL;
2258 #endif
2259
2260       data = nextdata;
2261     }
2262
2263     /* Close all the connections in the connection cache */
2264     Curl_conncache_close_all_connections(&multi->conn_cache);
2265
2266     Curl_hash_destroy(&multi->sockhash);
2267     Curl_conncache_destroy(&multi->conn_cache);
2268     Curl_llist_destroy(&multi->msglist, NULL);
2269     Curl_llist_destroy(&multi->pending, NULL);
2270
2271     Curl_hash_destroy(&multi->hostcache);
2272     Curl_psl_destroy(&multi->psl);
2273
2274     /* Free the blacklists by setting them to NULL */
2275     Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl);
2276     Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl);
2277
2278     free(multi);
2279
2280     return CURLM_OK;
2281   }
2282   return CURLM_BAD_HANDLE;
2283 }
2284
2285 /*
2286  * curl_multi_info_read()
2287  *
2288  * This function is the primary way for a multi/multi_socket application to
2289  * figure out if a transfer has ended. We MUST make this function as fast as
2290  * possible as it will be polled frequently and we MUST NOT scan any lists in
2291  * here to figure out things. We must scale fine to thousands of handles and
2292  * beyond. The current design is fully O(1).
2293  */
2294
2295 CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
2296 {
2297   struct Curl_message *msg;
2298
2299   *msgs_in_queue = 0; /* default to none */
2300
2301   if(GOOD_MULTI_HANDLE(multi) &&
2302      !multi->in_callback &&
2303      Curl_llist_count(&multi->msglist)) {
2304     /* there is one or more messages in the list */
2305     struct curl_llist_element *e;
2306
2307     /* extract the head of the list to return */
2308     e = multi->msglist.head;
2309
2310     msg = e->ptr;
2311
2312     /* remove the extracted entry */
2313     Curl_llist_remove(&multi->msglist, e, NULL);
2314
2315     *msgs_in_queue = curlx_uztosi(Curl_llist_count(&multi->msglist));
2316
2317     return &msg->extmsg;
2318   }
2319   return NULL;
2320 }
2321
2322 /*
2323  * singlesocket() checks what sockets we deal with and their "action state"
2324  * and if we have a different state in any of those sockets from last time we
2325  * call the callback accordingly.
2326  */
2327 static CURLMcode singlesocket(struct Curl_multi *multi,
2328                               struct Curl_easy *data)
2329 {
2330   curl_socket_t socks[MAX_SOCKSPEREASYHANDLE];
2331   int i;
2332   struct Curl_sh_entry *entry;
2333   curl_socket_t s;
2334   int num;
2335   unsigned int curraction;
2336
2337   for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
2338     socks[i] = CURL_SOCKET_BAD;
2339
2340   /* Fill in the 'current' struct with the state as it is now: what sockets to
2341      supervise and for what actions */
2342   curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
2343
2344   /* We have 0 .. N sockets already and we get to know about the 0 .. M
2345      sockets we should have from now on. Detect the differences, remove no
2346      longer supervised ones and add new ones */
2347
2348   /* walk over the sockets we got right now */
2349   for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
2350         (curraction & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i)));
2351       i++) {
2352     int action = CURL_POLL_NONE;
2353
2354     s = socks[i];
2355
2356     /* get it from the hash */
2357     entry = sh_getentry(&multi->sockhash, s);
2358
2359     if(curraction & GETSOCK_READSOCK(i))
2360       action |= CURL_POLL_IN;
2361     if(curraction & GETSOCK_WRITESOCK(i))
2362       action |= CURL_POLL_OUT;
2363
2364     if(entry) {
2365       /* yeps, already present so check if it has the same action set */
2366       if(entry->action == action)
2367         /* same, continue */
2368         continue;
2369     }
2370     else {
2371       /* this is a socket we didn't have before, add it! */
2372       entry = sh_addentry(&multi->sockhash, s, data);
2373       if(!entry)
2374         /* fatal */
2375         return CURLM_OUT_OF_MEMORY;
2376     }
2377
2378     /* we know (entry != NULL) at this point, see the logic above */
2379     if(multi->socket_cb)
2380       multi->socket_cb(data,
2381                        s,
2382                        action,
2383                        multi->socket_userp,
2384                        entry->socketp);
2385
2386     entry->action = action; /* store the current action state */
2387   }
2388
2389   num = i; /* number of sockets */
2390
2391   /* when we've walked over all the sockets we should have right now, we must
2392      make sure to detect sockets that are removed */
2393   for(i = 0; i< data->numsocks; i++) {
2394     int j;
2395     s = data->sockets[i];
2396     for(j = 0; j<num; j++) {
2397       if(s == socks[j]) {
2398         /* this is still supervised */
2399         s = CURL_SOCKET_BAD;
2400         break;
2401       }
2402     }
2403
2404     entry = sh_getentry(&multi->sockhash, s);
2405     if(entry) {
2406       /* this socket has been removed. Tell the app to remove it */
2407       bool remove_sock_from_hash = TRUE;
2408
2409       /* check if the socket to be removed serves a connection which has
2410          other easy-s in a pipeline. In this case the socket should not be
2411          removed. */
2412       struct connectdata *easy_conn = data->easy_conn;
2413       if(easy_conn) {
2414         if(easy_conn->recv_pipe.size > 1) {
2415           /* the handle should not be removed from the pipe yet */
2416           remove_sock_from_hash = FALSE;
2417
2418           /* Update the sockhash entry to instead point to the next in line
2419              for the recv_pipe, or the first (in case this particular easy
2420              isn't already) */
2421           if(entry->easy == data) {
2422             if(Curl_recvpipe_head(data, easy_conn))
2423               entry->easy = easy_conn->recv_pipe.head->next->ptr;
2424             else
2425               entry->easy = easy_conn->recv_pipe.head->ptr;
2426           }
2427         }
2428         if(easy_conn->send_pipe.size > 1) {
2429           /* the handle should not be removed from the pipe yet */
2430           remove_sock_from_hash = FALSE;
2431
2432           /* Update the sockhash entry to instead point to the next in line
2433              for the send_pipe, or the first (in case this particular easy
2434              isn't already) */
2435           if(entry->easy == data) {
2436             if(Curl_sendpipe_head(data, easy_conn))
2437               entry->easy = easy_conn->send_pipe.head->next->ptr;
2438             else
2439               entry->easy = easy_conn->send_pipe.head->ptr;
2440           }
2441         }
2442         /* Don't worry about overwriting recv_pipe head with send_pipe_head,
2443            when action will be asked on the socket (see multi_socket()), the
2444            head of the correct pipe will be taken according to the
2445            action. */
2446       }
2447
2448       if(remove_sock_from_hash) {
2449         /* in this case 'entry' is always non-NULL */
2450         if(multi->socket_cb)
2451           multi->socket_cb(data,
2452                            s,
2453                            CURL_POLL_REMOVE,
2454                            multi->socket_userp,
2455                            entry->socketp);
2456         sh_delentry(&multi->sockhash, s);
2457       }
2458     } /* if sockhash entry existed */
2459   } /* for loop over numsocks */
2460
2461   memcpy(data->sockets, socks, num*sizeof(curl_socket_t));
2462   data->numsocks = num;
2463   return CURLM_OK;
2464 }
2465
2466 void Curl_updatesocket(struct Curl_easy *data)
2467 {
2468   singlesocket(data->multi, data);
2469 }
2470
2471
2472 /*
2473  * Curl_multi_closed()
2474  *
2475  * Used by the connect code to tell the multi_socket code that one of the
2476  * sockets we were using is about to be closed.  This function will then
2477  * remove it from the sockethash for this handle to make the multi_socket API
2478  * behave properly, especially for the case when libcurl will create another
2479  * socket again and it gets the same file descriptor number.
2480  */
2481
2482 void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
2483 {
2484   if(conn->data) {
2485     /* if there's still an easy handle associated with this connection */
2486     struct Curl_multi *multi = conn->data->multi;
2487     if(multi) {
2488       /* this is set if this connection is part of a handle that is added to
2489          a multi handle, and only then this is necessary */
2490       struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
2491
2492       if(entry) {
2493         if(multi->socket_cb)
2494           multi->socket_cb(conn->data, s, CURL_POLL_REMOVE,
2495                            multi->socket_userp,
2496                            entry->socketp);
2497
2498         /* now remove it from the socket hash */
2499         sh_delentry(&multi->sockhash, s);
2500       }
2501     }
2502   }
2503 }
2504
2505 /*
2506  * add_next_timeout()
2507  *
2508  * Each Curl_easy has a list of timeouts. The add_next_timeout() is called
2509  * when it has just been removed from the splay tree because the timeout has
2510  * expired. This function is then to advance in the list to pick the next
2511  * timeout to use (skip the already expired ones) and add this node back to
2512  * the splay tree again.
2513  *
2514  * The splay tree only has each sessionhandle as a single node and the nearest
2515  * timeout is used to sort it on.
2516  */
2517 static CURLMcode add_next_timeout(struct curltime now,
2518                                   struct Curl_multi *multi,
2519                                   struct Curl_easy *d)
2520 {
2521   struct curltime *tv = &d->state.expiretime;
2522   struct curl_llist *list = &d->state.timeoutlist;
2523   struct curl_llist_element *e;
2524   struct time_node *node = NULL;
2525
2526   /* move over the timeout list for this specific handle and remove all
2527      timeouts that are now passed tense and store the next pending
2528      timeout in *tv */
2529   for(e = list->head; e;) {
2530     struct curl_llist_element *n = e->next;
2531     timediff_t diff;
2532     node = (struct time_node *)e->ptr;
2533     diff = Curl_timediff(node->time, now);
2534     if(diff <= 0)
2535       /* remove outdated entry */
2536       Curl_llist_remove(list, e, NULL);
2537     else
2538       /* the list is sorted so get out on the first mismatch */
2539       break;
2540     e = n;
2541   }
2542   e = list->head;
2543   if(!e) {
2544     /* clear the expire times within the handles that we remove from the
2545        splay tree */
2546     tv->tv_sec = 0;
2547     tv->tv_usec = 0;
2548   }
2549   else {
2550     /* copy the first entry to 'tv' */
2551     memcpy(tv, &node->time, sizeof(*tv));
2552
2553     /* Insert this node again into the splay.  Keep the timer in the list in
2554        case we need to recompute future timers. */
2555     multi->timetree = Curl_splayinsert(*tv, multi->timetree,
2556                                        &d->state.timenode);
2557   }
2558   return CURLM_OK;
2559 }
2560
2561 static CURLMcode multi_socket(struct Curl_multi *multi,
2562                               bool checkall,
2563                               curl_socket_t s,
2564                               int ev_bitmask,
2565                               int *running_handles)
2566 {
2567   CURLMcode result = CURLM_OK;
2568   struct Curl_easy *data = NULL;
2569   struct Curl_tree *t;
2570   struct curltime now = Curl_now();
2571
2572   if(checkall) {
2573     /* *perform() deals with running_handles on its own */
2574     result = curl_multi_perform(multi, running_handles);
2575
2576     /* walk through each easy handle and do the socket state change magic
2577        and callbacks */
2578     if(result != CURLM_BAD_HANDLE) {
2579       data = multi->easyp;
2580       while(data && !result) {
2581         result = singlesocket(multi, data);
2582         data = data->next;
2583       }
2584     }
2585
2586     /* or should we fall-through and do the timer-based stuff? */
2587     return result;
2588   }
2589   if(s != CURL_SOCKET_TIMEOUT) {
2590
2591     struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
2592
2593     if(!entry)
2594       /* Unmatched socket, we can't act on it but we ignore this fact.  In
2595          real-world tests it has been proved that libevent can in fact give
2596          the application actions even though the socket was just previously
2597          asked to get removed, so thus we better survive stray socket actions
2598          and just move on. */
2599       ;
2600     else {
2601       SIGPIPE_VARIABLE(pipe_st);
2602
2603       data = entry->easy;
2604
2605       if(data->magic != CURLEASY_MAGIC_NUMBER)
2606         /* bad bad bad bad bad bad bad */
2607         return CURLM_INTERNAL_ERROR;
2608
2609       /* If the pipeline is enabled, take the handle which is in the head of
2610          the pipeline. If we should write into the socket, take the send_pipe
2611          head.  If we should read from the socket, take the recv_pipe head. */
2612       if(data->easy_conn) {
2613         if((ev_bitmask & CURL_POLL_OUT) &&
2614            data->easy_conn->send_pipe.head)
2615           data = data->easy_conn->send_pipe.head->ptr;
2616         else if((ev_bitmask & CURL_POLL_IN) &&
2617                 data->easy_conn->recv_pipe.head)
2618           data = data->easy_conn->recv_pipe.head->ptr;
2619       }
2620
2621       if(data->easy_conn &&
2622          !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
2623         /* set socket event bitmask if they're not locked */
2624         data->easy_conn->cselect_bits = ev_bitmask;
2625
2626       sigpipe_ignore(data, &pipe_st);
2627       result = multi_runsingle(multi, now, data);
2628       sigpipe_restore(&pipe_st);
2629
2630       if(data->easy_conn &&
2631          !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
2632         /* clear the bitmask only if not locked */
2633         data->easy_conn->cselect_bits = 0;
2634
2635       if(CURLM_OK >= result) {
2636         /* get the socket(s) and check if the state has been changed since
2637            last */
2638         result = singlesocket(multi, data);
2639         if(result)
2640           return result;
2641       }
2642
2643       /* Now we fall-through and do the timer-based stuff, since we don't want
2644          to force the user to have to deal with timeouts as long as at least
2645          one connection in fact has traffic. */
2646
2647       data = NULL; /* set data to NULL again to avoid calling
2648                       multi_runsingle() in case there's no need to */
2649       now = Curl_now(); /* get a newer time since the multi_runsingle() loop
2650                            may have taken some time */
2651     }
2652   }
2653   else {
2654     /* Asked to run due to time-out. Clear the 'lastcall' variable to force
2655        update_timer() to trigger a callback to the app again even if the same
2656        timeout is still the one to run after this call. That handles the case
2657        when the application asks libcurl to run the timeout prematurely. */
2658     memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
2659   }
2660
2661   /*
2662    * The loop following here will go on as long as there are expire-times left
2663    * to process in the splay and 'data' will be re-assigned for every expired
2664    * handle we deal with.
2665    */
2666   do {
2667     /* the first loop lap 'data' can be NULL */
2668     if(data) {
2669       SIGPIPE_VARIABLE(pipe_st);
2670
2671       sigpipe_ignore(data, &pipe_st);
2672       result = multi_runsingle(multi, now, data);
2673       sigpipe_restore(&pipe_st);
2674
2675       if(CURLM_OK >= result) {
2676         /* get the socket(s) and check if the state has been changed since
2677            last */
2678         result = singlesocket(multi, data);
2679         if(result)
2680           return result;
2681       }
2682     }
2683
2684     /* Check if there's one (more) expired timer to deal with! This function
2685        extracts a matching node if there is one */
2686
2687     multi->timetree = Curl_splaygetbest(now, multi->timetree, &t);
2688     if(t) {
2689       data = t->payload; /* assign this for next loop */
2690       (void)add_next_timeout(now, multi, t->payload);
2691     }
2692
2693   } while(t);
2694
2695   *running_handles = multi->num_alive;
2696   return result;
2697 }
2698
2699 #undef curl_multi_setopt
2700 CURLMcode curl_multi_setopt(struct Curl_multi *multi,
2701                             CURLMoption option, ...)
2702 {
2703   CURLMcode res = CURLM_OK;
2704   va_list param;
2705
2706   if(!GOOD_MULTI_HANDLE(multi))
2707     return CURLM_BAD_HANDLE;
2708
2709   if(multi->in_callback)
2710     return CURLM_RECURSIVE_API_CALL;
2711
2712   va_start(param, option);
2713
2714   switch(option) {
2715   case CURLMOPT_SOCKETFUNCTION:
2716     multi->socket_cb = va_arg(param, curl_socket_callback);
2717     break;
2718   case CURLMOPT_SOCKETDATA:
2719     multi->socket_userp = va_arg(param, void *);
2720     break;
2721   case CURLMOPT_PUSHFUNCTION:
2722     multi->push_cb = va_arg(param, curl_push_callback);
2723     break;
2724   case CURLMOPT_PUSHDATA:
2725     multi->push_userp = va_arg(param, void *);
2726     break;
2727   case CURLMOPT_PIPELINING:
2728     multi->pipelining = va_arg(param, long) & CURLPIPE_MULTIPLEX;
2729     break;
2730   case CURLMOPT_TIMERFUNCTION:
2731     multi->timer_cb = va_arg(param, curl_multi_timer_callback);
2732     break;
2733   case CURLMOPT_TIMERDATA:
2734     multi->timer_userp = va_arg(param, void *);
2735     break;
2736   case CURLMOPT_MAXCONNECTS:
2737     multi->maxconnects = va_arg(param, long);
2738     break;
2739   case CURLMOPT_MAX_HOST_CONNECTIONS:
2740     multi->max_host_connections = va_arg(param, long);
2741     break;
2742   case CURLMOPT_MAX_PIPELINE_LENGTH:
2743     multi->max_pipeline_length = va_arg(param, long);
2744     break;
2745   case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
2746     multi->content_length_penalty_size = va_arg(param, long);
2747     break;
2748   case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
2749     multi->chunk_length_penalty_size = va_arg(param, long);
2750     break;
2751   case CURLMOPT_PIPELINING_SITE_BL:
2752     res = Curl_pipeline_set_site_blacklist(va_arg(param, char **),
2753                                            &multi->pipelining_site_bl);
2754     break;
2755   case CURLMOPT_PIPELINING_SERVER_BL:
2756     res = Curl_pipeline_set_server_blacklist(va_arg(param, char **),
2757                                              &multi->pipelining_server_bl);
2758     break;
2759   case CURLMOPT_MAX_TOTAL_CONNECTIONS:
2760     multi->max_total_connections = va_arg(param, long);
2761     break;
2762   default:
2763     res = CURLM_UNKNOWN_OPTION;
2764     break;
2765   }
2766   va_end(param);
2767   return res;
2768 }
2769
2770 /* we define curl_multi_socket() in the public multi.h header */
2771 #undef curl_multi_socket
2772
2773 CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s,
2774                             int *running_handles)
2775 {
2776   CURLMcode result;
2777   if(multi->in_callback)
2778     return CURLM_RECURSIVE_API_CALL;
2779   result = multi_socket(multi, FALSE, s, 0, running_handles);
2780   if(CURLM_OK >= result)
2781     update_timer(multi);
2782   return result;
2783 }
2784
2785 CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s,
2786                                    int ev_bitmask, int *running_handles)
2787 {
2788   CURLMcode result;
2789   if(multi->in_callback)
2790     return CURLM_RECURSIVE_API_CALL;
2791   result = multi_socket(multi, FALSE, s, ev_bitmask, running_handles);
2792   if(CURLM_OK >= result)
2793     update_timer(multi);
2794   return result;
2795 }
2796
2797 CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
2798
2799 {
2800   CURLMcode result;
2801   if(multi->in_callback)
2802     return CURLM_RECURSIVE_API_CALL;
2803   result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, running_handles);
2804   if(CURLM_OK >= result)
2805     update_timer(multi);
2806   return result;
2807 }
2808
2809 static CURLMcode multi_timeout(struct Curl_multi *multi,
2810                                long *timeout_ms)
2811 {
2812   static struct curltime tv_zero = {0, 0};
2813
2814   if(multi->timetree) {
2815     /* we have a tree of expire times */
2816     struct curltime now = Curl_now();
2817
2818     /* splay the lowest to the bottom */
2819     multi->timetree = Curl_splay(tv_zero, multi->timetree);
2820
2821     if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) {
2822       /* some time left before expiration */
2823       timediff_t diff = Curl_timediff(multi->timetree->key, now);
2824       if(diff <= 0)
2825         /*
2826          * Since we only provide millisecond resolution on the returned value
2827          * and the diff might be less than one millisecond here, we don't
2828          * return zero as that may cause short bursts of busyloops on fast
2829          * processors while the diff is still present but less than one
2830          * millisecond! instead we return 1 until the time is ripe.
2831          */
2832         *timeout_ms = 1;
2833       else
2834         /* this should be safe even on 64 bit archs, as we don't use that
2835            overly long timeouts */
2836         *timeout_ms = (long)diff;
2837     }
2838     else
2839       /* 0 means immediately */
2840       *timeout_ms = 0;
2841   }
2842   else
2843     *timeout_ms = -1;
2844
2845   return CURLM_OK;
2846 }
2847
2848 CURLMcode curl_multi_timeout(struct Curl_multi *multi,
2849                              long *timeout_ms)
2850 {
2851   /* First, make some basic checks that the CURLM handle is a good handle */
2852   if(!GOOD_MULTI_HANDLE(multi))
2853     return CURLM_BAD_HANDLE;
2854
2855   if(multi->in_callback)
2856     return CURLM_RECURSIVE_API_CALL;
2857
2858   return multi_timeout(multi, timeout_ms);
2859 }
2860
2861 /*
2862  * Tell the application it should update its timers, if it subscribes to the
2863  * update timer callback.
2864  */
2865 static int update_timer(struct Curl_multi *multi)
2866 {
2867   long timeout_ms;
2868
2869   if(!multi->timer_cb)
2870     return 0;
2871   if(multi_timeout(multi, &timeout_ms)) {
2872     return -1;
2873   }
2874   if(timeout_ms < 0) {
2875     static const struct curltime none = {0, 0};
2876     if(Curl_splaycomparekeys(none, multi->timer_lastcall)) {
2877       multi->timer_lastcall = none;
2878       /* there's no timeout now but there was one previously, tell the app to
2879          disable it */
2880       return multi->timer_cb(multi, -1, multi->timer_userp);
2881     }
2882     return 0;
2883   }
2884
2885   /* When multi_timeout() is done, multi->timetree points to the node with the
2886    * timeout we got the (relative) time-out time for. We can thus easily check
2887    * if this is the same (fixed) time as we got in a previous call and then
2888    * avoid calling the callback again. */
2889   if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0)
2890     return 0;
2891
2892   multi->timer_lastcall = multi->timetree->key;
2893
2894   return multi->timer_cb(multi, timeout_ms, multi->timer_userp);
2895 }
2896
2897 /*
2898  * multi_deltimeout()
2899  *
2900  * Remove a given timestamp from the list of timeouts.
2901  */
2902 static void
2903 multi_deltimeout(struct Curl_easy *data, expire_id eid)
2904 {
2905   struct curl_llist_element *e;
2906   struct curl_llist *timeoutlist = &data->state.timeoutlist;
2907   /* find and remove the specific node from the list */
2908   for(e = timeoutlist->head; e; e = e->next) {
2909     struct time_node *n = (struct time_node *)e->ptr;
2910     if(n->eid == eid) {
2911       Curl_llist_remove(timeoutlist, e, NULL);
2912       return;
2913     }
2914   }
2915 }
2916
2917 /*
2918  * multi_addtimeout()
2919  *
2920  * Add a timestamp to the list of timeouts. Keep the list sorted so that head
2921  * of list is always the timeout nearest in time.
2922  *
2923  */
2924 static CURLMcode
2925 multi_addtimeout(struct Curl_easy *data,
2926                  struct curltime *stamp,
2927                  expire_id eid)
2928 {
2929   struct curl_llist_element *e;
2930   struct time_node *node;
2931   struct curl_llist_element *prev = NULL;
2932   size_t n;
2933   struct curl_llist *timeoutlist = &data->state.timeoutlist;
2934
2935   node = &data->state.expires[eid];
2936
2937   /* copy the timestamp and id */
2938   memcpy(&node->time, stamp, sizeof(*stamp));
2939   node->eid = eid; /* also marks it as in use */
2940
2941   n = Curl_llist_count(timeoutlist);
2942   if(n) {
2943     /* find the correct spot in the list */
2944     for(e = timeoutlist->head; e; e = e->next) {
2945       struct time_node *check = (struct time_node *)e->ptr;
2946       timediff_t diff = Curl_timediff(check->time, node->time);
2947       if(diff > 0)
2948         break;
2949       prev = e;
2950     }
2951
2952   }
2953   /* else
2954      this is the first timeout on the list */
2955
2956   Curl_llist_insert_next(timeoutlist, prev, node, &node->list);
2957   return CURLM_OK;
2958 }
2959
2960 /*
2961  * Curl_expire()
2962  *
2963  * given a number of milliseconds from now to use to set the 'act before
2964  * this'-time for the transfer, to be extracted by curl_multi_timeout()
2965  *
2966  * The timeout will be added to a queue of timeouts if it defines a moment in
2967  * time that is later than the current head of queue.
2968  *
2969  * Expire replaces a former timeout using the same id if already set.
2970  */
2971 void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
2972 {
2973   struct Curl_multi *multi = data->multi;
2974   struct curltime *nowp = &data->state.expiretime;
2975   struct curltime set;
2976
2977   /* this is only interesting while there is still an associated multi struct
2978      remaining! */
2979   if(!multi)
2980     return;
2981
2982   DEBUGASSERT(id < EXPIRE_LAST);
2983
2984   set = Curl_now();
2985   set.tv_sec += milli/1000;
2986   set.tv_usec += (unsigned int)(milli%1000)*1000;
2987
2988   if(set.tv_usec >= 1000000) {
2989     set.tv_sec++;
2990     set.tv_usec -= 1000000;
2991   }
2992
2993   /* Remove any timer with the same id just in case. */
2994   multi_deltimeout(data, id);
2995
2996   /* Add it to the timer list.  It must stay in the list until it has expired
2997      in case we need to recompute the minimum timer later. */
2998   multi_addtimeout(data, &set, id);
2999
3000   if(nowp->tv_sec || nowp->tv_usec) {
3001     /* This means that the struct is added as a node in the splay tree.
3002        Compare if the new time is earlier, and only remove-old/add-new if it
3003        is. */
3004     timediff_t diff = Curl_timediff(set, *nowp);
3005     int rc;
3006
3007     if(diff > 0) {
3008       /* The current splay tree entry is sooner than this new expiry time.
3009          We don't need to update our splay tree entry. */
3010       return;
3011     }
3012
3013     /* Since this is an updated time, we must remove the previous entry from
3014        the splay tree first and then re-add the new value */
3015     rc = Curl_splayremovebyaddr(multi->timetree,
3016                                 &data->state.timenode,
3017                                 &multi->timetree);
3018     if(rc)
3019       infof(data, "Internal error removing splay node = %d\n", rc);
3020   }
3021
3022   /* Indicate that we are in the splay tree and insert the new timer expiry
3023      value since it is our local minimum. */
3024   *nowp = set;
3025   data->state.timenode.payload = data;
3026   multi->timetree = Curl_splayinsert(*nowp, multi->timetree,
3027                                      &data->state.timenode);
3028 }
3029
3030 /*
3031  * Curl_expire_done()
3032  *
3033  * Removes the expire timer. Marks it as done.
3034  *
3035  */
3036 void Curl_expire_done(struct Curl_easy *data, expire_id id)
3037 {
3038   /* remove the timer, if there */
3039   multi_deltimeout(data, id);
3040 }
3041
3042 /*
3043  * Curl_expire_clear()
3044  *
3045  * Clear ALL timeout values for this handle.
3046  */
3047 void Curl_expire_clear(struct Curl_easy *data)
3048 {
3049   struct Curl_multi *multi = data->multi;
3050   struct curltime *nowp = &data->state.expiretime;
3051
3052   /* this is only interesting while there is still an associated multi struct
3053      remaining! */
3054   if(!multi)
3055     return;
3056
3057   if(nowp->tv_sec || nowp->tv_usec) {
3058     /* Since this is an cleared time, we must remove the previous entry from
3059        the splay tree */
3060     struct curl_llist *list = &data->state.timeoutlist;
3061     int rc;
3062
3063     rc = Curl_splayremovebyaddr(multi->timetree,
3064                                 &data->state.timenode,
3065                                 &multi->timetree);
3066     if(rc)
3067       infof(data, "Internal error clearing splay node = %d\n", rc);
3068
3069     /* flush the timeout list too */
3070     while(list->size > 0) {
3071       Curl_llist_remove(list, list->tail, NULL);
3072     }
3073
3074 #ifdef DEBUGBUILD
3075     infof(data, "Expire cleared\n");
3076 #endif
3077     nowp->tv_sec = 0;
3078     nowp->tv_usec = 0;
3079   }
3080 }
3081
3082
3083
3084
3085 CURLMcode curl_multi_assign(struct Curl_multi *multi, curl_socket_t s,
3086                             void *hashp)
3087 {
3088   struct Curl_sh_entry *there = NULL;
3089
3090   if(multi->in_callback)
3091     return CURLM_RECURSIVE_API_CALL;
3092
3093   there = sh_getentry(&multi->sockhash, s);
3094
3095   if(!there)
3096     return CURLM_BAD_SOCKET;
3097
3098   there->socketp = hashp;
3099
3100   return CURLM_OK;
3101 }
3102
3103 size_t Curl_multi_max_host_connections(struct Curl_multi *multi)
3104 {
3105   return multi ? multi->max_host_connections : 0;
3106 }
3107
3108 size_t Curl_multi_max_total_connections(struct Curl_multi *multi)
3109 {
3110   return multi ? multi->max_total_connections : 0;
3111 }
3112
3113 curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi)
3114 {
3115   return multi ? multi->content_length_penalty_size : 0;
3116 }
3117
3118 curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
3119 {
3120   return multi ? multi->chunk_length_penalty_size : 0;
3121 }
3122
3123 struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
3124 {
3125   return &multi->pipelining_site_bl;
3126 }
3127
3128 struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
3129 {
3130   return &multi->pipelining_server_bl;
3131 }
3132
3133 static void process_pending_handles(struct Curl_multi *multi)
3134 {
3135   struct curl_llist_element *e = multi->pending.head;
3136   if(e) {
3137     struct Curl_easy *data = e->ptr;
3138
3139     DEBUGASSERT(data->mstate == CURLM_STATE_CONNECT_PEND);
3140
3141     multistate(data, CURLM_STATE_CONNECT);
3142
3143     /* Remove this node from the list */
3144     Curl_llist_remove(&multi->pending, e, NULL);
3145
3146     /* Make sure that the handle will be processed soonish. */
3147     Curl_expire(data, 0, EXPIRE_RUN_NOW);
3148   }
3149 }
3150
3151 void Curl_set_in_callback(struct Curl_easy *data, bool value)
3152 {
3153   /* might get called when there is no data pointer! */
3154   if(data) {
3155     if(data->multi_easy)
3156       data->multi_easy->in_callback = value;
3157     else if(data->multi)
3158       data->multi->in_callback = value;
3159   }
3160 }
3161
3162 bool Curl_is_in_callback(struct Curl_easy *easy)
3163 {
3164   return ((easy->multi && easy->multi->in_callback) ||
3165           (easy->multi_easy && easy->multi_easy->in_callback));
3166 }
3167
3168 #ifdef DEBUGBUILD
3169 void Curl_multi_dump(struct Curl_multi *multi)
3170 {
3171   struct Curl_easy *data;
3172   int i;
3173   fprintf(stderr, "* Multi status: %d handles, %d alive\n",
3174           multi->num_easy, multi->num_alive);
3175   for(data = multi->easyp; data; data = data->next) {
3176     if(data->mstate < CURLM_STATE_COMPLETED) {
3177       /* only display handles that are not completed */
3178       fprintf(stderr, "handle %p, state %s, %d sockets\n",
3179               (void *)data,
3180               statename[data->mstate], data->numsocks);
3181       for(i = 0; i < data->numsocks; i++) {
3182         curl_socket_t s = data->sockets[i];
3183         struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
3184
3185         fprintf(stderr, "%d ", (int)s);
3186         if(!entry) {
3187           fprintf(stderr, "INTERNAL CONFUSION\n");
3188           continue;
3189         }
3190         fprintf(stderr, "[%s %s] ",
3191                 entry->action&CURL_POLL_IN?"RECVING":"",
3192                 entry->action&CURL_POLL_OUT?"SENDING":"");
3193       }
3194       if(data->numsocks)
3195         fprintf(stderr, "\n");
3196     }
3197   }
3198 }
3199 #endif