disconnect: separate connections and easy handles better
[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 = NULL;
762
763 #ifdef USE_LIBPSL
764   /* Remove the PSL association. */
765   if(data->psl == &multi->psl)
766     data->psl = NULL;
767 #endif
768
769   data->multi = NULL; /* clear the association to this multi handle */
770
771   /* make sure there's no pending message in the queue sent from this easy
772      handle */
773
774   for(e = multi->msglist.head; e; e = e->next) {
775     struct Curl_message *msg = e->ptr;
776
777     if(msg->extmsg.easy_handle == easy) {
778       Curl_llist_remove(&multi->msglist, e, NULL);
779       /* there can only be one from this specific handle */
780       break;
781     }
782   }
783
784   /* make the previous node point to our next */
785   if(data->prev)
786     data->prev->next = data->next;
787   else
788     multi->easyp = data->next; /* point to first node */
789
790   /* make our next point to our previous node */
791   if(data->next)
792     data->next->prev = data->prev;
793   else
794     multi->easylp = data->prev; /* point to last node */
795
796   /* NOTE NOTE NOTE
797      We do not touch the easy handle here! */
798   multi->num_easy--; /* one less to care about now */
799
800   update_timer(multi);
801   return CURLM_OK;
802 }
803
804 /* Return TRUE if the application asked for a certain set of pipelining */
805 bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
806 {
807   return (multi && (multi->pipelining & bits)) ? TRUE : FALSE;
808 }
809
810 void Curl_multi_handlePipeBreak(struct Curl_easy *data)
811 {
812   data->easy_conn = NULL;
813 }
814
815 static int waitconnect_getsock(struct connectdata *conn,
816                                curl_socket_t *sock,
817                                int numsocks)
818 {
819   int i;
820   int s = 0;
821   int rc = 0;
822
823   if(!numsocks)
824     return GETSOCK_BLANK;
825
826 #ifdef USE_SSL
827   if(CONNECT_FIRSTSOCKET_PROXY_SSL())
828     return Curl_ssl_getsock(conn, sock, numsocks);
829 #endif
830
831   for(i = 0; i<2; i++) {
832     if(conn->tempsock[i] != CURL_SOCKET_BAD) {
833       sock[s] = conn->tempsock[i];
834       rc |= GETSOCK_WRITESOCK(s++);
835     }
836   }
837
838   return rc;
839 }
840
841 static int waitproxyconnect_getsock(struct connectdata *conn,
842                                     curl_socket_t *sock,
843                                     int numsocks)
844 {
845   if(!numsocks)
846     return GETSOCK_BLANK;
847
848   sock[0] = conn->sock[FIRSTSOCKET];
849
850   /* when we've sent a CONNECT to a proxy, we should rather wait for the
851      socket to become readable to be able to get the response headers */
852   if(conn->connect_state)
853     return GETSOCK_READSOCK(0);
854
855   return GETSOCK_WRITESOCK(0);
856 }
857
858 static int domore_getsock(struct connectdata *conn,
859                           curl_socket_t *socks,
860                           int numsocks)
861 {
862   if(conn && conn->handler->domore_getsock)
863     return conn->handler->domore_getsock(conn, socks, numsocks);
864   return GETSOCK_BLANK;
865 }
866
867 /* returns bitmapped flags for this handle and its sockets */
868 static int multi_getsock(struct Curl_easy *data,
869                          curl_socket_t *socks, /* points to numsocks number
870                                                   of sockets */
871                          int numsocks)
872 {
873   /* The no connection case can happen when this is called from
874      curl_multi_remove_handle() => singlesocket() => multi_getsock().
875   */
876   if(!data->easy_conn)
877     return 0;
878
879   if(data->mstate > CURLM_STATE_CONNECT &&
880      data->mstate < CURLM_STATE_COMPLETED) {
881     /* Set up ownership correctly */
882     data->easy_conn->data = data;
883   }
884
885   switch(data->mstate) {
886   default:
887 #if 0 /* switch back on these cases to get the compiler to check for all enums
888          to be present */
889   case CURLM_STATE_TOOFAST:  /* returns 0, so will not select. */
890   case CURLM_STATE_COMPLETED:
891   case CURLM_STATE_MSGSENT:
892   case CURLM_STATE_INIT:
893   case CURLM_STATE_CONNECT:
894   case CURLM_STATE_WAITDO:
895   case CURLM_STATE_DONE:
896   case CURLM_STATE_LAST:
897     /* this will get called with CURLM_STATE_COMPLETED when a handle is
898        removed */
899 #endif
900     return 0;
901
902   case CURLM_STATE_WAITRESOLVE:
903     return Curl_resolv_getsock(data->easy_conn, socks, numsocks);
904
905   case CURLM_STATE_PROTOCONNECT:
906   case CURLM_STATE_SENDPROTOCONNECT:
907     return Curl_protocol_getsock(data->easy_conn, socks, numsocks);
908
909   case CURLM_STATE_DO:
910   case CURLM_STATE_DOING:
911     return Curl_doing_getsock(data->easy_conn, socks, numsocks);
912
913   case CURLM_STATE_WAITPROXYCONNECT:
914     return waitproxyconnect_getsock(data->easy_conn, socks, numsocks);
915
916   case CURLM_STATE_WAITCONNECT:
917     return waitconnect_getsock(data->easy_conn, socks, numsocks);
918
919   case CURLM_STATE_DO_MORE:
920     return domore_getsock(data->easy_conn, socks, numsocks);
921
922   case CURLM_STATE_DO_DONE: /* since is set after DO is completed, we switch
923                                to waiting for the same as the *PERFORM
924                                states */
925   case CURLM_STATE_PERFORM:
926   case CURLM_STATE_WAITPERFORM:
927     return Curl_single_getsock(data->easy_conn, socks, numsocks);
928   }
929
930 }
931
932 CURLMcode curl_multi_fdset(struct Curl_multi *multi,
933                            fd_set *read_fd_set, fd_set *write_fd_set,
934                            fd_set *exc_fd_set, int *max_fd)
935 {
936   /* Scan through all the easy handles to get the file descriptors set.
937      Some easy handles may not have connected to the remote host yet,
938      and then we must make sure that is done. */
939   struct Curl_easy *data;
940   int this_max_fd = -1;
941   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
942   int i;
943   (void)exc_fd_set; /* not used */
944
945   if(!GOOD_MULTI_HANDLE(multi))
946     return CURLM_BAD_HANDLE;
947
948   if(multi->in_callback)
949     return CURLM_RECURSIVE_API_CALL;
950
951   data = multi->easyp;
952   while(data) {
953     int bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
954
955     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
956       curl_socket_t s = CURL_SOCKET_BAD;
957
958       if((bitmap & GETSOCK_READSOCK(i)) && VALID_SOCK((sockbunch[i]))) {
959         FD_SET(sockbunch[i], read_fd_set);
960         s = sockbunch[i];
961       }
962       if((bitmap & GETSOCK_WRITESOCK(i)) && VALID_SOCK((sockbunch[i]))) {
963         FD_SET(sockbunch[i], write_fd_set);
964         s = sockbunch[i];
965       }
966       if(s == CURL_SOCKET_BAD)
967         /* this socket is unused, break out of loop */
968         break;
969       if((int)s > this_max_fd)
970         this_max_fd = (int)s;
971     }
972
973     data = data->next; /* check next handle */
974   }
975
976   *max_fd = this_max_fd;
977
978   return CURLM_OK;
979 }
980
981 #define NUM_POLLS_ON_STACK 10
982
983 CURLMcode Curl_multi_wait(struct Curl_multi *multi,
984                           struct curl_waitfd extra_fds[],
985                           unsigned int extra_nfds,
986                           int timeout_ms,
987                           int *ret,
988                           bool *gotsocket) /* if any socket was checked */
989 {
990   struct Curl_easy *data;
991   curl_socket_t sockbunch[MAX_SOCKSPEREASYHANDLE];
992   int bitmap;
993   unsigned int i;
994   unsigned int nfds = 0;
995   unsigned int curlfds;
996   struct pollfd *ufds = NULL;
997   bool ufds_malloc = FALSE;
998   long timeout_internal;
999   int retcode = 0;
1000   struct pollfd a_few_on_stack[NUM_POLLS_ON_STACK];
1001
1002   if(gotsocket)
1003     *gotsocket = FALSE;
1004
1005   if(!GOOD_MULTI_HANDLE(multi))
1006     return CURLM_BAD_HANDLE;
1007
1008   if(multi->in_callback)
1009     return CURLM_RECURSIVE_API_CALL;
1010
1011   /* Count up how many fds we have from the multi handle */
1012   data = multi->easyp;
1013   while(data) {
1014     bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
1015
1016     for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
1017       curl_socket_t s = CURL_SOCKET_BAD;
1018
1019       if(bitmap & GETSOCK_READSOCK(i)) {
1020         ++nfds;
1021         s = sockbunch[i];
1022       }
1023       if(bitmap & GETSOCK_WRITESOCK(i)) {
1024         ++nfds;
1025         s = sockbunch[i];
1026       }
1027       if(s == CURL_SOCKET_BAD) {
1028         break;
1029       }
1030     }
1031
1032     data = data->next; /* check next handle */
1033   }
1034
1035   /* If the internally desired timeout is actually shorter than requested from
1036      the outside, then use the shorter time! But only if the internal timer
1037      is actually larger than -1! */
1038   (void)multi_timeout(multi, &timeout_internal);
1039   if((timeout_internal >= 0) && (timeout_internal < (long)timeout_ms))
1040     timeout_ms = (int)timeout_internal;
1041
1042   curlfds = nfds; /* number of internal file descriptors */
1043   nfds += extra_nfds; /* add the externally provided ones */
1044
1045   if(nfds) {
1046     if(nfds > NUM_POLLS_ON_STACK) {
1047       /* 'nfds' is a 32 bit value and 'struct pollfd' is typically 8 bytes
1048          big, so at 2^29 sockets this value might wrap. When a process gets
1049          the capability to actually handle over 500 million sockets this
1050          calculation needs a integer overflow check. */
1051       ufds = malloc(nfds * sizeof(struct pollfd));
1052       if(!ufds)
1053         return CURLM_OUT_OF_MEMORY;
1054       ufds_malloc = TRUE;
1055     }
1056     else
1057       ufds = &a_few_on_stack[0];
1058   }
1059   nfds = 0;
1060
1061   /* only do the second loop if we found descriptors in the first stage run
1062      above */
1063
1064   if(curlfds) {
1065     /* Add the curl handles to our pollfds first */
1066     data = multi->easyp;
1067     while(data) {
1068       bitmap = multi_getsock(data, sockbunch, MAX_SOCKSPEREASYHANDLE);
1069
1070       for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++) {
1071         curl_socket_t s = CURL_SOCKET_BAD;
1072
1073         if(bitmap & GETSOCK_READSOCK(i)) {
1074           ufds[nfds].fd = sockbunch[i];
1075           ufds[nfds].events = POLLIN;
1076           ++nfds;
1077           s = sockbunch[i];
1078         }
1079         if(bitmap & GETSOCK_WRITESOCK(i)) {
1080           ufds[nfds].fd = sockbunch[i];
1081           ufds[nfds].events = POLLOUT;
1082           ++nfds;
1083           s = sockbunch[i];
1084         }
1085         if(s == CURL_SOCKET_BAD) {
1086           break;
1087         }
1088       }
1089
1090       data = data->next; /* check next handle */
1091     }
1092   }
1093
1094   /* Add external file descriptions from poll-like struct curl_waitfd */
1095   for(i = 0; i < extra_nfds; i++) {
1096     ufds[nfds].fd = extra_fds[i].fd;
1097     ufds[nfds].events = 0;
1098     if(extra_fds[i].events & CURL_WAIT_POLLIN)
1099       ufds[nfds].events |= POLLIN;
1100     if(extra_fds[i].events & CURL_WAIT_POLLPRI)
1101       ufds[nfds].events |= POLLPRI;
1102     if(extra_fds[i].events & CURL_WAIT_POLLOUT)
1103       ufds[nfds].events |= POLLOUT;
1104     ++nfds;
1105   }
1106
1107   if(nfds) {
1108     int pollrc;
1109     /* wait... */
1110     pollrc = Curl_poll(ufds, nfds, timeout_ms);
1111
1112     if(pollrc > 0) {
1113       retcode = pollrc;
1114       /* copy revents results from the poll to the curl_multi_wait poll
1115          struct, the bit values of the actual underlying poll() implementation
1116          may not be the same as the ones in the public libcurl API! */
1117       for(i = 0; i < extra_nfds; i++) {
1118         unsigned short mask = 0;
1119         unsigned r = ufds[curlfds + i].revents;
1120
1121         if(r & POLLIN)
1122           mask |= CURL_WAIT_POLLIN;
1123         if(r & POLLOUT)
1124           mask |= CURL_WAIT_POLLOUT;
1125         if(r & POLLPRI)
1126           mask |= CURL_WAIT_POLLPRI;
1127
1128         extra_fds[i].revents = mask;
1129       }
1130     }
1131   }
1132
1133   if(ufds_malloc)
1134     free(ufds);
1135   if(ret)
1136     *ret = retcode;
1137   if(gotsocket && (extra_fds || curlfds))
1138     /* if any socket was checked */
1139     *gotsocket = TRUE;
1140
1141   return CURLM_OK;
1142 }
1143
1144 CURLMcode curl_multi_wait(struct Curl_multi *multi,
1145                           struct curl_waitfd extra_fds[],
1146                           unsigned int extra_nfds,
1147                           int timeout_ms,
1148                           int *ret)
1149 {
1150   return Curl_multi_wait(multi, extra_fds, extra_nfds, timeout_ms, ret, NULL);
1151 }
1152 /*
1153  * Curl_multi_connchanged() is called to tell that there is a connection in
1154  * this multi handle that has changed state (pipelining become possible, the
1155  * number of allowed streams changed or similar), and a subsequent use of this
1156  * multi handle should move CONNECT_PEND handles back to CONNECT to have them
1157  * retry.
1158  */
1159 void Curl_multi_connchanged(struct Curl_multi *multi)
1160 {
1161   multi->recheckstate = TRUE;
1162 }
1163
1164 /*
1165  * multi_ischanged() is called
1166  *
1167  * Returns TRUE/FALSE whether the state is changed to trigger a CONNECT_PEND
1168  * => CONNECT action.
1169  *
1170  * Set 'clear' to TRUE to have it also clear the state variable.
1171  */
1172 static bool multi_ischanged(struct Curl_multi *multi, bool clear)
1173 {
1174   bool retval = multi->recheckstate;
1175   if(clear)
1176     multi->recheckstate = FALSE;
1177   return retval;
1178 }
1179
1180 CURLMcode Curl_multi_add_perform(struct Curl_multi *multi,
1181                                  struct Curl_easy *data,
1182                                  struct connectdata *conn)
1183 {
1184   CURLMcode rc;
1185
1186   if(multi->in_callback)
1187     return CURLM_RECURSIVE_API_CALL;
1188
1189   rc = curl_multi_add_handle(multi, data);
1190   if(!rc) {
1191     struct SingleRequest *k = &data->req;
1192
1193     /* pass in NULL for 'conn' here since we don't want to init the
1194        connection, only this transfer */
1195     Curl_init_do(data, NULL);
1196
1197     /* take this handle to the perform state right away */
1198     multistate(data, CURLM_STATE_PERFORM);
1199     data->easy_conn = conn;
1200     k->keepon |= KEEP_RECV; /* setup to receive! */
1201   }
1202   return rc;
1203 }
1204
1205 static CURLcode multi_reconnect_request(struct connectdata **connp)
1206 {
1207   CURLcode result = CURLE_OK;
1208   struct connectdata *conn = *connp;
1209   struct Curl_easy *data = conn->data;
1210
1211   /* This was a re-use of a connection and we got a write error in the
1212    * DO-phase. Then we DISCONNECT this connection and have another attempt to
1213    * CONNECT and then DO again! The retry cannot possibly find another
1214    * connection to re-use, since we only keep one possible connection for
1215    * each.  */
1216
1217   infof(data, "Re-used connection seems dead, get a new one\n");
1218
1219   connclose(conn, "Reconnect dead connection"); /* enforce close */
1220   result = multi_done(&conn, result, FALSE); /* we are so done with this */
1221
1222   /* conn may no longer be a good pointer, clear it to avoid mistakes by
1223      parent functions */
1224   *connp = NULL;
1225
1226   /*
1227    * We need to check for CURLE_SEND_ERROR here as well. This could happen
1228    * when the request failed on a FTP connection and thus multi_done() itself
1229    * tried to use the connection (again).
1230    */
1231   if(!result || (CURLE_SEND_ERROR == result)) {
1232     bool async;
1233     bool protocol_done = TRUE;
1234
1235     /* Now, redo the connect and get a new connection */
1236     result = Curl_connect(data, connp, &async, &protocol_done);
1237     if(!result) {
1238       /* We have connected or sent away a name resolve query fine */
1239
1240       conn = *connp; /* setup conn to again point to something nice */
1241       if(async) {
1242         /* Now, if async is TRUE here, we need to wait for the name
1243            to resolve */
1244         result = Curl_resolver_wait_resolv(conn, NULL);
1245         if(result)
1246           return result;
1247
1248         /* Resolved, continue with the connection */
1249         result = Curl_once_resolved(conn, &protocol_done);
1250         if(result)
1251           return result;
1252       }
1253     }
1254   }
1255
1256   return result;
1257 }
1258
1259 /*
1260  * do_complete is called when the DO actions are complete.
1261  *
1262  * We init chunking and trailer bits to their default values here immediately
1263  * before receiving any header data for the current request in the pipeline.
1264  */
1265 static void do_complete(struct connectdata *conn)
1266 {
1267   conn->data->req.chunk = FALSE;
1268   conn->data->req.maxfd = (conn->sockfd>conn->writesockfd?
1269                            conn->sockfd:conn->writesockfd) + 1;
1270   Curl_pgrsTime(conn->data, TIMER_PRETRANSFER);
1271 }
1272
1273 static CURLcode multi_do(struct connectdata **connp, bool *done)
1274 {
1275   CURLcode result = CURLE_OK;
1276   struct connectdata *conn = *connp;
1277   struct Curl_easy *data = conn->data;
1278
1279   if(conn->handler->do_it) {
1280     /* generic protocol-specific function pointer set in curl_connect() */
1281     result = conn->handler->do_it(conn, done);
1282
1283     /* This was formerly done in transfer.c, but we better do it here */
1284     if((CURLE_SEND_ERROR == result) && conn->bits.reuse) {
1285       /*
1286        * If the connection is using an easy handle, call reconnect
1287        * to re-establish the connection.  Otherwise, let the multi logic
1288        * figure out how to re-establish the connection.
1289        */
1290       if(!data->multi) {
1291         result = multi_reconnect_request(connp);
1292
1293         if(!result) {
1294           /* ... finally back to actually retry the DO phase */
1295           conn = *connp; /* re-assign conn since multi_reconnect_request
1296                             creates a new connection */
1297           result = conn->handler->do_it(conn, done);
1298         }
1299       }
1300       else
1301         return result;
1302     }
1303
1304     if(!result && *done)
1305       /* do_complete must be called after the protocol-specific DO function */
1306       do_complete(conn);
1307   }
1308   return result;
1309 }
1310
1311 /*
1312  * multi_do_more() is called during the DO_MORE multi state. It is basically a
1313  * second stage DO state which (wrongly) was introduced to support FTP's
1314  * second connection.
1315  *
1316  * TODO: A future libcurl should be able to work away this state.
1317  *
1318  * 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
1319  * DOING state there's more work to do!
1320  */
1321
1322 static CURLcode multi_do_more(struct connectdata *conn, int *complete)
1323 {
1324   CURLcode result = CURLE_OK;
1325
1326   *complete = 0;
1327
1328   if(conn->handler->do_more)
1329     result = conn->handler->do_more(conn, complete);
1330
1331   if(!result && (*complete == 1))
1332     /* do_complete must be called after the protocol-specific DO function */
1333     do_complete(conn);
1334
1335   return result;
1336 }
1337
1338 static CURLMcode multi_runsingle(struct Curl_multi *multi,
1339                                  struct curltime now,
1340                                  struct Curl_easy *data)
1341 {
1342   struct Curl_message *msg = NULL;
1343   bool connected;
1344   bool async;
1345   bool protocol_connect = FALSE;
1346   bool dophase_done = FALSE;
1347   bool done = FALSE;
1348   CURLMcode rc;
1349   CURLcode result = CURLE_OK;
1350   struct SingleRequest *k;
1351   time_t timeout_ms;
1352   time_t recv_timeout_ms;
1353   timediff_t send_timeout_ms;
1354   int control;
1355
1356   if(!GOOD_EASY_HANDLE(data))
1357     return CURLM_BAD_EASY_HANDLE;
1358
1359   do {
1360     /* A "stream" here is a logical stream if the protocol can handle that
1361        (HTTP/2), or the full connection for older protocols */
1362     bool stream_error = FALSE;
1363     rc = CURLM_OK;
1364
1365     if(!data->easy_conn &&
1366        data->mstate > CURLM_STATE_CONNECT &&
1367        data->mstate < CURLM_STATE_DONE) {
1368       /* In all these states, the code will blindly access 'data->easy_conn'
1369          so this is precaution that it isn't NULL. And it silences static
1370          analyzers. */
1371       failf(data, "In state %d with no easy_conn, bail out!\n", data->mstate);
1372       return CURLM_INTERNAL_ERROR;
1373     }
1374
1375     if(multi_ischanged(multi, TRUE)) {
1376       DEBUGF(infof(data, "multi changed, check CONNECT_PEND queue!\n"));
1377       process_pending_handles(multi); /* pipelined/multiplexed */
1378     }
1379
1380     if(data->easy_conn && data->mstate > CURLM_STATE_CONNECT &&
1381        data->mstate < CURLM_STATE_COMPLETED) {
1382       /* Make sure we set the connection's current owner */
1383       data->easy_conn->data = data;
1384     }
1385
1386     if(data->easy_conn &&
1387        (data->mstate >= CURLM_STATE_CONNECT) &&
1388        (data->mstate < CURLM_STATE_COMPLETED)) {
1389       /* we need to wait for the connect state as only then is the start time
1390          stored, but we must not check already completed handles */
1391       timeout_ms = Curl_timeleft(data, &now,
1392                                  (data->mstate <= CURLM_STATE_WAITDO)?
1393                                  TRUE:FALSE);
1394
1395       if(timeout_ms < 0) {
1396         /* Handle timed out */
1397         if(data->mstate == CURLM_STATE_WAITRESOLVE)
1398           failf(data, "Resolving timed out after %ld milliseconds",
1399                 Curl_timediff(now, data->progress.t_startsingle));
1400         else if(data->mstate == CURLM_STATE_WAITCONNECT)
1401           failf(data, "Connection timed out after %ld milliseconds",
1402                 Curl_timediff(now, data->progress.t_startsingle));
1403         else {
1404           k = &data->req;
1405           if(k->size != -1) {
1406             failf(data, "Operation timed out after %ld milliseconds with %"
1407                   CURL_FORMAT_CURL_OFF_T " out of %"
1408                   CURL_FORMAT_CURL_OFF_T " bytes received",
1409                   Curl_timediff(now, data->progress.t_startsingle),
1410                   k->bytecount, k->size);
1411           }
1412           else {
1413             failf(data, "Operation timed out after %ld milliseconds with %"
1414                   CURL_FORMAT_CURL_OFF_T " bytes received",
1415                   Curl_timediff(now, data->progress.t_startsingle),
1416                   k->bytecount);
1417           }
1418         }
1419
1420         /* Force connection closed if the connection has indeed been used */
1421         if(data->mstate > CURLM_STATE_DO) {
1422           streamclose(data->easy_conn, "Disconnected with pending data");
1423           stream_error = TRUE;
1424         }
1425         result = CURLE_OPERATION_TIMEDOUT;
1426         (void)multi_done(&data->easy_conn, result, TRUE);
1427         /* Skip the statemachine and go directly to error handling section. */
1428         goto statemachine_end;
1429       }
1430     }
1431
1432     switch(data->mstate) {
1433     case CURLM_STATE_INIT:
1434       /* init this transfer. */
1435       result = Curl_pretransfer(data);
1436
1437       if(!result) {
1438         /* after init, go CONNECT */
1439         multistate(data, CURLM_STATE_CONNECT);
1440         Curl_pgrsTime(data, TIMER_STARTOP);
1441         rc = CURLM_CALL_MULTI_PERFORM;
1442       }
1443       break;
1444
1445     case CURLM_STATE_CONNECT_PEND:
1446       /* We will stay here until there is a connection available. Then
1447          we try again in the CURLM_STATE_CONNECT state. */
1448       break;
1449
1450     case CURLM_STATE_CONNECT:
1451       /* Connect. We want to get a connection identifier filled in. */
1452       Curl_pgrsTime(data, TIMER_STARTSINGLE);
1453       result = Curl_connect(data, &data->easy_conn,
1454                             &async, &protocol_connect);
1455       if(CURLE_NO_CONNECTION_AVAILABLE == result) {
1456         /* There was no connection available. We will go to the pending
1457            state and wait for an available connection. */
1458         multistate(data, CURLM_STATE_CONNECT_PEND);
1459
1460         /* add this handle to the list of connect-pending handles */
1461         Curl_llist_insert_next(&multi->pending, multi->pending.tail, data,
1462                                &data->connect_queue);
1463         result = CURLE_OK;
1464         break;
1465       }
1466
1467       if(!result) {
1468         /* Add this handle to the send or pend pipeline */
1469         result = Curl_add_handle_to_pipeline(data, data->easy_conn);
1470         if(result)
1471           stream_error = TRUE;
1472         else {
1473           if(async)
1474             /* We're now waiting for an asynchronous name lookup */
1475             multistate(data, CURLM_STATE_WAITRESOLVE);
1476           else {
1477             /* after the connect has been sent off, go WAITCONNECT unless the
1478                protocol connect is already done and we can go directly to
1479                WAITDO or DO! */
1480             rc = CURLM_CALL_MULTI_PERFORM;
1481
1482             if(protocol_connect)
1483               multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1484                          CURLM_STATE_WAITDO:CURLM_STATE_DO);
1485             else {
1486 #ifndef CURL_DISABLE_HTTP
1487               if(Curl_connect_ongoing(data->easy_conn))
1488                 multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1489               else
1490 #endif
1491                 multistate(data, CURLM_STATE_WAITCONNECT);
1492             }
1493           }
1494         }
1495       }
1496       break;
1497
1498     case CURLM_STATE_WAITRESOLVE:
1499       /* awaiting an asynch name resolve to complete */
1500     {
1501       struct Curl_dns_entry *dns = NULL;
1502       struct connectdata *conn = data->easy_conn;
1503       const char *hostname;
1504
1505       if(conn->bits.httpproxy)
1506         hostname = conn->http_proxy.host.name;
1507       else if(conn->bits.conn_to_host)
1508         hostname = conn->conn_to_host.name;
1509       else
1510         hostname = conn->host.name;
1511
1512       /* check if we have the name resolved by now */
1513       dns = Curl_fetch_addr(conn, hostname, (int)conn->port);
1514
1515       if(dns) {
1516 #ifdef CURLRES_ASYNCH
1517         conn->async.dns = dns;
1518         conn->async.done = TRUE;
1519 #endif
1520         result = CURLE_OK;
1521         infof(data, "Hostname '%s' was found in DNS cache\n", hostname);
1522       }
1523
1524       if(!dns)
1525         result = Curl_resolv_check(data->easy_conn, &dns);
1526
1527       /* Update sockets here, because the socket(s) may have been
1528          closed and the application thus needs to be told, even if it
1529          is likely that the same socket(s) will again be used further
1530          down.  If the name has not yet been resolved, it is likely
1531          that new sockets have been opened in an attempt to contact
1532          another resolver. */
1533       singlesocket(multi, data);
1534
1535       if(dns) {
1536         /* Perform the next step in the connection phase, and then move on
1537            to the WAITCONNECT state */
1538         result = Curl_once_resolved(data->easy_conn, &protocol_connect);
1539
1540         if(result)
1541           /* if Curl_once_resolved() returns failure, the connection struct
1542              is already freed and gone */
1543           data->easy_conn = NULL;           /* no more connection */
1544         else {
1545           /* call again please so that we get the next socket setup */
1546           rc = CURLM_CALL_MULTI_PERFORM;
1547           if(protocol_connect)
1548             multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1549                        CURLM_STATE_WAITDO:CURLM_STATE_DO);
1550           else {
1551 #ifndef CURL_DISABLE_HTTP
1552             if(Curl_connect_ongoing(data->easy_conn))
1553               multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1554             else
1555 #endif
1556               multistate(data, CURLM_STATE_WAITCONNECT);
1557           }
1558         }
1559       }
1560
1561       if(result) {
1562         /* failure detected */
1563         stream_error = TRUE;
1564         break;
1565       }
1566     }
1567     break;
1568
1569 #ifndef CURL_DISABLE_HTTP
1570     case CURLM_STATE_WAITPROXYCONNECT:
1571       /* this is HTTP-specific, but sending CONNECT to a proxy is HTTP... */
1572       result = Curl_http_connect(data->easy_conn, &protocol_connect);
1573
1574       if(data->easy_conn->bits.proxy_connect_closed) {
1575         rc = CURLM_CALL_MULTI_PERFORM;
1576         /* connect back to proxy again */
1577         result = CURLE_OK;
1578         multi_done(&data->easy_conn, CURLE_OK, FALSE);
1579         multistate(data, CURLM_STATE_CONNECT);
1580       }
1581       else if(!result) {
1582         if((data->easy_conn->http_proxy.proxytype != CURLPROXY_HTTPS ||
1583            data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) &&
1584            Curl_connect_complete(data->easy_conn)) {
1585           rc = CURLM_CALL_MULTI_PERFORM;
1586           /* initiate protocol connect phase */
1587           multistate(data, CURLM_STATE_SENDPROTOCONNECT);
1588         }
1589       }
1590       else if(result)
1591         stream_error = TRUE;
1592       break;
1593 #endif
1594
1595     case CURLM_STATE_WAITCONNECT:
1596       /* awaiting a completion of an asynch TCP connect */
1597       result = Curl_is_connected(data->easy_conn, FIRSTSOCKET, &connected);
1598       if(connected && !result) {
1599 #ifndef CURL_DISABLE_HTTP
1600         if((data->easy_conn->http_proxy.proxytype == CURLPROXY_HTTPS &&
1601             !data->easy_conn->bits.proxy_ssl_connected[FIRSTSOCKET]) ||
1602            Curl_connect_ongoing(data->easy_conn)) {
1603           multistate(data, CURLM_STATE_WAITPROXYCONNECT);
1604           break;
1605         }
1606 #endif
1607         rc = CURLM_CALL_MULTI_PERFORM;
1608         multistate(data, data->easy_conn->bits.tunnel_proxy?
1609                    CURLM_STATE_WAITPROXYCONNECT:
1610                    CURLM_STATE_SENDPROTOCONNECT);
1611       }
1612       else if(result) {
1613         /* failure detected */
1614         /* Just break, the cleaning up is handled all in one place */
1615         stream_error = TRUE;
1616         break;
1617       }
1618       break;
1619
1620     case CURLM_STATE_SENDPROTOCONNECT:
1621       result = Curl_protocol_connect(data->easy_conn, &protocol_connect);
1622       if(!result && !protocol_connect)
1623         /* switch to waiting state */
1624         multistate(data, CURLM_STATE_PROTOCONNECT);
1625       else if(!result) {
1626         /* protocol connect has completed, go WAITDO or DO */
1627         multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1628                    CURLM_STATE_WAITDO:CURLM_STATE_DO);
1629         rc = CURLM_CALL_MULTI_PERFORM;
1630       }
1631       else if(result) {
1632         /* failure detected */
1633         Curl_posttransfer(data);
1634         multi_done(&data->easy_conn, result, TRUE);
1635         stream_error = TRUE;
1636       }
1637       break;
1638
1639     case CURLM_STATE_PROTOCONNECT:
1640       /* protocol-specific connect phase */
1641       result = Curl_protocol_connecting(data->easy_conn, &protocol_connect);
1642       if(!result && protocol_connect) {
1643         /* after the connect has completed, go WAITDO or DO */
1644         multistate(data, Curl_pipeline_wanted(multi, CURLPIPE_HTTP1)?
1645                    CURLM_STATE_WAITDO:CURLM_STATE_DO);
1646         rc = CURLM_CALL_MULTI_PERFORM;
1647       }
1648       else if(result) {
1649         /* failure detected */
1650         Curl_posttransfer(data);
1651         multi_done(&data->easy_conn, result, TRUE);
1652         stream_error = TRUE;
1653       }
1654       break;
1655
1656     case CURLM_STATE_WAITDO:
1657       /* Wait for our turn to DO when we're pipelining requests */
1658       if(Curl_pipeline_checkget_write(data, data->easy_conn)) {
1659         /* Grabbed the channel */
1660         multistate(data, CURLM_STATE_DO);
1661         rc = CURLM_CALL_MULTI_PERFORM;
1662       }
1663       break;
1664
1665     case CURLM_STATE_DO:
1666       if(data->set.connect_only) {
1667         /* keep connection open for application to use the socket */
1668         connkeep(data->easy_conn, "CONNECT_ONLY");
1669         multistate(data, CURLM_STATE_DONE);
1670         result = CURLE_OK;
1671         rc = CURLM_CALL_MULTI_PERFORM;
1672       }
1673       else {
1674         /* Perform the protocol's DO action */
1675         result = multi_do(&data->easy_conn, &dophase_done);
1676
1677         /* When multi_do() returns failure, data->easy_conn might be NULL! */
1678
1679         if(!result) {
1680           if(!dophase_done) {
1681             /* some steps needed for wildcard matching */
1682             if(data->state.wildcardmatch) {
1683               struct WildcardData *wc = &data->wildcard;
1684               if(wc->state == CURLWC_DONE || wc->state == CURLWC_SKIP) {
1685                 /* skip some states if it is important */
1686                 multi_done(&data->easy_conn, CURLE_OK, FALSE);
1687                 multistate(data, CURLM_STATE_DONE);
1688                 rc = CURLM_CALL_MULTI_PERFORM;
1689                 break;
1690               }
1691             }
1692             /* DO was not completed in one function call, we must continue
1693                DOING... */
1694             multistate(data, CURLM_STATE_DOING);
1695             rc = CURLM_OK;
1696           }
1697
1698           /* after DO, go DO_DONE... or DO_MORE */
1699           else if(data->easy_conn->bits.do_more) {
1700             /* we're supposed to do more, but we need to sit down, relax
1701                and wait a little while first */
1702             multistate(data, CURLM_STATE_DO_MORE);
1703             rc = CURLM_OK;
1704           }
1705           else {
1706             /* we're done with the DO, now DO_DONE */
1707             multistate(data, CURLM_STATE_DO_DONE);
1708             rc = CURLM_CALL_MULTI_PERFORM;
1709           }
1710         }
1711         else if((CURLE_SEND_ERROR == result) &&
1712                 data->easy_conn->bits.reuse) {
1713           /*
1714            * In this situation, a connection that we were trying to use
1715            * may have unexpectedly died.  If possible, send the connection
1716            * back to the CONNECT phase so we can try again.
1717            */
1718           char *newurl = NULL;
1719           followtype follow = FOLLOW_NONE;
1720           CURLcode drc;
1721
1722           drc = Curl_retry_request(data->easy_conn, &newurl);
1723           if(drc) {
1724             /* a failure here pretty much implies an out of memory */
1725             result = drc;
1726             stream_error = TRUE;
1727           }
1728
1729           Curl_posttransfer(data);
1730           drc = multi_done(&data->easy_conn, result, FALSE);
1731
1732           /* When set to retry the connection, we must to go back to
1733            * the CONNECT state */
1734           if(newurl) {
1735             if(!drc || (drc == CURLE_SEND_ERROR)) {
1736               follow = FOLLOW_RETRY;
1737               drc = Curl_follow(data, newurl, follow);
1738               if(!drc) {
1739                 multistate(data, CURLM_STATE_CONNECT);
1740                 rc = CURLM_CALL_MULTI_PERFORM;
1741                 result = CURLE_OK;
1742               }
1743               else {
1744                 /* Follow failed */
1745                 result = drc;
1746               }
1747             }
1748             else {
1749               /* done didn't return OK or SEND_ERROR */
1750               result = drc;
1751             }
1752           }
1753           else {
1754             /* Have error handler disconnect conn if we can't retry */
1755             stream_error = TRUE;
1756           }
1757           free(newurl);
1758         }
1759         else {
1760           /* failure detected */
1761           Curl_posttransfer(data);
1762           if(data->easy_conn)
1763             multi_done(&data->easy_conn, result, FALSE);
1764           stream_error = TRUE;
1765         }
1766       }
1767       break;
1768
1769     case CURLM_STATE_DOING:
1770       /* we continue DOING until the DO phase is complete */
1771       result = Curl_protocol_doing(data->easy_conn,
1772                                    &dophase_done);
1773       if(!result) {
1774         if(dophase_done) {
1775           /* after DO, go DO_DONE or DO_MORE */
1776           multistate(data, data->easy_conn->bits.do_more?
1777                      CURLM_STATE_DO_MORE:
1778                      CURLM_STATE_DO_DONE);
1779           rc = CURLM_CALL_MULTI_PERFORM;
1780         } /* dophase_done */
1781       }
1782       else {
1783         /* failure detected */
1784         Curl_posttransfer(data);
1785         multi_done(&data->easy_conn, result, FALSE);
1786         stream_error = TRUE;
1787       }
1788       break;
1789
1790     case CURLM_STATE_DO_MORE:
1791       /*
1792        * When we are connected, DO MORE and then go DO_DONE
1793        */
1794       result = multi_do_more(data->easy_conn, &control);
1795
1796       /* No need to remove this handle from the send pipeline here since that
1797          is done in multi_done() */
1798       if(!result) {
1799         if(control) {
1800           /* if positive, advance to DO_DONE
1801              if negative, go back to DOING */
1802           multistate(data, control == 1?
1803                      CURLM_STATE_DO_DONE:
1804                      CURLM_STATE_DOING);
1805           rc = CURLM_CALL_MULTI_PERFORM;
1806         }
1807         else
1808           /* stay in DO_MORE */
1809           rc = CURLM_OK;
1810       }
1811       else {
1812         /* failure detected */
1813         Curl_posttransfer(data);
1814         multi_done(&data->easy_conn, result, FALSE);
1815         stream_error = TRUE;
1816       }
1817       break;
1818
1819     case CURLM_STATE_DO_DONE:
1820       /* Move ourselves from the send to recv pipeline */
1821       Curl_move_handle_from_send_to_recv_pipe(data, data->easy_conn);
1822
1823       if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
1824         /* Check if we can move pending requests to send pipe */
1825         process_pending_handles(multi); /*  pipelined/multiplexed */
1826
1827       /* Only perform the transfer if there's a good socket to work with.
1828          Having both BAD is a signal to skip immediately to DONE */
1829       if((data->easy_conn->sockfd != CURL_SOCKET_BAD) ||
1830          (data->easy_conn->writesockfd != CURL_SOCKET_BAD))
1831         multistate(data, CURLM_STATE_WAITPERFORM);
1832       else {
1833         if(data->state.wildcardmatch &&
1834            ((data->easy_conn->handler->flags & PROTOPT_WILDCARD) == 0)) {
1835            data->wildcard.state = CURLWC_DONE;
1836         }
1837         multistate(data, CURLM_STATE_DONE);
1838       }
1839       rc = CURLM_CALL_MULTI_PERFORM;
1840       break;
1841
1842     case CURLM_STATE_WAITPERFORM:
1843       /* Wait for our turn to PERFORM */
1844       if(Curl_pipeline_checkget_read(data, data->easy_conn)) {
1845         /* Grabbed the channel */
1846         multistate(data, CURLM_STATE_PERFORM);
1847         rc = CURLM_CALL_MULTI_PERFORM;
1848       }
1849       break;
1850
1851     case CURLM_STATE_TOOFAST: /* limit-rate exceeded in either direction */
1852       /* if both rates are within spec, resume transfer */
1853       if(Curl_pgrsUpdate(data->easy_conn))
1854         result = CURLE_ABORTED_BY_CALLBACK;
1855       else
1856         result = Curl_speedcheck(data, now);
1857
1858       if(!result) {
1859         send_timeout_ms = 0;
1860         if(data->set.max_send_speed > 0)
1861           send_timeout_ms =
1862             Curl_pgrsLimitWaitTime(data->progress.uploaded,
1863                                    data->progress.ul_limit_size,
1864                                    data->set.max_send_speed,
1865                                    data->progress.ul_limit_start,
1866                                    now);
1867
1868         recv_timeout_ms = 0;
1869         if(data->set.max_recv_speed > 0)
1870           recv_timeout_ms =
1871             Curl_pgrsLimitWaitTime(data->progress.downloaded,
1872                                    data->progress.dl_limit_size,
1873                                    data->set.max_recv_speed,
1874                                    data->progress.dl_limit_start,
1875                                    now);
1876
1877         if(!send_timeout_ms && !recv_timeout_ms) {
1878           multistate(data, CURLM_STATE_PERFORM);
1879           Curl_ratelimit(data, now);
1880         }
1881         else if(send_timeout_ms >= recv_timeout_ms)
1882           Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
1883         else
1884           Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
1885       }
1886       break;
1887
1888     case CURLM_STATE_PERFORM:
1889     {
1890       char *newurl = NULL;
1891       bool retry = FALSE;
1892       bool comeback = FALSE;
1893
1894       /* check if over send speed */
1895       send_timeout_ms = 0;
1896       if(data->set.max_send_speed > 0)
1897         send_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.uploaded,
1898                                                  data->progress.ul_limit_size,
1899                                                  data->set.max_send_speed,
1900                                                  data->progress.ul_limit_start,
1901                                                  now);
1902
1903       /* check if over recv speed */
1904       recv_timeout_ms = 0;
1905       if(data->set.max_recv_speed > 0)
1906         recv_timeout_ms = Curl_pgrsLimitWaitTime(data->progress.downloaded,
1907                                                  data->progress.dl_limit_size,
1908                                                  data->set.max_recv_speed,
1909                                                  data->progress.dl_limit_start,
1910                                                  now);
1911
1912       if(send_timeout_ms || recv_timeout_ms) {
1913         Curl_ratelimit(data, now);
1914         multistate(data, CURLM_STATE_TOOFAST);
1915         if(send_timeout_ms >= recv_timeout_ms)
1916           Curl_expire(data, send_timeout_ms, EXPIRE_TOOFAST);
1917         else
1918           Curl_expire(data, recv_timeout_ms, EXPIRE_TOOFAST);
1919         break;
1920       }
1921
1922       /* read/write data if it is ready to do so */
1923       result = Curl_readwrite(data->easy_conn, data, &done, &comeback);
1924
1925       k = &data->req;
1926
1927       if(!(k->keepon & KEEP_RECV))
1928         /* We're done receiving */
1929         Curl_pipeline_leave_read(data->easy_conn);
1930
1931       if(!(k->keepon & KEEP_SEND))
1932         /* We're done sending */
1933         Curl_pipeline_leave_write(data->easy_conn);
1934
1935       if(done || (result == CURLE_RECV_ERROR)) {
1936         /* If CURLE_RECV_ERROR happens early enough, we assume it was a race
1937          * condition and the server closed the re-used connection exactly when
1938          * we wanted to use it, so figure out if that is indeed the case.
1939          */
1940         CURLcode ret = Curl_retry_request(data->easy_conn, &newurl);
1941         if(!ret)
1942           retry = (newurl)?TRUE:FALSE;
1943         else if(!result)
1944           result = ret;
1945
1946         if(retry) {
1947           /* if we are to retry, set the result to OK and consider the
1948              request as done */
1949           result = CURLE_OK;
1950           done = TRUE;
1951         }
1952       }
1953
1954       if(result) {
1955         /*
1956          * The transfer phase returned error, we mark the connection to get
1957          * closed to prevent being re-used. This is because we can't possibly
1958          * know if the connection is in a good shape or not now.  Unless it is
1959          * a protocol which uses two "channels" like FTP, as then the error
1960          * happened in the data connection.
1961          */
1962
1963         if(!(data->easy_conn->handler->flags & PROTOPT_DUAL) &&
1964            result != CURLE_HTTP2_STREAM)
1965           streamclose(data->easy_conn, "Transfer returned error");
1966
1967         Curl_posttransfer(data);
1968         multi_done(&data->easy_conn, result, TRUE);
1969       }
1970       else if(done) {
1971         followtype follow = FOLLOW_NONE;
1972
1973         /* call this even if the readwrite function returned error */
1974         Curl_posttransfer(data);
1975
1976         /* we're no longer receiving */
1977         Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
1978
1979         /* expire the new receiving pipeline head */
1980         if(data->easy_conn->recv_pipe.head)
1981           Curl_expire(data->easy_conn->recv_pipe.head->ptr, 0, EXPIRE_RUN_NOW);
1982
1983         /* When we follow redirects or is set to retry the connection, we must
1984            to go back to the CONNECT state */
1985         if(data->req.newurl || retry) {
1986           if(!retry) {
1987             /* if the URL is a follow-location and not just a retried request
1988                then figure out the URL here */
1989             free(newurl);
1990             newurl = data->req.newurl;
1991             data->req.newurl = NULL;
1992             follow = FOLLOW_REDIR;
1993           }
1994           else
1995             follow = FOLLOW_RETRY;
1996           result = multi_done(&data->easy_conn, CURLE_OK, FALSE);
1997           if(!result) {
1998             result = Curl_follow(data, newurl, follow);
1999             if(!result) {
2000               multistate(data, CURLM_STATE_CONNECT);
2001               rc = CURLM_CALL_MULTI_PERFORM;
2002             }
2003           }
2004           free(newurl);
2005         }
2006         else {
2007           /* after the transfer is done, go DONE */
2008
2009           /* but first check to see if we got a location info even though we're
2010              not following redirects */
2011           if(data->req.location) {
2012             free(newurl);
2013             newurl = data->req.location;
2014             data->req.location = NULL;
2015             result = Curl_follow(data, newurl, FOLLOW_FAKE);
2016             free(newurl);
2017             if(result) {
2018               stream_error = TRUE;
2019               result = multi_done(&data->easy_conn, result, TRUE);
2020             }
2021           }
2022
2023           if(!result) {
2024             multistate(data, CURLM_STATE_DONE);
2025             rc = CURLM_CALL_MULTI_PERFORM;
2026           }
2027         }
2028       }
2029       else if(comeback)
2030         rc = CURLM_CALL_MULTI_PERFORM;
2031       break;
2032     }
2033
2034     case CURLM_STATE_DONE:
2035       /* this state is highly transient, so run another loop after this */
2036       rc = CURLM_CALL_MULTI_PERFORM;
2037
2038       if(data->easy_conn) {
2039         CURLcode res;
2040
2041         /* Remove ourselves from the receive pipeline, if we are there. */
2042         Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
2043
2044         if(data->easy_conn->bits.multiplex || data->easy_conn->send_pipe.size)
2045           /* Check if we can move pending requests to connection */
2046           process_pending_handles(multi); /* pipelined/multiplexing */
2047
2048         /* post-transfer command */
2049         res = multi_done(&data->easy_conn, result, FALSE);
2050
2051         /* allow a previously set error code take precedence */
2052         if(!result)
2053           result = res;
2054
2055         /*
2056          * If there are other handles on the pipeline, multi_done won't set
2057          * easy_conn to NULL.  In such a case, curl_multi_remove_handle() can
2058          * access free'd data, if the connection is free'd and the handle
2059          * removed before we perform the processing in CURLM_STATE_COMPLETED
2060          */
2061         if(data->easy_conn)
2062           data->easy_conn = NULL;
2063       }
2064
2065       if(data->state.wildcardmatch) {
2066         if(data->wildcard.state != CURLWC_DONE) {
2067           /* if a wildcard is set and we are not ending -> lets start again
2068              with CURLM_STATE_INIT */
2069           multistate(data, CURLM_STATE_INIT);
2070           break;
2071         }
2072       }
2073
2074       /* after we have DONE what we're supposed to do, go COMPLETED, and
2075          it doesn't matter what the multi_done() returned! */
2076       multistate(data, CURLM_STATE_COMPLETED);
2077       break;
2078
2079     case CURLM_STATE_COMPLETED:
2080       break;
2081
2082     case CURLM_STATE_MSGSENT:
2083       data->result = result;
2084       return CURLM_OK; /* do nothing */
2085
2086     default:
2087       return CURLM_INTERNAL_ERROR;
2088     }
2089     statemachine_end:
2090
2091     if(data->mstate < CURLM_STATE_COMPLETED) {
2092       if(result) {
2093         /*
2094          * If an error was returned, and we aren't in completed state now,
2095          * then we go to completed and consider this transfer aborted.
2096          */
2097
2098         /* NOTE: no attempt to disconnect connections must be made
2099            in the case blocks above - cleanup happens only here */
2100
2101         /* Check if we can move pending requests to send pipe */
2102         process_pending_handles(multi); /* connection */
2103
2104         if(data->easy_conn) {
2105           /* if this has a connection, unsubscribe from the pipelines */
2106           Curl_pipeline_leave_write(data->easy_conn);
2107           Curl_pipeline_leave_read(data->easy_conn);
2108           Curl_removeHandleFromPipeline(data, &data->easy_conn->send_pipe);
2109           Curl_removeHandleFromPipeline(data, &data->easy_conn->recv_pipe);
2110
2111           if(stream_error) {
2112             /* Don't attempt to send data over a connection that timed out */
2113             bool dead_connection = result == CURLE_OPERATION_TIMEDOUT;
2114             /* disconnect properly */
2115             Curl_disconnect(data, data->easy_conn, dead_connection);
2116
2117             /* This is where we make sure that the easy_conn pointer is reset.
2118                We don't have to do this in every case block above where a
2119                failure is detected */
2120             data->easy_conn = NULL;
2121           }
2122         }
2123         else if(data->mstate == CURLM_STATE_CONNECT) {
2124           /* Curl_connect() failed */
2125           (void)Curl_posttransfer(data);
2126         }
2127
2128         multistate(data, CURLM_STATE_COMPLETED);
2129         rc = CURLM_CALL_MULTI_PERFORM;
2130       }
2131       /* if there's still a connection to use, call the progress function */
2132       else if(data->easy_conn && Curl_pgrsUpdate(data->easy_conn)) {
2133         /* aborted due to progress callback return code must close the
2134            connection */
2135         result = CURLE_ABORTED_BY_CALLBACK;
2136         streamclose(data->easy_conn, "Aborted by callback");
2137
2138         /* if not yet in DONE state, go there, otherwise COMPLETED */
2139         multistate(data, (data->mstate < CURLM_STATE_DONE)?
2140                    CURLM_STATE_DONE: CURLM_STATE_COMPLETED);
2141         rc = CURLM_CALL_MULTI_PERFORM;
2142       }
2143     }
2144
2145     if(CURLM_STATE_COMPLETED == data->mstate) {
2146       if(data->set.fmultidone) {
2147         /* signal via callback instead */
2148         data->set.fmultidone(data, result);
2149       }
2150       else {
2151         /* now fill in the Curl_message with this info */
2152         msg = &data->msg;
2153
2154         msg->extmsg.msg = CURLMSG_DONE;
2155         msg->extmsg.easy_handle = data;
2156         msg->extmsg.data.result = result;
2157
2158         rc = multi_addmsg(multi, msg);
2159         DEBUGASSERT(!data->easy_conn);
2160       }
2161       multistate(data, CURLM_STATE_MSGSENT);
2162     }
2163   } while((rc == CURLM_CALL_MULTI_PERFORM) || multi_ischanged(multi, FALSE));
2164
2165   data->result = result;
2166   return rc;
2167 }
2168
2169
2170 CURLMcode curl_multi_perform(struct Curl_multi *multi, int *running_handles)
2171 {
2172   struct Curl_easy *data;
2173   CURLMcode returncode = CURLM_OK;
2174   struct Curl_tree *t;
2175   struct curltime now = Curl_now();
2176
2177   if(!GOOD_MULTI_HANDLE(multi))
2178     return CURLM_BAD_HANDLE;
2179
2180   if(multi->in_callback)
2181     return CURLM_RECURSIVE_API_CALL;
2182
2183   data = multi->easyp;
2184   while(data) {
2185     CURLMcode result;
2186     SIGPIPE_VARIABLE(pipe_st);
2187
2188     sigpipe_ignore(data, &pipe_st);
2189     result = multi_runsingle(multi, now, data);
2190     sigpipe_restore(&pipe_st);
2191
2192     if(result)
2193       returncode = result;
2194
2195     data = data->next; /* operate on next handle */
2196   }
2197
2198   /*
2199    * Simply remove all expired timers from the splay since handles are dealt
2200    * with unconditionally by this function and curl_multi_timeout() requires
2201    * that already passed/handled expire times are removed from the splay.
2202    *
2203    * It is important that the 'now' value is set at the entry of this function
2204    * and not for the current time as it may have ticked a little while since
2205    * then and then we risk this loop to remove timers that actually have not
2206    * been handled!
2207    */
2208   do {
2209     multi->timetree = Curl_splaygetbest(now, multi->timetree, &t);
2210     if(t)
2211       /* the removed may have another timeout in queue */
2212       (void)add_next_timeout(now, multi, t->payload);
2213
2214   } while(t);
2215
2216   *running_handles = multi->num_alive;
2217
2218   if(CURLM_OK >= returncode)
2219     update_timer(multi);
2220
2221   return returncode;
2222 }
2223
2224 CURLMcode curl_multi_cleanup(struct Curl_multi *multi)
2225 {
2226   struct Curl_easy *data;
2227   struct Curl_easy *nextdata;
2228
2229   if(GOOD_MULTI_HANDLE(multi)) {
2230     if(multi->in_callback)
2231       return CURLM_RECURSIVE_API_CALL;
2232
2233     multi->type = 0; /* not good anymore */
2234
2235     /* Firsrt remove all remaining easy handles */
2236     data = multi->easyp;
2237     while(data) {
2238       nextdata = data->next;
2239       if(!data->state.done && data->easy_conn)
2240         /* if DONE was never called for this handle */
2241         (void)multi_done(&data->easy_conn, CURLE_OK, TRUE);
2242       if(data->dns.hostcachetype == HCACHE_MULTI) {
2243         /* clear out the usage of the shared DNS cache */
2244         Curl_hostcache_clean(data, data->dns.hostcache);
2245         data->dns.hostcache = NULL;
2246         data->dns.hostcachetype = HCACHE_NONE;
2247       }
2248
2249       /* Clear the pointer to the connection cache */
2250       data->state.conn_cache = NULL;
2251       data->multi = NULL; /* clear the association */
2252
2253 #ifdef USE_LIBPSL
2254       if(data->psl == &multi->psl)
2255         data->psl = NULL;
2256 #endif
2257
2258       data = nextdata;
2259     }
2260
2261     /* Close all the connections in the connection cache */
2262     Curl_conncache_close_all_connections(&multi->conn_cache);
2263
2264     Curl_hash_destroy(&multi->sockhash);
2265     Curl_conncache_destroy(&multi->conn_cache);
2266     Curl_llist_destroy(&multi->msglist, NULL);
2267     Curl_llist_destroy(&multi->pending, NULL);
2268
2269     Curl_hash_destroy(&multi->hostcache);
2270     Curl_psl_destroy(&multi->psl);
2271
2272     /* Free the blacklists by setting them to NULL */
2273     Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl);
2274     Curl_pipeline_set_server_blacklist(NULL, &multi->pipelining_server_bl);
2275
2276     free(multi);
2277
2278     return CURLM_OK;
2279   }
2280   return CURLM_BAD_HANDLE;
2281 }
2282
2283 /*
2284  * curl_multi_info_read()
2285  *
2286  * This function is the primary way for a multi/multi_socket application to
2287  * figure out if a transfer has ended. We MUST make this function as fast as
2288  * possible as it will be polled frequently and we MUST NOT scan any lists in
2289  * here to figure out things. We must scale fine to thousands of handles and
2290  * beyond. The current design is fully O(1).
2291  */
2292
2293 CURLMsg *curl_multi_info_read(struct Curl_multi *multi, int *msgs_in_queue)
2294 {
2295   struct Curl_message *msg;
2296
2297   *msgs_in_queue = 0; /* default to none */
2298
2299   if(GOOD_MULTI_HANDLE(multi) &&
2300      !multi->in_callback &&
2301      Curl_llist_count(&multi->msglist)) {
2302     /* there is one or more messages in the list */
2303     struct curl_llist_element *e;
2304
2305     /* extract the head of the list to return */
2306     e = multi->msglist.head;
2307
2308     msg = e->ptr;
2309
2310     /* remove the extracted entry */
2311     Curl_llist_remove(&multi->msglist, e, NULL);
2312
2313     *msgs_in_queue = curlx_uztosi(Curl_llist_count(&multi->msglist));
2314
2315     return &msg->extmsg;
2316   }
2317   return NULL;
2318 }
2319
2320 /*
2321  * singlesocket() checks what sockets we deal with and their "action state"
2322  * and if we have a different state in any of those sockets from last time we
2323  * call the callback accordingly.
2324  */
2325 static CURLMcode singlesocket(struct Curl_multi *multi,
2326                               struct Curl_easy *data)
2327 {
2328   curl_socket_t socks[MAX_SOCKSPEREASYHANDLE];
2329   int i;
2330   struct Curl_sh_entry *entry;
2331   curl_socket_t s;
2332   int num;
2333   unsigned int curraction;
2334
2335   for(i = 0; i< MAX_SOCKSPEREASYHANDLE; i++)
2336     socks[i] = CURL_SOCKET_BAD;
2337
2338   /* Fill in the 'current' struct with the state as it is now: what sockets to
2339      supervise and for what actions */
2340   curraction = multi_getsock(data, socks, MAX_SOCKSPEREASYHANDLE);
2341
2342   /* We have 0 .. N sockets already and we get to know about the 0 .. M
2343      sockets we should have from now on. Detect the differences, remove no
2344      longer supervised ones and add new ones */
2345
2346   /* walk over the sockets we got right now */
2347   for(i = 0; (i< MAX_SOCKSPEREASYHANDLE) &&
2348         (curraction & (GETSOCK_READSOCK(i) | GETSOCK_WRITESOCK(i)));
2349       i++) {
2350     int action = CURL_POLL_NONE;
2351
2352     s = socks[i];
2353
2354     /* get it from the hash */
2355     entry = sh_getentry(&multi->sockhash, s);
2356
2357     if(curraction & GETSOCK_READSOCK(i))
2358       action |= CURL_POLL_IN;
2359     if(curraction & GETSOCK_WRITESOCK(i))
2360       action |= CURL_POLL_OUT;
2361
2362     if(entry) {
2363       /* yeps, already present so check if it has the same action set */
2364       if(entry->action == action)
2365         /* same, continue */
2366         continue;
2367     }
2368     else {
2369       /* this is a socket we didn't have before, add it! */
2370       entry = sh_addentry(&multi->sockhash, s, data);
2371       if(!entry)
2372         /* fatal */
2373         return CURLM_OUT_OF_MEMORY;
2374     }
2375
2376     /* we know (entry != NULL) at this point, see the logic above */
2377     if(multi->socket_cb)
2378       multi->socket_cb(data,
2379                        s,
2380                        action,
2381                        multi->socket_userp,
2382                        entry->socketp);
2383
2384     entry->action = action; /* store the current action state */
2385   }
2386
2387   num = i; /* number of sockets */
2388
2389   /* when we've walked over all the sockets we should have right now, we must
2390      make sure to detect sockets that are removed */
2391   for(i = 0; i< data->numsocks; i++) {
2392     int j;
2393     s = data->sockets[i];
2394     for(j = 0; j<num; j++) {
2395       if(s == socks[j]) {
2396         /* this is still supervised */
2397         s = CURL_SOCKET_BAD;
2398         break;
2399       }
2400     }
2401
2402     entry = sh_getentry(&multi->sockhash, s);
2403     if(entry) {
2404       /* this socket has been removed. Tell the app to remove it */
2405       bool remove_sock_from_hash = TRUE;
2406
2407       /* check if the socket to be removed serves a connection which has
2408          other easy-s in a pipeline. In this case the socket should not be
2409          removed. */
2410       struct connectdata *easy_conn = data->easy_conn;
2411       if(easy_conn) {
2412         if(easy_conn->recv_pipe.size > 1) {
2413           /* the handle should not be removed from the pipe yet */
2414           remove_sock_from_hash = FALSE;
2415
2416           /* Update the sockhash entry to instead point to the next in line
2417              for the recv_pipe, or the first (in case this particular easy
2418              isn't already) */
2419           if(entry->easy == data) {
2420             if(Curl_recvpipe_head(data, easy_conn))
2421               entry->easy = easy_conn->recv_pipe.head->next->ptr;
2422             else
2423               entry->easy = easy_conn->recv_pipe.head->ptr;
2424           }
2425         }
2426         if(easy_conn->send_pipe.size > 1) {
2427           /* the handle should not be removed from the pipe yet */
2428           remove_sock_from_hash = FALSE;
2429
2430           /* Update the sockhash entry to instead point to the next in line
2431              for the send_pipe, or the first (in case this particular easy
2432              isn't already) */
2433           if(entry->easy == data) {
2434             if(Curl_sendpipe_head(data, easy_conn))
2435               entry->easy = easy_conn->send_pipe.head->next->ptr;
2436             else
2437               entry->easy = easy_conn->send_pipe.head->ptr;
2438           }
2439         }
2440         /* Don't worry about overwriting recv_pipe head with send_pipe_head,
2441            when action will be asked on the socket (see multi_socket()), the
2442            head of the correct pipe will be taken according to the
2443            action. */
2444       }
2445
2446       if(remove_sock_from_hash) {
2447         /* in this case 'entry' is always non-NULL */
2448         if(multi->socket_cb)
2449           multi->socket_cb(data,
2450                            s,
2451                            CURL_POLL_REMOVE,
2452                            multi->socket_userp,
2453                            entry->socketp);
2454         sh_delentry(&multi->sockhash, s);
2455       }
2456     } /* if sockhash entry existed */
2457   } /* for loop over numsocks */
2458
2459   memcpy(data->sockets, socks, num*sizeof(curl_socket_t));
2460   data->numsocks = num;
2461   return CURLM_OK;
2462 }
2463
2464 void Curl_updatesocket(struct Curl_easy *data)
2465 {
2466   singlesocket(data->multi, data);
2467 }
2468
2469
2470 /*
2471  * Curl_multi_closed()
2472  *
2473  * Used by the connect code to tell the multi_socket code that one of the
2474  * sockets we were using is about to be closed.  This function will then
2475  * remove it from the sockethash for this handle to make the multi_socket API
2476  * behave properly, especially for the case when libcurl will create another
2477  * socket again and it gets the same file descriptor number.
2478  */
2479
2480 void Curl_multi_closed(struct connectdata *conn, curl_socket_t s)
2481 {
2482   if(conn->data) {
2483     /* if there's still an easy handle associated with this connection */
2484     struct Curl_multi *multi = conn->data->multi;
2485     if(multi) {
2486       /* this is set if this connection is part of a handle that is added to
2487          a multi handle, and only then this is necessary */
2488       struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
2489
2490       if(entry) {
2491         if(multi->socket_cb)
2492           multi->socket_cb(conn->data, s, CURL_POLL_REMOVE,
2493                            multi->socket_userp,
2494                            entry->socketp);
2495
2496         /* now remove it from the socket hash */
2497         sh_delentry(&multi->sockhash, s);
2498       }
2499     }
2500   }
2501 }
2502
2503 /*
2504  * add_next_timeout()
2505  *
2506  * Each Curl_easy has a list of timeouts. The add_next_timeout() is called
2507  * when it has just been removed from the splay tree because the timeout has
2508  * expired. This function is then to advance in the list to pick the next
2509  * timeout to use (skip the already expired ones) and add this node back to
2510  * the splay tree again.
2511  *
2512  * The splay tree only has each sessionhandle as a single node and the nearest
2513  * timeout is used to sort it on.
2514  */
2515 static CURLMcode add_next_timeout(struct curltime now,
2516                                   struct Curl_multi *multi,
2517                                   struct Curl_easy *d)
2518 {
2519   struct curltime *tv = &d->state.expiretime;
2520   struct curl_llist *list = &d->state.timeoutlist;
2521   struct curl_llist_element *e;
2522   struct time_node *node = NULL;
2523
2524   /* move over the timeout list for this specific handle and remove all
2525      timeouts that are now passed tense and store the next pending
2526      timeout in *tv */
2527   for(e = list->head; e;) {
2528     struct curl_llist_element *n = e->next;
2529     timediff_t diff;
2530     node = (struct time_node *)e->ptr;
2531     diff = Curl_timediff(node->time, now);
2532     if(diff <= 0)
2533       /* remove outdated entry */
2534       Curl_llist_remove(list, e, NULL);
2535     else
2536       /* the list is sorted so get out on the first mismatch */
2537       break;
2538     e = n;
2539   }
2540   e = list->head;
2541   if(!e) {
2542     /* clear the expire times within the handles that we remove from the
2543        splay tree */
2544     tv->tv_sec = 0;
2545     tv->tv_usec = 0;
2546   }
2547   else {
2548     /* copy the first entry to 'tv' */
2549     memcpy(tv, &node->time, sizeof(*tv));
2550
2551     /* Insert this node again into the splay.  Keep the timer in the list in
2552        case we need to recompute future timers. */
2553     multi->timetree = Curl_splayinsert(*tv, multi->timetree,
2554                                        &d->state.timenode);
2555   }
2556   return CURLM_OK;
2557 }
2558
2559 static CURLMcode multi_socket(struct Curl_multi *multi,
2560                               bool checkall,
2561                               curl_socket_t s,
2562                               int ev_bitmask,
2563                               int *running_handles)
2564 {
2565   CURLMcode result = CURLM_OK;
2566   struct Curl_easy *data = NULL;
2567   struct Curl_tree *t;
2568   struct curltime now = Curl_now();
2569
2570   if(checkall) {
2571     /* *perform() deals with running_handles on its own */
2572     result = curl_multi_perform(multi, running_handles);
2573
2574     /* walk through each easy handle and do the socket state change magic
2575        and callbacks */
2576     if(result != CURLM_BAD_HANDLE) {
2577       data = multi->easyp;
2578       while(data && !result) {
2579         result = singlesocket(multi, data);
2580         data = data->next;
2581       }
2582     }
2583
2584     /* or should we fall-through and do the timer-based stuff? */
2585     return result;
2586   }
2587   if(s != CURL_SOCKET_TIMEOUT) {
2588
2589     struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
2590
2591     if(!entry)
2592       /* Unmatched socket, we can't act on it but we ignore this fact.  In
2593          real-world tests it has been proved that libevent can in fact give
2594          the application actions even though the socket was just previously
2595          asked to get removed, so thus we better survive stray socket actions
2596          and just move on. */
2597       ;
2598     else {
2599       SIGPIPE_VARIABLE(pipe_st);
2600
2601       data = entry->easy;
2602
2603       if(data->magic != CURLEASY_MAGIC_NUMBER)
2604         /* bad bad bad bad bad bad bad */
2605         return CURLM_INTERNAL_ERROR;
2606
2607       /* If the pipeline is enabled, take the handle which is in the head of
2608          the pipeline. If we should write into the socket, take the send_pipe
2609          head.  If we should read from the socket, take the recv_pipe head. */
2610       if(data->easy_conn) {
2611         if((ev_bitmask & CURL_POLL_OUT) &&
2612            data->easy_conn->send_pipe.head)
2613           data = data->easy_conn->send_pipe.head->ptr;
2614         else if((ev_bitmask & CURL_POLL_IN) &&
2615                 data->easy_conn->recv_pipe.head)
2616           data = data->easy_conn->recv_pipe.head->ptr;
2617       }
2618
2619       if(data->easy_conn &&
2620          !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
2621         /* set socket event bitmask if they're not locked */
2622         data->easy_conn->cselect_bits = ev_bitmask;
2623
2624       sigpipe_ignore(data, &pipe_st);
2625       result = multi_runsingle(multi, now, data);
2626       sigpipe_restore(&pipe_st);
2627
2628       if(data->easy_conn &&
2629          !(data->easy_conn->handler->flags & PROTOPT_DIRLOCK))
2630         /* clear the bitmask only if not locked */
2631         data->easy_conn->cselect_bits = 0;
2632
2633       if(CURLM_OK >= result) {
2634         /* get the socket(s) and check if the state has been changed since
2635            last */
2636         result = singlesocket(multi, data);
2637         if(result)
2638           return result;
2639       }
2640
2641       /* Now we fall-through and do the timer-based stuff, since we don't want
2642          to force the user to have to deal with timeouts as long as at least
2643          one connection in fact has traffic. */
2644
2645       data = NULL; /* set data to NULL again to avoid calling
2646                       multi_runsingle() in case there's no need to */
2647       now = Curl_now(); /* get a newer time since the multi_runsingle() loop
2648                            may have taken some time */
2649     }
2650   }
2651   else {
2652     /* Asked to run due to time-out. Clear the 'lastcall' variable to force
2653        update_timer() to trigger a callback to the app again even if the same
2654        timeout is still the one to run after this call. That handles the case
2655        when the application asks libcurl to run the timeout prematurely. */
2656     memset(&multi->timer_lastcall, 0, sizeof(multi->timer_lastcall));
2657   }
2658
2659   /*
2660    * The loop following here will go on as long as there are expire-times left
2661    * to process in the splay and 'data' will be re-assigned for every expired
2662    * handle we deal with.
2663    */
2664   do {
2665     /* the first loop lap 'data' can be NULL */
2666     if(data) {
2667       SIGPIPE_VARIABLE(pipe_st);
2668
2669       sigpipe_ignore(data, &pipe_st);
2670       result = multi_runsingle(multi, now, data);
2671       sigpipe_restore(&pipe_st);
2672
2673       if(CURLM_OK >= result) {
2674         /* get the socket(s) and check if the state has been changed since
2675            last */
2676         result = singlesocket(multi, data);
2677         if(result)
2678           return result;
2679       }
2680     }
2681
2682     /* Check if there's one (more) expired timer to deal with! This function
2683        extracts a matching node if there is one */
2684
2685     multi->timetree = Curl_splaygetbest(now, multi->timetree, &t);
2686     if(t) {
2687       data = t->payload; /* assign this for next loop */
2688       (void)add_next_timeout(now, multi, t->payload);
2689     }
2690
2691   } while(t);
2692
2693   *running_handles = multi->num_alive;
2694   return result;
2695 }
2696
2697 #undef curl_multi_setopt
2698 CURLMcode curl_multi_setopt(struct Curl_multi *multi,
2699                             CURLMoption option, ...)
2700 {
2701   CURLMcode res = CURLM_OK;
2702   va_list param;
2703
2704   if(!GOOD_MULTI_HANDLE(multi))
2705     return CURLM_BAD_HANDLE;
2706
2707   if(multi->in_callback)
2708     return CURLM_RECURSIVE_API_CALL;
2709
2710   va_start(param, option);
2711
2712   switch(option) {
2713   case CURLMOPT_SOCKETFUNCTION:
2714     multi->socket_cb = va_arg(param, curl_socket_callback);
2715     break;
2716   case CURLMOPT_SOCKETDATA:
2717     multi->socket_userp = va_arg(param, void *);
2718     break;
2719   case CURLMOPT_PUSHFUNCTION:
2720     multi->push_cb = va_arg(param, curl_push_callback);
2721     break;
2722   case CURLMOPT_PUSHDATA:
2723     multi->push_userp = va_arg(param, void *);
2724     break;
2725   case CURLMOPT_PIPELINING:
2726     multi->pipelining = va_arg(param, long) & CURLPIPE_MULTIPLEX;
2727     break;
2728   case CURLMOPT_TIMERFUNCTION:
2729     multi->timer_cb = va_arg(param, curl_multi_timer_callback);
2730     break;
2731   case CURLMOPT_TIMERDATA:
2732     multi->timer_userp = va_arg(param, void *);
2733     break;
2734   case CURLMOPT_MAXCONNECTS:
2735     multi->maxconnects = va_arg(param, long);
2736     break;
2737   case CURLMOPT_MAX_HOST_CONNECTIONS:
2738     multi->max_host_connections = va_arg(param, long);
2739     break;
2740   case CURLMOPT_MAX_PIPELINE_LENGTH:
2741     multi->max_pipeline_length = va_arg(param, long);
2742     break;
2743   case CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE:
2744     multi->content_length_penalty_size = va_arg(param, long);
2745     break;
2746   case CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE:
2747     multi->chunk_length_penalty_size = va_arg(param, long);
2748     break;
2749   case CURLMOPT_PIPELINING_SITE_BL:
2750     res = Curl_pipeline_set_site_blacklist(va_arg(param, char **),
2751                                            &multi->pipelining_site_bl);
2752     break;
2753   case CURLMOPT_PIPELINING_SERVER_BL:
2754     res = Curl_pipeline_set_server_blacklist(va_arg(param, char **),
2755                                              &multi->pipelining_server_bl);
2756     break;
2757   case CURLMOPT_MAX_TOTAL_CONNECTIONS:
2758     multi->max_total_connections = va_arg(param, long);
2759     break;
2760   default:
2761     res = CURLM_UNKNOWN_OPTION;
2762     break;
2763   }
2764   va_end(param);
2765   return res;
2766 }
2767
2768 /* we define curl_multi_socket() in the public multi.h header */
2769 #undef curl_multi_socket
2770
2771 CURLMcode curl_multi_socket(struct Curl_multi *multi, curl_socket_t s,
2772                             int *running_handles)
2773 {
2774   CURLMcode result;
2775   if(multi->in_callback)
2776     return CURLM_RECURSIVE_API_CALL;
2777   result = multi_socket(multi, FALSE, s, 0, running_handles);
2778   if(CURLM_OK >= result)
2779     update_timer(multi);
2780   return result;
2781 }
2782
2783 CURLMcode curl_multi_socket_action(struct Curl_multi *multi, curl_socket_t s,
2784                                    int ev_bitmask, int *running_handles)
2785 {
2786   CURLMcode result;
2787   if(multi->in_callback)
2788     return CURLM_RECURSIVE_API_CALL;
2789   result = multi_socket(multi, FALSE, s, ev_bitmask, running_handles);
2790   if(CURLM_OK >= result)
2791     update_timer(multi);
2792   return result;
2793 }
2794
2795 CURLMcode curl_multi_socket_all(struct Curl_multi *multi, int *running_handles)
2796
2797 {
2798   CURLMcode result;
2799   if(multi->in_callback)
2800     return CURLM_RECURSIVE_API_CALL;
2801   result = multi_socket(multi, TRUE, CURL_SOCKET_BAD, 0, running_handles);
2802   if(CURLM_OK >= result)
2803     update_timer(multi);
2804   return result;
2805 }
2806
2807 static CURLMcode multi_timeout(struct Curl_multi *multi,
2808                                long *timeout_ms)
2809 {
2810   static struct curltime tv_zero = {0, 0};
2811
2812   if(multi->timetree) {
2813     /* we have a tree of expire times */
2814     struct curltime now = Curl_now();
2815
2816     /* splay the lowest to the bottom */
2817     multi->timetree = Curl_splay(tv_zero, multi->timetree);
2818
2819     if(Curl_splaycomparekeys(multi->timetree->key, now) > 0) {
2820       /* some time left before expiration */
2821       timediff_t diff = Curl_timediff(multi->timetree->key, now);
2822       if(diff <= 0)
2823         /*
2824          * Since we only provide millisecond resolution on the returned value
2825          * and the diff might be less than one millisecond here, we don't
2826          * return zero as that may cause short bursts of busyloops on fast
2827          * processors while the diff is still present but less than one
2828          * millisecond! instead we return 1 until the time is ripe.
2829          */
2830         *timeout_ms = 1;
2831       else
2832         /* this should be safe even on 64 bit archs, as we don't use that
2833            overly long timeouts */
2834         *timeout_ms = (long)diff;
2835     }
2836     else
2837       /* 0 means immediately */
2838       *timeout_ms = 0;
2839   }
2840   else
2841     *timeout_ms = -1;
2842
2843   return CURLM_OK;
2844 }
2845
2846 CURLMcode curl_multi_timeout(struct Curl_multi *multi,
2847                              long *timeout_ms)
2848 {
2849   /* First, make some basic checks that the CURLM handle is a good handle */
2850   if(!GOOD_MULTI_HANDLE(multi))
2851     return CURLM_BAD_HANDLE;
2852
2853   if(multi->in_callback)
2854     return CURLM_RECURSIVE_API_CALL;
2855
2856   return multi_timeout(multi, timeout_ms);
2857 }
2858
2859 /*
2860  * Tell the application it should update its timers, if it subscribes to the
2861  * update timer callback.
2862  */
2863 static int update_timer(struct Curl_multi *multi)
2864 {
2865   long timeout_ms;
2866
2867   if(!multi->timer_cb)
2868     return 0;
2869   if(multi_timeout(multi, &timeout_ms)) {
2870     return -1;
2871   }
2872   if(timeout_ms < 0) {
2873     static const struct curltime none = {0, 0};
2874     if(Curl_splaycomparekeys(none, multi->timer_lastcall)) {
2875       multi->timer_lastcall = none;
2876       /* there's no timeout now but there was one previously, tell the app to
2877          disable it */
2878       return multi->timer_cb(multi, -1, multi->timer_userp);
2879     }
2880     return 0;
2881   }
2882
2883   /* When multi_timeout() is done, multi->timetree points to the node with the
2884    * timeout we got the (relative) time-out time for. We can thus easily check
2885    * if this is the same (fixed) time as we got in a previous call and then
2886    * avoid calling the callback again. */
2887   if(Curl_splaycomparekeys(multi->timetree->key, multi->timer_lastcall) == 0)
2888     return 0;
2889
2890   multi->timer_lastcall = multi->timetree->key;
2891
2892   return multi->timer_cb(multi, timeout_ms, multi->timer_userp);
2893 }
2894
2895 /*
2896  * multi_deltimeout()
2897  *
2898  * Remove a given timestamp from the list of timeouts.
2899  */
2900 static void
2901 multi_deltimeout(struct Curl_easy *data, expire_id eid)
2902 {
2903   struct curl_llist_element *e;
2904   struct curl_llist *timeoutlist = &data->state.timeoutlist;
2905   /* find and remove the specific node from the list */
2906   for(e = timeoutlist->head; e; e = e->next) {
2907     struct time_node *n = (struct time_node *)e->ptr;
2908     if(n->eid == eid) {
2909       Curl_llist_remove(timeoutlist, e, NULL);
2910       return;
2911     }
2912   }
2913 }
2914
2915 /*
2916  * multi_addtimeout()
2917  *
2918  * Add a timestamp to the list of timeouts. Keep the list sorted so that head
2919  * of list is always the timeout nearest in time.
2920  *
2921  */
2922 static CURLMcode
2923 multi_addtimeout(struct Curl_easy *data,
2924                  struct curltime *stamp,
2925                  expire_id eid)
2926 {
2927   struct curl_llist_element *e;
2928   struct time_node *node;
2929   struct curl_llist_element *prev = NULL;
2930   size_t n;
2931   struct curl_llist *timeoutlist = &data->state.timeoutlist;
2932
2933   node = &data->state.expires[eid];
2934
2935   /* copy the timestamp and id */
2936   memcpy(&node->time, stamp, sizeof(*stamp));
2937   node->eid = eid; /* also marks it as in use */
2938
2939   n = Curl_llist_count(timeoutlist);
2940   if(n) {
2941     /* find the correct spot in the list */
2942     for(e = timeoutlist->head; e; e = e->next) {
2943       struct time_node *check = (struct time_node *)e->ptr;
2944       timediff_t diff = Curl_timediff(check->time, node->time);
2945       if(diff > 0)
2946         break;
2947       prev = e;
2948     }
2949
2950   }
2951   /* else
2952      this is the first timeout on the list */
2953
2954   Curl_llist_insert_next(timeoutlist, prev, node, &node->list);
2955   return CURLM_OK;
2956 }
2957
2958 /*
2959  * Curl_expire()
2960  *
2961  * given a number of milliseconds from now to use to set the 'act before
2962  * this'-time for the transfer, to be extracted by curl_multi_timeout()
2963  *
2964  * The timeout will be added to a queue of timeouts if it defines a moment in
2965  * time that is later than the current head of queue.
2966  *
2967  * Expire replaces a former timeout using the same id if already set.
2968  */
2969 void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
2970 {
2971   struct Curl_multi *multi = data->multi;
2972   struct curltime *nowp = &data->state.expiretime;
2973   struct curltime set;
2974
2975   /* this is only interesting while there is still an associated multi struct
2976      remaining! */
2977   if(!multi)
2978     return;
2979
2980   DEBUGASSERT(id < EXPIRE_LAST);
2981
2982   set = Curl_now();
2983   set.tv_sec += milli/1000;
2984   set.tv_usec += (unsigned int)(milli%1000)*1000;
2985
2986   if(set.tv_usec >= 1000000) {
2987     set.tv_sec++;
2988     set.tv_usec -= 1000000;
2989   }
2990
2991   /* Remove any timer with the same id just in case. */
2992   multi_deltimeout(data, id);
2993
2994   /* Add it to the timer list.  It must stay in the list until it has expired
2995      in case we need to recompute the minimum timer later. */
2996   multi_addtimeout(data, &set, id);
2997
2998   if(nowp->tv_sec || nowp->tv_usec) {
2999     /* This means that the struct is added as a node in the splay tree.
3000        Compare if the new time is earlier, and only remove-old/add-new if it
3001        is. */
3002     timediff_t diff = Curl_timediff(set, *nowp);
3003     int rc;
3004
3005     if(diff > 0) {
3006       /* The current splay tree entry is sooner than this new expiry time.
3007          We don't need to update our splay tree entry. */
3008       return;
3009     }
3010
3011     /* Since this is an updated time, we must remove the previous entry from
3012        the splay tree first and then re-add the new value */
3013     rc = Curl_splayremovebyaddr(multi->timetree,
3014                                 &data->state.timenode,
3015                                 &multi->timetree);
3016     if(rc)
3017       infof(data, "Internal error removing splay node = %d\n", rc);
3018   }
3019
3020   /* Indicate that we are in the splay tree and insert the new timer expiry
3021      value since it is our local minimum. */
3022   *nowp = set;
3023   data->state.timenode.payload = data;
3024   multi->timetree = Curl_splayinsert(*nowp, multi->timetree,
3025                                      &data->state.timenode);
3026 }
3027
3028 /*
3029  * Curl_expire_done()
3030  *
3031  * Removes the expire timer. Marks it as done.
3032  *
3033  */
3034 void Curl_expire_done(struct Curl_easy *data, expire_id id)
3035 {
3036   /* remove the timer, if there */
3037   multi_deltimeout(data, id);
3038 }
3039
3040 /*
3041  * Curl_expire_clear()
3042  *
3043  * Clear ALL timeout values for this handle.
3044  */
3045 void Curl_expire_clear(struct Curl_easy *data)
3046 {
3047   struct Curl_multi *multi = data->multi;
3048   struct curltime *nowp = &data->state.expiretime;
3049
3050   /* this is only interesting while there is still an associated multi struct
3051      remaining! */
3052   if(!multi)
3053     return;
3054
3055   if(nowp->tv_sec || nowp->tv_usec) {
3056     /* Since this is an cleared time, we must remove the previous entry from
3057        the splay tree */
3058     struct curl_llist *list = &data->state.timeoutlist;
3059     int rc;
3060
3061     rc = Curl_splayremovebyaddr(multi->timetree,
3062                                 &data->state.timenode,
3063                                 &multi->timetree);
3064     if(rc)
3065       infof(data, "Internal error clearing splay node = %d\n", rc);
3066
3067     /* flush the timeout list too */
3068     while(list->size > 0) {
3069       Curl_llist_remove(list, list->tail, NULL);
3070     }
3071
3072 #ifdef DEBUGBUILD
3073     infof(data, "Expire cleared\n");
3074 #endif
3075     nowp->tv_sec = 0;
3076     nowp->tv_usec = 0;
3077   }
3078 }
3079
3080
3081
3082
3083 CURLMcode curl_multi_assign(struct Curl_multi *multi, curl_socket_t s,
3084                             void *hashp)
3085 {
3086   struct Curl_sh_entry *there = NULL;
3087
3088   if(multi->in_callback)
3089     return CURLM_RECURSIVE_API_CALL;
3090
3091   there = sh_getentry(&multi->sockhash, s);
3092
3093   if(!there)
3094     return CURLM_BAD_SOCKET;
3095
3096   there->socketp = hashp;
3097
3098   return CURLM_OK;
3099 }
3100
3101 size_t Curl_multi_max_host_connections(struct Curl_multi *multi)
3102 {
3103   return multi ? multi->max_host_connections : 0;
3104 }
3105
3106 size_t Curl_multi_max_total_connections(struct Curl_multi *multi)
3107 {
3108   return multi ? multi->max_total_connections : 0;
3109 }
3110
3111 curl_off_t Curl_multi_content_length_penalty_size(struct Curl_multi *multi)
3112 {
3113   return multi ? multi->content_length_penalty_size : 0;
3114 }
3115
3116 curl_off_t Curl_multi_chunk_length_penalty_size(struct Curl_multi *multi)
3117 {
3118   return multi ? multi->chunk_length_penalty_size : 0;
3119 }
3120
3121 struct curl_llist *Curl_multi_pipelining_site_bl(struct Curl_multi *multi)
3122 {
3123   return &multi->pipelining_site_bl;
3124 }
3125
3126 struct curl_llist *Curl_multi_pipelining_server_bl(struct Curl_multi *multi)
3127 {
3128   return &multi->pipelining_server_bl;
3129 }
3130
3131 static void process_pending_handles(struct Curl_multi *multi)
3132 {
3133   struct curl_llist_element *e = multi->pending.head;
3134   if(e) {
3135     struct Curl_easy *data = e->ptr;
3136
3137     DEBUGASSERT(data->mstate == CURLM_STATE_CONNECT_PEND);
3138
3139     multistate(data, CURLM_STATE_CONNECT);
3140
3141     /* Remove this node from the list */
3142     Curl_llist_remove(&multi->pending, e, NULL);
3143
3144     /* Make sure that the handle will be processed soonish. */
3145     Curl_expire(data, 0, EXPIRE_RUN_NOW);
3146   }
3147 }
3148
3149 void Curl_set_in_callback(struct Curl_easy *data, bool value)
3150 {
3151   /* might get called when there is no data pointer! */
3152   if(data) {
3153     if(data->multi_easy)
3154       data->multi_easy->in_callback = value;
3155     else if(data->multi)
3156       data->multi->in_callback = value;
3157   }
3158 }
3159
3160 bool Curl_is_in_callback(struct Curl_easy *easy)
3161 {
3162   return ((easy->multi && easy->multi->in_callback) ||
3163           (easy->multi_easy && easy->multi_easy->in_callback));
3164 }
3165
3166 #ifdef DEBUGBUILD
3167 void Curl_multi_dump(struct Curl_multi *multi)
3168 {
3169   struct Curl_easy *data;
3170   int i;
3171   fprintf(stderr, "* Multi status: %d handles, %d alive\n",
3172           multi->num_easy, multi->num_alive);
3173   for(data = multi->easyp; data; data = data->next) {
3174     if(data->mstate < CURLM_STATE_COMPLETED) {
3175       /* only display handles that are not completed */
3176       fprintf(stderr, "handle %p, state %s, %d sockets\n",
3177               (void *)data,
3178               statename[data->mstate], data->numsocks);
3179       for(i = 0; i < data->numsocks; i++) {
3180         curl_socket_t s = data->sockets[i];
3181         struct Curl_sh_entry *entry = sh_getentry(&multi->sockhash, s);
3182
3183         fprintf(stderr, "%d ", (int)s);
3184         if(!entry) {
3185           fprintf(stderr, "INTERNAL CONFUSION\n");
3186           continue;
3187         }
3188         fprintf(stderr, "[%s %s] ",
3189                 entry->action&CURL_POLL_IN?"RECVING":"",
3190                 entry->action&CURL_POLL_OUT?"SENDING":"");
3191       }
3192       if(data->numsocks)
3193         fprintf(stderr, "\n");
3194     }
3195   }
3196 }
3197 #endif