TE: rename struct field content_encoding
[platform/upstream/curl.git] / lib / transfer.c
1 /***************************************************************************
2  *                                  _   _ ____  _
3  *  Project                     ___| | | |  _ \| |
4  *                             / __| | | | |_) | |
5  *                            | (__| |_| |  _ <| |___
6  *                             \___|\___/|_| \_\_____|
7  *
8  * Copyright (C) 1998 - 2011, 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 http://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 "setup.h"
24
25 /* -- WIN32 approved -- */
26 #include <stdio.h>
27 #include <string.h>
28 #include <stdarg.h>
29 #include <stdlib.h>
30 #include <ctype.h>
31 #include <errno.h>
32
33 #include "strtoofft.h"
34 #include "strequal.h"
35 #include "rawstr.h"
36
37 #ifdef WIN32
38 #include <time.h>
39 #include <io.h>
40 #else
41 #ifdef HAVE_SYS_SOCKET_H
42 #include <sys/socket.h>
43 #endif
44 #ifdef HAVE_NETINET_IN_H
45 #include <netinet/in.h>
46 #endif
47 #ifdef HAVE_SYS_TIME_H
48 #include <sys/time.h>
49 #endif
50 #ifdef HAVE_UNISTD_H
51 #include <unistd.h>
52 #endif
53 #ifdef HAVE_NETDB_H
54 #include <netdb.h>
55 #endif
56 #ifdef HAVE_ARPA_INET_H
57 #include <arpa/inet.h>
58 #endif
59 #ifdef HAVE_NET_IF_H
60 #include <net/if.h>
61 #endif
62 #ifdef HAVE_SYS_IOCTL_H
63 #include <sys/ioctl.h>
64 #endif
65 #ifdef HAVE_SIGNAL_H
66 #include <signal.h>
67 #endif
68
69 #ifdef HAVE_SYS_PARAM_H
70 #include <sys/param.h>
71 #endif
72
73 #ifdef HAVE_SYS_SELECT_H
74 #include <sys/select.h>
75 #endif
76
77 #ifndef HAVE_SOCKET
78 #error "We can't compile without socket() support!"
79 #endif
80
81 #endif  /* WIN32 */
82
83 #include "urldata.h"
84 #include <curl/curl.h>
85 #include "netrc.h"
86
87 #include "content_encoding.h"
88 #include "hostip.h"
89 #include "transfer.h"
90 #include "sendf.h"
91 #include "speedcheck.h"
92 #include "progress.h"
93 #include "http.h"
94 #include "url.h"
95 #include "getinfo.h"
96 #include "sslgen.h"
97 #include "http_digest.h"
98 #include "http_ntlm.h"
99 #include "http_negotiate.h"
100 #include "share.h"
101 #include "curl_memory.h"
102 #include "select.h"
103 #include "multiif.h"
104 #include "easyif.h" /* for Curl_convert_to_network prototype */
105 #include "rtsp.h"
106 #include "connect.h"
107
108 #define _MPRINTF_REPLACE /* use our functions only */
109 #include <curl/mprintf.h>
110
111 /* The last #include file should be: */
112 #include "memdebug.h"
113
114 #define CURL_TIMEOUT_EXPECT_100 1000 /* counting ms here */
115
116 /*
117  * This function will call the read callback to fill our buffer with data
118  * to upload.
119  */
120 CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
121 {
122   struct SessionHandle *data = conn->data;
123   size_t buffersize = (size_t)bytes;
124   int nread;
125 #ifdef CURL_DOES_CONVERSIONS
126   bool sending_http_headers = FALSE;
127
128   if((conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) &&
129      (data->state.proto.http->sending == HTTPSEND_REQUEST)) {
130     /* We're sending the HTTP request headers, not the data.
131        Remember that so we don't re-translate them into garbage. */
132     sending_http_headers = TRUE;
133   }
134 #endif
135
136   if(data->req.upload_chunky) {
137     /* if chunked Transfer-Encoding */
138     buffersize -= (8 + 2 + 2);   /* 32bit hex + CRLF + CRLF */
139     data->req.upload_fromhere += (8 + 2); /* 32bit hex + CRLF */
140   }
141
142   /* this function returns a size_t, so we typecast to int to prevent warnings
143      with picky compilers */
144   nread = (int)conn->fread_func(data->req.upload_fromhere, 1,
145                                 buffersize, conn->fread_in);
146
147   if(nread == CURL_READFUNC_ABORT) {
148     failf(data, "operation aborted by callback");
149     *nreadp = 0;
150     return CURLE_ABORTED_BY_CALLBACK;
151   }
152   else if(nread == CURL_READFUNC_PAUSE) {
153     struct SingleRequest *k = &data->req;
154     /* CURL_READFUNC_PAUSE pauses read callbacks that feed socket writes */
155     k->keepon |= KEEP_SEND_PAUSE; /* mark socket send as paused */
156     if(data->req.upload_chunky) {
157       /* Back out the preallocation done above */
158       data->req.upload_fromhere -= (8 + 2);
159     }
160     *nreadp = 0;
161     return CURLE_OK; /* nothing was read */
162   }
163   else if((size_t)nread > buffersize) {
164     /* the read function returned a too large value */
165     *nreadp = 0;
166     failf(data, "read function returned funny value");
167     return CURLE_READ_ERROR;
168   }
169
170   if(!data->req.forbidchunk && data->req.upload_chunky) {
171     /* if chunked Transfer-Encoding
172      *    build chunk:
173      *
174      *        <HEX SIZE> CRLF
175      *        <DATA> CRLF
176      */
177     /* On non-ASCII platforms the <DATA> may or may not be
178        translated based on set.prefer_ascii while the protocol
179        portion must always be translated to the network encoding.
180        To further complicate matters, line end conversion might be
181        done later on, so we need to prevent CRLFs from becoming
182        CRCRLFs if that's the case.  To do this we use bare LFs
183        here, knowing they'll become CRLFs later on.
184      */
185
186     char hexbuffer[11];
187     const char *endofline_native;
188     const char *endofline_network;
189     int hexlen;
190 #ifdef CURL_DO_LINEEND_CONV
191     if((data->set.crlf) || (data->set.prefer_ascii)) {
192 #else
193     if(data->set.crlf) {
194 #endif /* CURL_DO_LINEEND_CONV */
195       /* \n will become \r\n later on */
196       endofline_native  = "\n";
197       endofline_network = "\x0a";
198     }
199     else {
200       endofline_native  = "\r\n";
201       endofline_network = "\x0d\x0a";
202     }
203     hexlen = snprintf(hexbuffer, sizeof(hexbuffer),
204                       "%x%s", nread, endofline_native);
205
206     /* move buffer pointer */
207     data->req.upload_fromhere -= hexlen;
208     nread += hexlen;
209
210     /* copy the prefix to the buffer, leaving out the NUL */
211     memcpy(data->req.upload_fromhere, hexbuffer, hexlen);
212
213     /* always append ASCII CRLF to the data */
214     memcpy(data->req.upload_fromhere + nread,
215            endofline_network,
216            strlen(endofline_network));
217
218 #ifdef CURL_DOES_CONVERSIONS
219     CURLcode res;
220     int length;
221     if(data->set.prefer_ascii) {
222       /* translate the protocol and data */
223       length = nread;
224     }
225     else {
226       /* just translate the protocol portion */
227       length = strlen(hexbuffer);
228     }
229     res = Curl_convert_to_network(data, data->req.upload_fromhere, length);
230     /* Curl_convert_to_network calls failf if unsuccessful */
231     if(res)
232       return(res);
233 #endif /* CURL_DOES_CONVERSIONS */
234
235     if((nread - hexlen) == 0)
236       /* mark this as done once this chunk is transfered */
237       data->req.upload_done = TRUE;
238
239     nread+=(int)strlen(endofline_native); /* for the added end of line */
240   }
241 #ifdef CURL_DOES_CONVERSIONS
242   else if((data->set.prefer_ascii) && (!sending_http_headers)) {
243     CURLcode res;
244     res = Curl_convert_to_network(data, data->req.upload_fromhere, nread);
245     /* Curl_convert_to_network calls failf if unsuccessful */
246     if(res != CURLE_OK)
247       return(res);
248   }
249 #endif /* CURL_DOES_CONVERSIONS */
250
251   *nreadp = nread;
252
253   return CURLE_OK;
254 }
255
256
257 /*
258  * Curl_readrewind() rewinds the read stream. This is typically used for HTTP
259  * POST/PUT with multi-pass authentication when a sending was denied and a
260  * resend is necessary.
261  */
262 CURLcode Curl_readrewind(struct connectdata *conn)
263 {
264   struct SessionHandle *data = conn->data;
265
266   conn->bits.rewindaftersend = FALSE; /* we rewind now */
267
268   /* explicitly switch off sending data on this connection now since we are
269      about to restart a new transfer and thus we want to avoid inadvertently
270      sending more data on the existing connection until the next transfer
271      starts */
272   data->req.keepon &= ~KEEP_SEND;
273
274   /* We have sent away data. If not using CURLOPT_POSTFIELDS or
275      CURLOPT_HTTPPOST, call app to rewind
276   */
277   if(data->set.postfields ||
278      (data->set.httpreq == HTTPREQ_POST_FORM))
279     ; /* do nothing */
280   else {
281     if(data->set.seek_func) {
282       int err;
283
284       err = (data->set.seek_func)(data->set.seek_client, 0, SEEK_SET);
285       if(err) {
286         failf(data, "seek callback returned error %d", (int)err);
287         return CURLE_SEND_FAIL_REWIND;
288       }
289     }
290     else if(data->set.ioctl_func) {
291       curlioerr err;
292
293       err = (data->set.ioctl_func)(data, CURLIOCMD_RESTARTREAD,
294                                    data->set.ioctl_client);
295       infof(data, "the ioctl callback returned %d\n", (int)err);
296
297       if(err) {
298         /* FIXME: convert to a human readable error message */
299         failf(data, "ioctl callback returned error %d", (int)err);
300         return CURLE_SEND_FAIL_REWIND;
301       }
302     }
303     else {
304       /* If no CURLOPT_READFUNCTION is used, we know that we operate on a
305          given FILE * stream and we can actually attempt to rewind that
306          ourself with fseek() */
307       if(data->set.fread_func == (curl_read_callback)fread) {
308         if(-1 != fseek(data->set.in, 0, SEEK_SET))
309           /* successful rewind */
310           return CURLE_OK;
311       }
312
313       /* no callback set or failure above, makes us fail at once */
314       failf(data, "necessary data rewind wasn't possible");
315       return CURLE_SEND_FAIL_REWIND;
316     }
317   }
318   return CURLE_OK;
319 }
320
321 static int data_pending(const struct connectdata *conn)
322 {
323   /* in the case of libssh2, we can never be really sure that we have emptied
324      its internal buffers so we MUST always try until we get EAGAIN back */
325   return conn->handler->protocol&(CURLPROTO_SCP|CURLPROTO_SFTP) ||
326     Curl_ssl_data_pending(conn, FIRSTSOCKET);
327 }
328
329 static void read_rewind(struct connectdata *conn,
330                         size_t thismuch)
331 {
332   DEBUGASSERT(conn->read_pos >= thismuch);
333
334   conn->read_pos -= thismuch;
335   conn->bits.stream_was_rewound = TRUE;
336
337 #ifdef DEBUGBUILD
338   {
339     char buf[512 + 1];
340     size_t show;
341
342     show = CURLMIN(conn->buf_len - conn->read_pos, sizeof(buf)-1);
343     if(conn->master_buffer) {
344       memcpy(buf, conn->master_buffer + conn->read_pos, show);
345       buf[show] = '\0';
346     }
347     else {
348       buf[0] = '\0';
349     }
350
351     DEBUGF(infof(conn->data,
352                  "Buffer after stream rewind (read_pos = %zu): [%s]",
353                  conn->read_pos, buf));
354   }
355 #endif
356 }
357
358 /*
359  * Check to see if CURLOPT_TIMECONDITION was met by comparing the time of the
360  * remote document with the time provided by CURLOPT_TIMEVAL
361  */
362 bool Curl_meets_timecondition(struct SessionHandle *data, time_t timeofdoc)
363 {
364   if((timeofdoc == 0) || (data->set.timevalue == 0))
365     return TRUE;
366
367   switch(data->set.timecondition) {
368   case CURL_TIMECOND_IFMODSINCE:
369   default:
370     if(timeofdoc <= data->set.timevalue) {
371       infof(data,
372             "The requested document is not new enough\n");
373       data->info.timecond = TRUE;
374       return FALSE;
375     }
376     break;
377   case CURL_TIMECOND_IFUNMODSINCE:
378     if(timeofdoc >= data->set.timevalue) {
379       infof(data,
380             "The requested document is not old enough\n");
381       data->info.timecond = TRUE;
382       return FALSE;
383     }
384     break;
385   }
386
387   return TRUE;
388 }
389
390 /*
391  * Go ahead and do a read if we have a readable socket or if
392  * the stream was rewound (in which case we have data in a
393  * buffer)
394  */
395 static CURLcode readwrite_data(struct SessionHandle *data,
396                                struct connectdata *conn,
397                                struct SingleRequest *k,
398                                int *didwhat, bool *done)
399 {
400   CURLcode result = CURLE_OK;
401   ssize_t nread; /* number of bytes read */
402   size_t excess = 0; /* excess bytes read */
403   bool is_empty_data = FALSE;
404 #ifndef CURL_DISABLE_RTSP
405   bool readmore = FALSE; /* used by RTP to signal for more data */
406 #endif
407
408   *done = FALSE;
409
410   /* This is where we loop until we have read everything there is to
411      read or we get a CURLE_AGAIN */
412   do {
413     size_t buffersize = data->set.buffer_size?
414       data->set.buffer_size : BUFSIZE;
415     size_t bytestoread = buffersize;
416
417     if(k->size != -1 && !k->header) {
418       /* make sure we don't read "too much" if we can help it since we
419          might be pipelining and then someone else might want to read what
420          follows! */
421       curl_off_t totalleft = k->size - k->bytecount;
422       if(totalleft < (curl_off_t)bytestoread)
423         bytestoread = (size_t)totalleft;
424     }
425
426     if(bytestoread) {
427       /* receive data from the network! */
428       result = Curl_read(conn, conn->sockfd, k->buf, bytestoread, &nread);
429
430       /* read would've blocked */
431       if(CURLE_AGAIN == result)
432         break; /* get out of loop */
433
434       if(result>0)
435         return result;
436     }
437     else {
438       /* read nothing but since we wanted nothing we consider this an OK
439          situation to proceed from */
440       nread = 0;
441     }
442
443     if((k->bytecount == 0) && (k->writebytecount == 0)) {
444       Curl_pgrsTime(data, TIMER_STARTTRANSFER);
445       if(k->exp100 > EXP100_SEND_DATA)
446         /* set time stamp to compare with when waiting for the 100 */
447         k->start100 = Curl_tvnow();
448     }
449
450     *didwhat |= KEEP_RECV;
451     /* indicates data of zero size, i.e. empty file */
452     is_empty_data = (bool)((nread == 0) && (k->bodywrites == 0));
453
454     /* NUL terminate, allowing string ops to be used */
455     if(0 < nread || is_empty_data) {
456       k->buf[nread] = 0;
457     }
458     else if(0 >= nread) {
459       /* if we receive 0 or less here, the server closed the connection
460          and we bail out from this! */
461       DEBUGF(infof(data, "nread <= 0, server closed connection, bailing\n"));
462       k->keepon &= ~KEEP_RECV;
463       break;
464     }
465
466     /* Default buffer to use when we write the buffer, it may be changed
467        in the flow below before the actual storing is done. */
468     k->str = k->buf;
469
470 #ifndef CURL_DISABLE_RTSP
471     /* Check for RTP at the beginning of the data */
472     if(conn->handler->protocol & CURLPROTO_RTSP) {
473       result = Curl_rtsp_rtp_readwrite(data, conn, &nread, &readmore);
474       if(result)
475         return result;
476       if(readmore)
477         break;
478     }
479 #endif
480
481 #ifndef CURL_DISABLE_HTTP
482     /* Since this is a two-state thing, we check if we are parsing
483        headers at the moment or not. */
484     if(k->header) {
485       /* we are in parse-the-header-mode */
486       bool stop_reading = FALSE;
487       result = Curl_http_readwrite_headers(data, conn, &nread, &stop_reading);
488       if(result)
489         return result;
490
491 #ifndef CURL_DISABLE_RTSP
492       /* Check for RTP after the headers if there is no Content */
493       if(k->maxdownload <= 0 && nread > 0 &&
494          (conn->handler->protocol & CURLPROTO_RTSP)) {
495         result = Curl_rtsp_rtp_readwrite(data, conn, &nread, &readmore);
496         if(result)
497           return result;
498         if(readmore)
499           break;
500       }
501 #endif
502
503       if(stop_reading) {
504         /* We've stopped dealing with input, get out of the do-while loop */
505
506         if(nread > 0) {
507           if(conn->data->multi && Curl_multi_canPipeline(conn->data->multi)) {
508             infof(data,
509                   "Rewinding stream by : %zd"
510                   " bytes on url %s (zero-length body)\n",
511                   nread, data->state.path);
512             read_rewind(conn, (size_t)nread);
513           }
514           else {
515             infof(data,
516                   "Excess found in a non pipelined read:"
517                   " excess = %zd"
518                   " url = %s (zero-length body)\n",
519                   nread, data->state.path);
520           }
521         }
522
523         break;
524       }
525     }
526 #endif /* CURL_DISABLE_HTTP */
527
528
529     /* This is not an 'else if' since it may be a rest from the header
530        parsing, where the beginning of the buffer is headers and the end
531        is non-headers. */
532     if(k->str && !k->header && (nread > 0 || is_empty_data)) {
533
534
535 #ifndef CURL_DISABLE_HTTP
536       if(0 == k->bodywrites && !is_empty_data) {
537         /* These checks are only made the first time we are about to
538            write a piece of the body */
539         if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) {
540           /* HTTP-only checks */
541
542           if(data->req.newurl) {
543             if(conn->bits.close) {
544               /* Abort after the headers if "follow Location" is set
545                  and we're set to close anyway. */
546               k->keepon &= ~KEEP_RECV;
547               *done = TRUE;
548               return CURLE_OK;
549             }
550             /* We have a new url to load, but since we want to be able
551                to re-use this connection properly, we read the full
552                response in "ignore more" */
553             k->ignorebody = TRUE;
554             infof(data, "Ignoring the response-body\n");
555           }
556           if(data->state.resume_from && !k->content_range &&
557              (data->set.httpreq==HTTPREQ_GET) &&
558              !k->ignorebody) {
559             /* we wanted to resume a download, although the server doesn't
560              * seem to support this and we did this with a GET (if it
561              * wasn't a GET we did a POST or PUT resume) */
562             failf(data, "HTTP server doesn't seem to support "
563                   "byte ranges. Cannot resume.");
564             return CURLE_RANGE_ERROR;
565           }
566
567           if(data->set.timecondition && !data->state.range) {
568             /* A time condition has been set AND no ranges have been
569                requested. This seems to be what chapter 13.3.4 of
570                RFC 2616 defines to be the correct action for a
571                HTTP/1.1 client */
572
573             if(!Curl_meets_timecondition(data, k->timeofdoc)) {
574               *done = TRUE;
575               return CURLE_OK;
576             }
577           } /* we have a time condition */
578
579         } /* this is HTTP */
580       } /* this is the first time we write a body part */
581 #endif /* CURL_DISABLE_HTTP */
582       k->bodywrites++;
583
584       /* pass data to the debug function before it gets "dechunked" */
585       if(data->set.verbose) {
586         if(k->badheader) {
587           Curl_debug(data, CURLINFO_DATA_IN, data->state.headerbuff,
588                      (size_t)k->hbuflen, conn);
589           if(k->badheader == HEADER_PARTHEADER)
590             Curl_debug(data, CURLINFO_DATA_IN,
591                        k->str, (size_t)nread, conn);
592         }
593         else
594           Curl_debug(data, CURLINFO_DATA_IN,
595                      k->str, (size_t)nread, conn);
596       }
597
598 #ifndef CURL_DISABLE_HTTP
599       if(k->chunk) {
600         /*
601          * Here comes a chunked transfer flying and we need to decode this
602          * properly.  While the name says read, this function both reads
603          * and writes away the data. The returned 'nread' holds the number
604          * of actual data it wrote to the client.
605          */
606
607         CHUNKcode res =
608           Curl_httpchunk_read(conn, k->str, nread, &nread);
609
610         if(CHUNKE_OK < res) {
611           if(CHUNKE_WRITE_ERROR == res) {
612             failf(data, "Failed writing data");
613             return CURLE_WRITE_ERROR;
614           }
615           failf(data, "Received problem %d in the chunky parser", (int)res);
616           return CURLE_RECV_ERROR;
617         }
618         else if(CHUNKE_STOP == res) {
619           size_t dataleft;
620           /* we're done reading chunks! */
621           k->keepon &= ~KEEP_RECV; /* read no more */
622
623           /* There are now possibly N number of bytes at the end of the
624              str buffer that weren't written to the client.
625
626              We DO care about this data if we are pipelining.
627              Push it back to be read on the next pass. */
628
629           dataleft = conn->chunk.dataleft;
630           if(dataleft != 0) {
631             infof(conn->data, "Leftovers after chunking: %zu bytes", dataleft);
632             if(conn->data->multi && Curl_multi_canPipeline(conn->data->multi)) {
633               /* only attempt the rewind if we truly are pipelining */
634               infof(conn->data, "Rewinding %zu bytes\n",dataleft);
635               read_rewind(conn, dataleft);
636             }
637           }
638         }
639         /* If it returned OK, we just keep going */
640       }
641 #endif   /* CURL_DISABLE_HTTP */
642
643       /* Account for body content stored in the header buffer */
644       if(k->badheader && !k->ignorebody) {
645         DEBUGF(infof(data, "Increasing bytecount by %zu from hbuflen\n",
646                      k->hbuflen));
647         k->bytecount += k->hbuflen;
648       }
649
650       if((-1 != k->maxdownload) &&
651          (k->bytecount + nread >= k->maxdownload)) {
652
653         excess = (size_t)(k->bytecount + nread - k->maxdownload);
654         if(excess > 0 && !k->ignorebody) {
655           if(conn->data->multi && Curl_multi_canPipeline(conn->data->multi)) {
656             /* The 'excess' amount below can't be more than BUFSIZE which
657                always will fit in a size_t */
658             infof(data,
659                   "Rewinding stream by : %zu"
660                   " bytes on url %s (size = %" FORMAT_OFF_T
661                   ", maxdownload = %" FORMAT_OFF_T
662                   ", bytecount = %" FORMAT_OFF_T ", nread = %zd)\n",
663                   excess, data->state.path,
664                   k->size, k->maxdownload, k->bytecount, nread);
665             read_rewind(conn, excess);
666           }
667           else {
668             infof(data,
669                   "Excess found in a non pipelined read:"
670                   " excess = %zu"
671                   ", size = %" FORMAT_OFF_T
672                   ", maxdownload = %" FORMAT_OFF_T
673                   ", bytecount = %" FORMAT_OFF_T "\n",
674                   excess, k->size, k->maxdownload, k->bytecount);
675           }
676         }
677
678         nread = (ssize_t) (k->maxdownload - k->bytecount);
679         if(nread < 0 ) /* this should be unusual */
680           nread = 0;
681
682         k->keepon &= ~KEEP_RECV; /* we're done reading */
683       }
684
685       k->bytecount += nread;
686
687       Curl_pgrsSetDownloadCounter(data, k->bytecount);
688
689       if(!k->chunk && (nread || k->badheader || is_empty_data)) {
690         /* If this is chunky transfer, it was already written */
691
692         if(k->badheader && !k->ignorebody) {
693           /* we parsed a piece of data wrongly assuming it was a header
694              and now we output it as body instead */
695
696           /* Don't let excess data pollute body writes */
697           if(k->maxdownload == -1 || (curl_off_t)k->hbuflen <= k->maxdownload)
698             result = Curl_client_write(conn, CLIENTWRITE_BODY,
699                 data->state.headerbuff,
700                 k->hbuflen);
701           else
702             result = Curl_client_write(conn, CLIENTWRITE_BODY,
703                 data->state.headerbuff,
704                 (size_t)k->maxdownload);
705
706           if(result)
707             return result;
708         }
709         if(k->badheader < HEADER_ALLBAD) {
710           /* This switch handles various content encodings. If there's an
711              error here, be sure to check over the almost identical code
712              in http_chunks.c.
713              Make sure that ALL_CONTENT_ENCODINGS contains all the
714              encodings handled here. */
715 #ifdef HAVE_LIBZ
716           switch (conn->data->set.http_ce_skip ?
717                   IDENTITY : k->auto_decoding) {
718           case IDENTITY:
719 #endif
720             /* This is the default when the server sends no
721                Content-Encoding header. See Curl_readwrite_init; the
722                memset() call initializes k->auto_decoding to zero. */
723             if(!k->ignorebody) {
724
725 #ifndef CURL_DISABLE_POP3
726               if(conn->handler->protocol&CURLPROTO_POP3)
727                 result = Curl_pop3_write(conn, k->str, nread);
728               else
729 #endif /* CURL_DISABLE_POP3 */
730
731               result = Curl_client_write(conn, CLIENTWRITE_BODY, k->str,
732                                          nread);
733             }
734 #ifdef HAVE_LIBZ
735             break;
736
737           case DEFLATE:
738             /* Assume CLIENTWRITE_BODY; headers are not encoded. */
739             if(!k->ignorebody)
740               result = Curl_unencode_deflate_write(conn, k, nread);
741             break;
742
743           case GZIP:
744             /* Assume CLIENTWRITE_BODY; headers are not encoded. */
745             if(!k->ignorebody)
746               result = Curl_unencode_gzip_write(conn, k, nread);
747             break;
748
749           case COMPRESS:
750           default:
751             failf (data, "Unrecognized content encoding type. "
752                    "libcurl understands `identity', `deflate' and `gzip' "
753                    "content encodings.");
754             result = CURLE_BAD_CONTENT_ENCODING;
755             break;
756           }
757 #endif
758         }
759         k->badheader = HEADER_NORMAL; /* taken care of now */
760
761         if(result)
762           return result;
763       }
764
765     } /* if(! header and data to read ) */
766
767 #ifndef CURL_DISABLE_RTSP
768     if(excess > 0 && !conn->bits.stream_was_rewound &&
769         (conn->handler->protocol & CURLPROTO_RTSP)) {
770       /* Check for RTP after the content if there is unrewound excess */
771
772       /* Parse the excess data */
773       k->str += nread;
774       nread = (ssize_t)excess;
775
776       result = Curl_rtsp_rtp_readwrite(data, conn, &nread, &readmore);
777       if(result)
778         return result;
779
780       if(readmore)
781         k->keepon |= KEEP_RECV; /* we're not done reading */
782         break;
783     }
784 #endif
785
786     if(is_empty_data) {
787       /* if we received nothing, the server closed the connection and we
788          are done */
789       k->keepon &= ~KEEP_RECV;
790     }
791
792   } while(data_pending(conn));
793
794   if(((k->keepon & (KEEP_RECV|KEEP_SEND)) == KEEP_SEND) &&
795      conn->bits.close ) {
796     /* When we've read the entire thing and the close bit is set, the server
797        may now close the connection. If there's now any kind of sending going
798        on from our side, we need to stop that immediately. */
799     infof(data, "we are done reading and this is set to close, stop send\n");
800     k->keepon &= ~KEEP_SEND; /* no writing anymore either */
801   }
802
803   return CURLE_OK;
804 }
805
806 /*
807  * Send data to upload to the server, when the socket is writable.
808  */
809 static CURLcode readwrite_upload(struct SessionHandle *data,
810                                  struct connectdata *conn,
811                                  struct SingleRequest *k,
812                                  int *didwhat)
813 {
814   ssize_t i, si;
815   ssize_t bytes_written;
816   CURLcode result;
817   ssize_t nread; /* number of bytes read */
818   bool sending_http_headers = FALSE;
819
820   if((k->bytecount == 0) && (k->writebytecount == 0))
821     Curl_pgrsTime(data, TIMER_STARTTRANSFER);
822
823   *didwhat |= KEEP_SEND;
824
825   /*
826    * We loop here to do the READ and SEND loop until we run out of
827    * data to send or until we get EWOULDBLOCK back
828    */
829   do {
830
831     /* only read more data if there's no upload data already
832        present in the upload buffer */
833     if(0 == data->req.upload_present) {
834       /* init the "upload from here" pointer */
835       data->req.upload_fromhere = k->uploadbuf;
836
837       if(!k->upload_done) {
838         /* HTTP pollution, this should be written nicer to become more
839            protocol agnostic. */
840         int fillcount;
841
842         if((k->exp100 == EXP100_SENDING_REQUEST) &&
843            (data->state.proto.http->sending == HTTPSEND_BODY)) {
844           /* If this call is to send body data, we must take some action:
845              We have sent off the full HTTP 1.1 request, and we shall now
846              go into the Expect: 100 state and await such a header */
847           k->exp100 = EXP100_AWAITING_CONTINUE; /* wait for the header */
848           k->keepon &= ~KEEP_SEND;         /* disable writing */
849           k->start100 = Curl_tvnow();       /* timeout count starts now */
850           *didwhat &= ~KEEP_SEND;  /* we didn't write anything actually */
851
852           /* set a timeout for the multi interface */
853           Curl_expire(data, CURL_TIMEOUT_EXPECT_100);
854           break;
855         }
856
857         if(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)) {
858           if(data->state.proto.http->sending == HTTPSEND_REQUEST)
859             /* We're sending the HTTP request headers, not the data.
860                Remember that so we don't change the line endings. */
861             sending_http_headers = TRUE;
862           else
863             sending_http_headers = FALSE;
864         }
865
866         result = Curl_fillreadbuffer(conn, BUFSIZE, &fillcount);
867         if(result)
868           return result;
869
870         nread = (ssize_t)fillcount;
871       }
872       else
873         nread = 0; /* we're done uploading/reading */
874
875       if(!nread && (k->keepon & KEEP_SEND_PAUSE)) {
876         /* this is a paused transfer */
877         break;
878       }
879       else if(nread<=0) {
880         /* done */
881         k->keepon &= ~KEEP_SEND; /* we're done writing */
882
883         if(conn->bits.rewindaftersend) {
884           result = Curl_readrewind(conn);
885           if(result)
886             return result;
887         }
888         break;
889       }
890
891       /* store number of bytes available for upload */
892       data->req.upload_present = nread;
893
894 #ifndef CURL_DISABLE_SMTP
895       if(conn->handler->protocol & CURLPROTO_SMTP) {
896         result = Curl_smtp_escape_eob(conn, nread);
897         if(result)
898           return result;
899       }
900       else
901 #endif /* CURL_DISABLE_SMTP */
902
903       /* convert LF to CRLF if so asked */
904       if((!sending_http_headers) &&
905 #ifdef CURL_DO_LINEEND_CONV
906         /* always convert if we're FTPing in ASCII mode */
907          ((data->set.crlf) || (data->set.prefer_ascii))) {
908 #else
909          (data->set.crlf)) {
910 #endif
911         if(data->state.scratch == NULL)
912           data->state.scratch = malloc(2*BUFSIZE);
913         if(data->state.scratch == NULL) {
914           failf (data, "Failed to alloc scratch buffer!");
915           return CURLE_OUT_OF_MEMORY;
916         }
917         /*
918          * ASCII/EBCDIC Note: This is presumably a text (not binary)
919          * transfer so the data should already be in ASCII.
920          * That means the hex values for ASCII CR (0x0d) & LF (0x0a)
921          * must be used instead of the escape sequences \r & \n.
922          */
923         for(i = 0, si = 0; i < nread; i++, si++) {
924           if(data->req.upload_fromhere[i] == 0x0a) {
925             data->state.scratch[si++] = 0x0d;
926             data->state.scratch[si] = 0x0a;
927             if(!data->set.crlf) {
928               /* we're here only because FTP is in ASCII mode...
929                  bump infilesize for the LF we just added */
930               data->set.infilesize++;
931             }
932           }
933           else
934             data->state.scratch[si] = data->req.upload_fromhere[i];
935         }
936         if(si != nread) {
937           /* only perform the special operation if we really did replace
938              anything */
939           nread = si;
940
941           /* upload from the new (replaced) buffer instead */
942           data->req.upload_fromhere = data->state.scratch;
943
944           /* set the new amount too */
945           data->req.upload_present = nread;
946         }
947       }
948     } /* if 0 == data->req.upload_present */
949     else {
950       /* We have a partial buffer left from a previous "round". Use
951          that instead of reading more data */
952     }
953
954     /* write to socket (send away data) */
955     result = Curl_write(conn,
956                         conn->writesockfd,     /* socket to send to */
957                         data->req.upload_fromhere, /* buffer pointer */
958                         data->req.upload_present,  /* buffer size */
959                         &bytes_written);           /* actually sent */
960
961     if(result)
962       return result;
963
964     if(data->set.verbose)
965       /* show the data before we change the pointer upload_fromhere */
966       Curl_debug(data, CURLINFO_DATA_OUT, data->req.upload_fromhere,
967                  (size_t)bytes_written, conn);
968
969     k->writebytecount += bytes_written;
970
971     if(k->writebytecount == data->set.infilesize) {
972       /* we have sent all data we were supposed to */
973       k->upload_done = TRUE;
974       infof(data, "We are completely uploaded and fine\n");
975     }
976
977     if(data->req.upload_present != bytes_written) {
978       /* we only wrote a part of the buffer (if anything), deal with it! */
979
980       /* store the amount of bytes left in the buffer to write */
981       data->req.upload_present -= bytes_written;
982
983       /* advance the pointer where to find the buffer when the next send
984          is to happen */
985       data->req.upload_fromhere += bytes_written;
986     }
987     else {
988       /* we've uploaded that buffer now */
989       data->req.upload_fromhere = k->uploadbuf;
990       data->req.upload_present = 0; /* no more bytes left */
991
992       if(k->upload_done) {
993         /* switch off writing, we're done! */
994         k->keepon &= ~KEEP_SEND; /* we're done writing */
995       }
996     }
997
998     Curl_pgrsSetUploadCounter(data, k->writebytecount);
999
1000   } while(0); /* just to break out from! */
1001
1002   return CURLE_OK;
1003 }
1004
1005 /*
1006  * Curl_readwrite() is the low-level function to be called when data is to
1007  * be read and written to/from the connection.
1008  */
1009 CURLcode Curl_readwrite(struct connectdata *conn,
1010                         bool *done)
1011 {
1012   struct SessionHandle *data = conn->data;
1013   struct SingleRequest *k = &data->req;
1014   CURLcode result;
1015   int didwhat=0;
1016
1017   curl_socket_t fd_read;
1018   curl_socket_t fd_write;
1019   int select_res = conn->cselect_bits;
1020
1021   conn->cselect_bits = 0;
1022
1023   /* only use the proper socket if the *_HOLD bit is not set simultaneously as
1024      then we are in rate limiting state in that transfer direction */
1025
1026   if((k->keepon & KEEP_RECVBITS) == KEEP_RECV)
1027     fd_read = conn->sockfd;
1028   else
1029     fd_read = CURL_SOCKET_BAD;
1030
1031   if((k->keepon & KEEP_SENDBITS) == KEEP_SEND)
1032     fd_write = conn->writesockfd;
1033   else
1034     fd_write = CURL_SOCKET_BAD;
1035
1036   if(!select_res) /* Call for select()/poll() only, if read/write/error
1037                      status is not known. */
1038     select_res = Curl_socket_ready(fd_read, fd_write, 0);
1039
1040   if(select_res == CURL_CSELECT_ERR) {
1041     failf(data, "select/poll returned error");
1042     return CURLE_SEND_ERROR;
1043   }
1044
1045   /* We go ahead and do a read if we have a readable socket or if
1046      the stream was rewound (in which case we have data in a
1047      buffer) */
1048   if((k->keepon & KEEP_RECV) &&
1049      ((select_res & CURL_CSELECT_IN) || conn->bits.stream_was_rewound)) {
1050
1051     result = readwrite_data(data, conn, k, &didwhat, done);
1052     if(result || *done)
1053       return result;
1054   }
1055
1056   /* If we still have writing to do, we check if we have a writable socket. */
1057   if((k->keepon & KEEP_SEND) && (select_res & CURL_CSELECT_OUT)) {
1058     /* write */
1059
1060     result = readwrite_upload(data, conn, k, &didwhat);
1061     if(result)
1062       return result;
1063   }
1064
1065   k->now = Curl_tvnow();
1066   if(didwhat) {
1067     /* Update read/write counters */
1068     if(k->bytecountp)
1069       *k->bytecountp = k->bytecount; /* read count */
1070     if(k->writebytecountp)
1071       *k->writebytecountp = k->writebytecount; /* write count */
1072   }
1073   else {
1074     /* no read no write, this is a timeout? */
1075     if(k->exp100 == EXP100_AWAITING_CONTINUE) {
1076       /* This should allow some time for the header to arrive, but only a
1077          very short time as otherwise it'll be too much wasted time too
1078          often. */
1079
1080       /* Quoting RFC2616, section "8.2.3 Use of the 100 (Continue) Status":
1081
1082          Therefore, when a client sends this header field to an origin server
1083          (possibly via a proxy) from which it has never seen a 100 (Continue)
1084          status, the client SHOULD NOT wait for an indefinite period before
1085          sending the request body.
1086
1087       */
1088
1089       long ms = Curl_tvdiff(k->now, k->start100);
1090       if(ms > CURL_TIMEOUT_EXPECT_100) {
1091         /* we've waited long enough, continue anyway */
1092         k->exp100 = EXP100_SEND_DATA;
1093         k->keepon |= KEEP_SEND;
1094         infof(data, "Done waiting for 100-continue\n");
1095       }
1096     }
1097   }
1098
1099   if(Curl_pgrsUpdate(conn))
1100     result = CURLE_ABORTED_BY_CALLBACK;
1101   else
1102     result = Curl_speedcheck(data, k->now);
1103   if(result)
1104     return result;
1105
1106   if(k->keepon) {
1107     if(0 > Curl_timeleft(data, &k->now, FALSE)) {
1108       if(k->size != -1) {
1109         failf(data, "Operation timed out after %ld milliseconds with %"
1110               FORMAT_OFF_T " out of %" FORMAT_OFF_T " bytes received",
1111               Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount,
1112               k->size);
1113       }
1114       else {
1115         failf(data, "Operation timed out after %ld milliseconds with %"
1116               FORMAT_OFF_T " bytes received",
1117               Curl_tvdiff(k->now, data->progress.t_startsingle), k->bytecount);
1118       }
1119       return CURLE_OPERATION_TIMEDOUT;
1120     }
1121   }
1122   else {
1123     /*
1124      * The transfer has been performed. Just make some general checks before
1125      * returning.
1126      */
1127
1128     if(!(data->set.opt_no_body) && (k->size != -1) &&
1129        (k->bytecount != k->size) &&
1130 #ifdef CURL_DO_LINEEND_CONV
1131        /* Most FTP servers don't adjust their file SIZE response for CRLFs,
1132           so we'll check to see if the discrepancy can be explained
1133           by the number of CRLFs we've changed to LFs.
1134        */
1135        (k->bytecount != (k->size + data->state.crlf_conversions)) &&
1136 #endif /* CURL_DO_LINEEND_CONV */
1137        !data->req.newurl) {
1138       failf(data, "transfer closed with %" FORMAT_OFF_T
1139             " bytes remaining to read",
1140             k->size - k->bytecount);
1141       return CURLE_PARTIAL_FILE;
1142     }
1143     else if(!(data->set.opt_no_body) &&
1144             k->chunk &&
1145             (conn->chunk.state != CHUNK_STOP)) {
1146       /*
1147        * In chunked mode, return an error if the connection is closed prior to
1148        * the empty (terminiating) chunk is read.
1149        *
1150        * The condition above used to check for
1151        * conn->proto.http->chunk.datasize != 0 which is true after reading
1152        * *any* chunk, not just the empty chunk.
1153        *
1154        */
1155       failf(data, "transfer closed with outstanding read data remaining");
1156       return CURLE_PARTIAL_FILE;
1157     }
1158     if(Curl_pgrsUpdate(conn))
1159       return CURLE_ABORTED_BY_CALLBACK;
1160   }
1161
1162   /* Now update the "done" boolean we return */
1163   *done = (bool)(0 == (k->keepon&(KEEP_RECV|KEEP_SEND|
1164                                   KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)));
1165
1166   return CURLE_OK;
1167 }
1168
1169 /*
1170  * Curl_single_getsock() gets called by the multi interface code when the app
1171  * has requested to get the sockets for the current connection. This function
1172  * will then be called once for every connection that the multi interface
1173  * keeps track of. This function will only be called for connections that are
1174  * in the proper state to have this information available.
1175  */
1176 int Curl_single_getsock(const struct connectdata *conn,
1177                         curl_socket_t *sock, /* points to numsocks number
1178                                                 of sockets */
1179                         int numsocks)
1180 {
1181   const struct SessionHandle *data = conn->data;
1182   int bitmap = GETSOCK_BLANK;
1183   unsigned sockindex = 0;
1184
1185   if(conn->handler->perform_getsock)
1186     return conn->handler->perform_getsock(conn, sock, numsocks);
1187
1188   if(numsocks < 2)
1189     /* simple check but we might need two slots */
1190     return GETSOCK_BLANK;
1191
1192   /* don't include HOLD and PAUSE connections */
1193   if((data->req.keepon & KEEP_RECVBITS) == KEEP_RECV) {
1194
1195     DEBUGASSERT(conn->sockfd != CURL_SOCKET_BAD);
1196
1197     bitmap |= GETSOCK_READSOCK(sockindex);
1198     sock[sockindex] = conn->sockfd;
1199   }
1200
1201   /* don't include HOLD and PAUSE connections */
1202   if((data->req.keepon & KEEP_SENDBITS) == KEEP_SEND) {
1203
1204     if((conn->sockfd != conn->writesockfd) ||
1205        !(data->req.keepon & KEEP_RECV)) {
1206       /* only if they are not the same socket or we didn't have a readable
1207          one, we increase index */
1208       if(data->req.keepon & KEEP_RECV)
1209         sockindex++; /* increase index if we need two entries */
1210
1211       DEBUGASSERT(conn->writesockfd != CURL_SOCKET_BAD);
1212
1213       sock[sockindex] = conn->writesockfd;
1214     }
1215
1216     bitmap |= GETSOCK_WRITESOCK(sockindex);
1217   }
1218
1219   return bitmap;
1220 }
1221
1222 /*
1223  * Determine optimum sleep time based on configured rate, current rate,
1224  * and packet size.
1225  * Returns value in mili-seconds.
1226  *
1227  * The basic idea is to adjust the desired rate up/down in this method
1228  * based on whether we are running too slow or too fast.  Then, calculate
1229  * how many miliseconds to wait for the next packet to achieve this new
1230  * rate.
1231  */
1232 long Curl_sleep_time(curl_off_t rate_bps, curl_off_t cur_rate_bps,
1233                              int pkt_size)
1234 {
1235   curl_off_t min_sleep = 0;
1236   curl_off_t rv = 0;
1237
1238   if (rate_bps == 0)
1239     return 0;
1240
1241   /* If running faster than about .1% of the desired speed, slow
1242    * us down a bit.  Use shift instead of division as the 0.1%
1243    * cutoff is arbitrary anyway.
1244    */
1245   if (cur_rate_bps > (rate_bps + (rate_bps >> 10))) {
1246     /* running too fast, decrease target rate by 1/64th of rate */
1247     rate_bps -= rate_bps >> 6;
1248     min_sleep = 1;
1249   }
1250   else if (cur_rate_bps < (rate_bps - (rate_bps >> 10))) {
1251     /* running too slow, increase target rate by 1/64th of rate */
1252     rate_bps += rate_bps >> 6;
1253   }
1254
1255   /* Determine number of miliseconds to wait until we do
1256    * the next packet at the adjusted rate.  We should wait
1257    * longer when using larger packets, for instance.
1258    */
1259   rv = ((curl_off_t)((pkt_size * 8) * 1000) / rate_bps);
1260
1261   /* Catch rounding errors and always slow down at least 1ms if
1262    * we are running too fast.
1263    */
1264   if (rv < min_sleep)
1265     rv = min_sleep;
1266
1267   /* Bound value to fit in 'long' on 32-bit platform.  That's
1268    * plenty long enough anyway!
1269    */
1270   if(rv > 0x7fffffff)
1271     rv = 0x7fffffff;
1272
1273   return (long)rv;
1274 }
1275
1276
1277 /*
1278  * Transfer()
1279  *
1280  * This function is what performs the actual transfer. It is capable of doing
1281  * both ways simultaneously.  The transfer must already have been setup by a
1282  * call to Curl_setup_transfer().
1283  *
1284  * Note that headers are created in a preallocated buffer of a default size.
1285  * That buffer can be enlarged on demand, but it is never shrunken again.
1286  *
1287  */
1288
1289 static CURLcode
1290 Transfer(struct connectdata *conn)
1291 {
1292   CURLcode result;
1293   struct SessionHandle *data = conn->data;
1294   struct SingleRequest *k = &data->req;
1295   bool done=FALSE;
1296   bool first=TRUE;
1297   int timeout_ms;
1298   int buffersize;
1299   int totmp;
1300
1301   if((conn->sockfd == CURL_SOCKET_BAD) &&
1302      (conn->writesockfd == CURL_SOCKET_BAD))
1303     /* nothing to read, nothing to write, we're already OK! */
1304     return CURLE_OK;
1305
1306   /* we want header and/or body, if neither then don't do this! */
1307   if(!k->getheader && data->set.opt_no_body)
1308     return CURLE_OK;
1309
1310   while(!done) {
1311     curl_socket_t fd_read = conn->sockfd;
1312     curl_socket_t fd_write = conn->writesockfd;
1313     int keepon = k->keepon;
1314     timeout_ms = 1000;
1315
1316     if(conn->waitfor) {
1317       /* if waitfor is set, get the RECV and SEND bits from that but keep the
1318          other bits */
1319       keepon &= ~ (KEEP_RECV|KEEP_SEND);
1320       keepon |= conn->waitfor & (KEEP_RECV|KEEP_SEND);
1321     }
1322
1323     /* limit-rate logic: if speed exceeds threshold, then do not include fd in
1324        select set. The current speed is recalculated in each Curl_readwrite()
1325        call */
1326     if((keepon & KEEP_SEND) &&
1327         (!data->set.max_send_speed ||
1328          (data->progress.ulspeed < data->set.max_send_speed) )) {
1329       k->keepon &= ~KEEP_SEND_HOLD;
1330     }
1331     else {
1332       if (data->set.upload && data->set.max_send_speed &&
1333           (data->progress.ulspeed > data->set.max_send_speed) ) {
1334         /* calculate upload rate-limitation timeout. */
1335         buffersize = (int)(data->set.buffer_size ?
1336                            data->set.buffer_size : BUFSIZE);
1337         totmp = (int)Curl_sleep_time(data->set.max_send_speed,
1338                                      data->progress.ulspeed, buffersize);
1339         if (totmp < timeout_ms)
1340           timeout_ms = totmp;
1341       }
1342       fd_write = CURL_SOCKET_BAD;
1343       if(keepon & KEEP_SEND)
1344         k->keepon |= KEEP_SEND_HOLD; /* hold it */
1345     }
1346
1347     if((keepon & KEEP_RECV) &&
1348         (!data->set.max_recv_speed ||
1349          (data->progress.dlspeed < data->set.max_recv_speed)) ) {
1350       k->keepon &= ~KEEP_RECV_HOLD;
1351     }
1352     else {
1353       if ((!data->set.upload) && data->set.max_recv_speed &&
1354           (data->progress.dlspeed > data->set.max_recv_speed)) {
1355         /* Calculate download rate-limitation timeout. */
1356         buffersize = (int)(data->set.buffer_size ?
1357                            data->set.buffer_size : BUFSIZE);
1358         totmp = (int)Curl_sleep_time(data->set.max_recv_speed,
1359                                      data->progress.dlspeed, buffersize);
1360         if (totmp < timeout_ms)
1361           timeout_ms = totmp;
1362       }
1363       fd_read = CURL_SOCKET_BAD;
1364       if(keepon & KEEP_RECV)
1365         k->keepon |= KEEP_RECV_HOLD; /* hold it */
1366     }
1367
1368     /* pause logic. Don't check descriptors for paused connections */
1369     if(k->keepon & KEEP_RECV_PAUSE)
1370       fd_read = CURL_SOCKET_BAD;
1371     if(k->keepon & KEEP_SEND_PAUSE)
1372       fd_write = CURL_SOCKET_BAD;
1373
1374     /* The *_HOLD and *_PAUSE logic is necessary since even though there might
1375        be no traffic during the select interval, we still call
1376        Curl_readwrite() for the timeout case and if we limit transfer speed we
1377        must make sure that this function doesn't transfer anything while in
1378        HOLD status.
1379
1380        The no timeout for the first round is for the protocols for which data
1381        has already been slurped off the socket and thus waiting for action
1382        won't work since it'll wait even though there is already data present
1383        to work with. */
1384     if(first &&
1385        ((fd_read != CURL_SOCKET_BAD) || (fd_write != CURL_SOCKET_BAD)))
1386       /* if this is the first lap and one of the file descriptors is fine
1387          to work with, skip the timeout */
1388       timeout_ms = 0;
1389     else {
1390       totmp = Curl_timeleft(data, &k->now, FALSE);
1391       if(totmp < 0)
1392         return CURLE_OPERATION_TIMEDOUT;
1393       else if(!totmp)
1394         totmp = 1000;
1395
1396       if (totmp < timeout_ms)
1397         timeout_ms = totmp;
1398     }
1399
1400     switch (Curl_socket_ready(fd_read, fd_write, timeout_ms)) {
1401     case -1: /* select() error, stop reading */
1402 #ifdef EINTR
1403       /* The EINTR is not serious, and it seems you might get this more
1404          often when using the lib in a multi-threaded environment! */
1405       if(SOCKERRNO == EINTR)
1406         continue;
1407 #endif
1408       return CURLE_RECV_ERROR;  /* indicate a network problem */
1409     case 0:  /* timeout */
1410     default: /* readable descriptors */
1411
1412       result = Curl_readwrite(conn, &done);
1413       /* "done" signals to us if the transfer(s) are ready */
1414       break;
1415     }
1416     if(result)
1417       return result;
1418
1419     first = FALSE; /* not the first lap anymore */
1420   }
1421
1422   return CURLE_OK;
1423 }
1424
1425 static CURLcode loadhostpairs(struct SessionHandle *data)
1426 {
1427   struct curl_slist *hostp;
1428   char hostname[256];
1429   char address[256];
1430   int port;
1431
1432   for(hostp = data->change.resolve; hostp; hostp = hostp->next ) {
1433     if(!hostp->data)
1434       continue;
1435     if(hostp->data[0] == '-') {
1436       /* TODO: mark an entry for removal */
1437     }
1438     else if(3 == sscanf(hostp->data, "%255[^:]:%d:%255s", hostname, &port,
1439                         address)) {
1440       struct Curl_dns_entry *dns;
1441       Curl_addrinfo *addr;
1442
1443       addr = Curl_str2addr(address, port);
1444       if(!addr) {
1445         infof(data, "Resolve %s found illegal!\n", hostp->data);
1446         continue;
1447       }
1448       infof(data, "Added %s:%d:%s to DNS cache\n",
1449             hostname, port, address);
1450
1451       if(data->share)
1452         Curl_share_lock(data, CURL_LOCK_DATA_DNS, CURL_LOCK_ACCESS_SINGLE);
1453
1454       /* put this host in the cache */
1455       dns = Curl_cache_addr(data, addr, hostname, port);
1456
1457       if(data->share)
1458         Curl_share_unlock(data, CURL_LOCK_DATA_DNS);
1459
1460       if(!dns)
1461         return CURLE_OUT_OF_MEMORY;
1462     }
1463   }
1464   data->change.resolve = NULL; /* dealt with now */
1465
1466   return CURLE_OK;
1467 }
1468
1469
1470 /*
1471  * Curl_pretransfer() is called immediately before a transfer starts.
1472  */
1473 CURLcode Curl_pretransfer(struct SessionHandle *data)
1474 {
1475   CURLcode res;
1476   if(!data->change.url) {
1477     /* we can't do anything without URL */
1478     failf(data, "No URL set!");
1479     return CURLE_URL_MALFORMAT;
1480   }
1481
1482   /* Init the SSL session ID cache here. We do it here since we want to do it
1483      after the *_setopt() calls (that could change the size of the cache) but
1484      before any transfer takes place. */
1485   res = Curl_ssl_initsessions(data, data->set.ssl.numsessions);
1486   if(res)
1487     return res;
1488
1489   data->set.followlocation=0; /* reset the location-follow counter */
1490   data->state.this_is_a_follow = FALSE; /* reset this */
1491   data->state.errorbuf = FALSE; /* no error has occurred */
1492   data->state.httpversion = 0; /* don't assume any particular server version */
1493
1494   data->state.ssl_connect_retry = FALSE;
1495
1496   data->state.authproblem = FALSE;
1497   data->state.authhost.want = data->set.httpauth;
1498   data->state.authproxy.want = data->set.proxyauth;
1499   Curl_safefree(data->info.wouldredirect);
1500   data->info.wouldredirect = NULL;
1501
1502   /* If there is a list of cookie files to read, do it now! */
1503   if(data->change.cookielist)
1504     Curl_cookie_loadfiles(data);
1505
1506   /* If there is a list of host pairs to deal with */
1507   if(data->change.resolve)
1508     res = loadhostpairs(data);
1509
1510   if(!res) {
1511     /* Allow data->set.use_port to set which port to use. This needs to be
1512      * disabled for example when we follow Location: headers to URLs using
1513      * different ports! */
1514     data->state.allow_port = TRUE;
1515
1516 #if defined(HAVE_SIGNAL) && defined(SIGPIPE) && !defined(HAVE_MSG_NOSIGNAL)
1517     /*************************************************************
1518      * Tell signal handler to ignore SIGPIPE
1519      *************************************************************/
1520     if(!data->set.no_signal)
1521       data->state.prev_signal = signal(SIGPIPE, SIG_IGN);
1522 #endif
1523
1524     Curl_initinfo(data); /* reset session-specific information "variables" */
1525     Curl_pgrsStartNow(data);
1526
1527     if(data->set.timeout)
1528       Curl_expire(data, data->set.timeout);
1529
1530     if(data->set.connecttimeout)
1531       Curl_expire(data, data->set.connecttimeout);
1532   }
1533
1534   return res;
1535 }
1536
1537 /*
1538  * Curl_posttransfer() is called immediately after a transfer ends
1539  */
1540 CURLcode Curl_posttransfer(struct SessionHandle *data)
1541 {
1542 #if defined(HAVE_SIGNAL) && defined(SIGPIPE) && !defined(HAVE_MSG_NOSIGNAL)
1543   /* restore the signal handler for SIGPIPE before we get back */
1544   if(!data->set.no_signal)
1545     signal(SIGPIPE, data->state.prev_signal);
1546 #else
1547   (void)data; /* unused parameter */
1548 #endif
1549
1550   return CURLE_OK;
1551 }
1552
1553 #ifndef CURL_DISABLE_HTTP
1554 /*
1555  * strlen_url() returns the length of the given URL if the spaces within the
1556  * URL were properly URL encoded.
1557  */
1558 static size_t strlen_url(const char *url)
1559 {
1560   const char *ptr;
1561   size_t newlen=0;
1562   bool left=TRUE; /* left side of the ? */
1563
1564   for(ptr=url; *ptr; ptr++) {
1565     switch(*ptr) {
1566     case '?':
1567       left=FALSE;
1568       /* fall through */
1569     default:
1570       newlen++;
1571       break;
1572     case ' ':
1573       if(left)
1574         newlen+=3;
1575       else
1576         newlen++;
1577       break;
1578     }
1579   }
1580   return newlen;
1581 }
1582
1583 /* strcpy_url() copies a url to a output buffer and URL-encodes the spaces in
1584  * the source URL accordingly.
1585  */
1586 static void strcpy_url(char *output, const char *url)
1587 {
1588   /* we must add this with whitespace-replacing */
1589   bool left=TRUE;
1590   const char *iptr;
1591   char *optr = output;
1592   for(iptr = url;    /* read from here */
1593       *iptr;         /* until zero byte */
1594       iptr++) {
1595     switch(*iptr) {
1596     case '?':
1597       left=FALSE;
1598       /* fall through */
1599     default:
1600       *optr++=*iptr;
1601       break;
1602     case ' ':
1603       if(left) {
1604         *optr++='%'; /* add a '%' */
1605         *optr++='2'; /* add a '2' */
1606         *optr++='0'; /* add a '0' */
1607       }
1608       else
1609         *optr++='+'; /* add a '+' here */
1610       break;
1611     }
1612   }
1613   *optr=0; /* zero terminate output buffer */
1614
1615 }
1616
1617 /*
1618  * Returns true if the given URL is absolute (as opposed to relative)
1619  */
1620 static bool is_absolute_url(const char *url)
1621 {
1622   char prot[16]; /* URL protocol string storage */
1623   char letter;   /* used for a silly sscanf */
1624
1625   return (bool)(2 == sscanf(url, "%15[^?&/:]://%c", prot, &letter));
1626 }
1627
1628 /*
1629  * Concatenate a relative URL to a base URL making it absolute.
1630  * URL-encodes any spaces.
1631  * The returned pointer must be freed by the caller unless NULL
1632  * (returns NULL on out of memory).
1633  */
1634 static char *concat_url(const char *base, const char *relurl)
1635 {
1636   /***
1637    TRY to append this new path to the old URL
1638    to the right of the host part. Oh crap, this is doomed to cause
1639    problems in the future...
1640   */
1641   char *newest;
1642   char *protsep;
1643   char *pathsep;
1644   size_t newlen;
1645
1646   const char *useurl = relurl;
1647   size_t urllen;
1648
1649   /* we must make our own copy of the URL to play with, as it may
1650      point to read-only data */
1651   char *url_clone=strdup(base);
1652
1653   if(!url_clone)
1654     return NULL; /* skip out of this NOW */
1655
1656   /* protsep points to the start of the host name */
1657   protsep=strstr(url_clone, "//");
1658   if(!protsep)
1659     protsep=url_clone;
1660   else
1661     protsep+=2; /* pass the slashes */
1662
1663   if('/' != relurl[0]) {
1664     int level=0;
1665
1666     /* First we need to find out if there's a ?-letter in the URL,
1667        and cut it and the right-side of that off */
1668     pathsep = strchr(protsep, '?');
1669     if(pathsep)
1670       *pathsep=0;
1671
1672     /* we have a relative path to append to the last slash if there's one
1673        available, or if the new URL is just a query string (starts with a
1674        '?')  we append the new one at the end of the entire currently worked
1675        out URL */
1676     if(useurl[0] != '?') {
1677       pathsep = strrchr(protsep, '/');
1678       if(pathsep)
1679         *pathsep=0;
1680     }
1681
1682     /* Check if there's any slash after the host name, and if so, remember
1683        that position instead */
1684     pathsep = strchr(protsep, '/');
1685     if(pathsep)
1686       protsep = pathsep+1;
1687     else
1688       protsep = NULL;
1689
1690     /* now deal with one "./" or any amount of "../" in the newurl
1691        and act accordingly */
1692
1693     if((useurl[0] == '.') && (useurl[1] == '/'))
1694       useurl+=2; /* just skip the "./" */
1695
1696     while((useurl[0] == '.') &&
1697           (useurl[1] == '.') &&
1698           (useurl[2] == '/')) {
1699       level++;
1700       useurl+=3; /* pass the "../" */
1701     }
1702
1703     if(protsep) {
1704       while(level--) {
1705         /* cut off one more level from the right of the original URL */
1706         pathsep = strrchr(protsep, '/');
1707         if(pathsep)
1708           *pathsep=0;
1709         else {
1710           *protsep=0;
1711           break;
1712         }
1713       }
1714     }
1715   }
1716   else {
1717     /* We got a new absolute path for this server, cut off from the
1718        first slash */
1719     pathsep = strchr(protsep, '/');
1720     if(pathsep) {
1721       /* When people use badly formatted URLs, such as
1722          "http://www.url.com?dir=/home/daniel" we must not use the first
1723          slash, if there's a ?-letter before it! */
1724       char *sep = strchr(protsep, '?');
1725       if(sep && (sep < pathsep))
1726         pathsep = sep;
1727       *pathsep=0;
1728     }
1729     else {
1730       /* There was no slash. Now, since we might be operating on a badly
1731          formatted URL, such as "http://www.url.com?id=2380" which doesn't
1732          use a slash separator as it is supposed to, we need to check for a
1733          ?-letter as well! */
1734       pathsep = strchr(protsep, '?');
1735       if(pathsep)
1736         *pathsep=0;
1737     }
1738   }
1739
1740   /* If the new part contains a space, this is a mighty stupid redirect
1741      but we still make an effort to do "right". To the left of a '?'
1742      letter we replace each space with %20 while it is replaced with '+'
1743      on the right side of the '?' letter.
1744   */
1745   newlen = strlen_url(useurl);
1746
1747   urllen = strlen(url_clone);
1748
1749   newest = malloc( urllen + 1 + /* possible slash */
1750                          newlen + 1 /* zero byte */);
1751
1752   if(!newest) {
1753     free(url_clone); /* don't leak this */
1754     return NULL;
1755   }
1756
1757   /* copy over the root url part */
1758   memcpy(newest, url_clone, urllen);
1759
1760   /* check if we need to append a slash */
1761   if(('/' == useurl[0]) || (protsep && !*protsep) || ('?' == useurl[0]))
1762     ;
1763   else
1764     newest[urllen++]='/';
1765
1766   /* then append the new piece on the right side */
1767   strcpy_url(&newest[urllen], useurl);
1768
1769   free(url_clone);
1770
1771   return newest;
1772 }
1773 #endif /* CURL_DISABLE_HTTP */
1774
1775 /*
1776  * Curl_follow() handles the URL redirect magic. Pass in the 'newurl' string
1777  * as given by the remote server and set up the new URL to request.
1778  */
1779 CURLcode Curl_follow(struct SessionHandle *data,
1780                      char *newurl, /* this 'newurl' is the Location: string,
1781                                       and it must be malloc()ed before passed
1782                                       here */
1783                      followtype type) /* see transfer.h */
1784 {
1785 #ifdef CURL_DISABLE_HTTP
1786   (void)data;
1787   (void)newurl;
1788   (void)type;
1789   /* Location: following will not happen when HTTP is disabled */
1790   return CURLE_TOO_MANY_REDIRECTS;
1791 #else
1792
1793   /* Location: redirect */
1794   bool disallowport = FALSE;
1795
1796   if(type == FOLLOW_REDIR) {
1797     if((data->set.maxredirs != -1) &&
1798         (data->set.followlocation >= data->set.maxredirs)) {
1799       failf(data,"Maximum (%ld) redirects followed", data->set.maxredirs);
1800       return CURLE_TOO_MANY_REDIRECTS;
1801     }
1802
1803     /* mark the next request as a followed location: */
1804     data->state.this_is_a_follow = TRUE;
1805
1806     data->set.followlocation++; /* count location-followers */
1807
1808     if(data->set.http_auto_referer) {
1809       /* We are asked to automatically set the previous URL as the referer
1810          when we get the next URL. We pick the ->url field, which may or may
1811          not be 100% correct */
1812
1813       if(data->change.referer_alloc)
1814         /* If we already have an allocated referer, free this first */
1815         free(data->change.referer);
1816
1817       data->change.referer = strdup(data->change.url);
1818       if (!data->change.referer) {
1819         data->change.referer_alloc = FALSE;
1820         return CURLE_OUT_OF_MEMORY;
1821       }
1822       data->change.referer_alloc = TRUE; /* yes, free this later */
1823     }
1824   }
1825
1826   if(!is_absolute_url(newurl))  {
1827     /***
1828      *DANG* this is an RFC 2068 violation. The URL is supposed
1829      to be absolute and this doesn't seem to be that!
1830      */
1831     char *absolute = concat_url(data->change.url, newurl);
1832     if (!absolute)
1833       return CURLE_OUT_OF_MEMORY;
1834     free(newurl);
1835     newurl = absolute;
1836   }
1837   else {
1838     /* This is an absolute URL, don't allow the custom port number */
1839     disallowport = TRUE;
1840
1841     if(strchr(newurl, ' ')) {
1842       /* This new URL contains at least one space, this is a mighty stupid
1843          redirect but we still make an effort to do "right". */
1844       char *newest;
1845       size_t newlen = strlen_url(newurl);
1846
1847       newest = malloc(newlen+1); /* get memory for this */
1848       if (!newest)
1849         return CURLE_OUT_OF_MEMORY;
1850       strcpy_url(newest, newurl); /* create a space-free URL */
1851
1852       free(newurl); /* that was no good */
1853       newurl = newest; /* use this instead now */
1854     }
1855
1856   }
1857
1858   if(type == FOLLOW_FAKE) {
1859     /* we're only figuring out the new url if we would've followed locations
1860        but now we're done so we can get out! */
1861     data->info.wouldredirect = newurl;
1862     return CURLE_OK;
1863   }
1864
1865   if(disallowport)
1866     data->state.allow_port = FALSE;
1867
1868   if(data->change.url_alloc)
1869     free(data->change.url);
1870   else
1871     data->change.url_alloc = TRUE; /* the URL is allocated */
1872
1873   data->change.url = newurl;
1874   newurl = NULL; /* don't free! */
1875
1876   infof(data, "Issue another request to this URL: '%s'\n", data->change.url);
1877
1878   /*
1879    * We get here when the HTTP code is 300-399 (and 401). We need to perform
1880    * differently based on exactly what return code there was.
1881    *
1882    * News from 7.10.6: we can also get here on a 401 or 407, in case we act on
1883    * a HTTP (proxy-) authentication scheme other than Basic.
1884    */
1885   switch(data->info.httpcode) {
1886     /* 401 - Act on a WWW-Authenticate, we keep on moving and do the
1887        Authorization: XXXX header in the HTTP request code snippet */
1888     /* 407 - Act on a Proxy-Authenticate, we keep on moving and do the
1889        Proxy-Authorization: XXXX header in the HTTP request code snippet */
1890     /* 300 - Multiple Choices */
1891     /* 306 - Not used */
1892     /* 307 - Temporary Redirect */
1893   default:  /* for all above (and the unknown ones) */
1894     /* Some codes are explicitly mentioned since I've checked RFC2616 and they
1895      * seem to be OK to POST to.
1896      */
1897     break;
1898   case 301: /* Moved Permanently */
1899     /* (quote from RFC2616, section 10.3.2):
1900      *
1901      * Note: When automatically redirecting a POST request after receiving a
1902      * 301 status code, some existing HTTP/1.0 user agents will erroneously
1903      * change it into a GET request.
1904      *
1905      * ----
1906      *
1907      * Warning: Because most of importants user agents do this obvious RFC2616
1908      * violation, many webservers expect this misbehavior. So these servers
1909      * often answers to a POST request with an error page.  To be sure that
1910      * libcurl gets the page that most user agents would get, libcurl has to
1911      * force GET.
1912      *
1913      * This behaviour can be overridden with CURLOPT_POSTREDIR.
1914      */
1915     if( (data->set.httpreq == HTTPREQ_POST
1916          || data->set.httpreq == HTTPREQ_POST_FORM)
1917         && !data->set.post301) {
1918       infof(data,
1919             "Violate RFC 2616/10.3.2 and switch from POST to GET\n");
1920       data->set.httpreq = HTTPREQ_GET;
1921     }
1922     break;
1923   case 302: /* Found */
1924     /* (From 10.3.3)
1925
1926     Note: RFC 1945 and RFC 2068 specify that the client is not allowed
1927     to change the method on the redirected request.  However, most
1928     existing user agent implementations treat 302 as if it were a 303
1929     response, performing a GET on the Location field-value regardless
1930     of the original request method. The status codes 303 and 307 have
1931     been added for servers that wish to make unambiguously clear which
1932     kind of reaction is expected of the client.
1933
1934     (From 10.3.4)
1935
1936     Note: Many pre-HTTP/1.1 user agents do not understand the 303
1937     status. When interoperability with such clients is a concern, the
1938     302 status code may be used instead, since most user agents react
1939     to a 302 response as described here for 303.
1940
1941     This behaviour can be overriden with CURLOPT_POSTREDIR
1942     */
1943     if( (data->set.httpreq == HTTPREQ_POST
1944          || data->set.httpreq == HTTPREQ_POST_FORM)
1945         && !data->set.post302) {
1946       infof(data,
1947             "Violate RFC 2616/10.3.3 and switch from POST to GET\n");
1948       data->set.httpreq = HTTPREQ_GET;
1949     }
1950     break;
1951
1952   case 303: /* See Other */
1953     /* Disable both types of POSTs, since doing a second POST when
1954      * following isn't what anyone would want! */
1955     if(data->set.httpreq != HTTPREQ_GET) {
1956       data->set.httpreq = HTTPREQ_GET; /* enforce GET request */
1957       infof(data, "Disables POST, goes with %s\n",
1958             data->set.opt_no_body?"HEAD":"GET");
1959     }
1960     break;
1961   case 304: /* Not Modified */
1962     /* 304 means we did a conditional request and it was "Not modified".
1963      * We shouldn't get any Location: header in this response!
1964      */
1965     break;
1966   case 305: /* Use Proxy */
1967     /* (quote from RFC2616, section 10.3.6):
1968      * "The requested resource MUST be accessed through the proxy given
1969      * by the Location field. The Location field gives the URI of the
1970      * proxy.  The recipient is expected to repeat this single request
1971      * via the proxy. 305 responses MUST only be generated by origin
1972      * servers."
1973      */
1974     break;
1975   }
1976   Curl_pgrsTime(data, TIMER_REDIRECT);
1977   Curl_pgrsResetTimes(data);
1978
1979   return CURLE_OK;
1980 #endif /* CURL_DISABLE_HTTP */
1981 }
1982
1983 static CURLcode
1984 connect_host(struct SessionHandle *data,
1985              struct connectdata **conn)
1986 {
1987   CURLcode res = CURLE_OK;
1988
1989   bool async;
1990   bool protocol_done=TRUE; /* will be TRUE always since this is only used
1991                                 within the easy interface */
1992   Curl_pgrsTime(data, TIMER_STARTSINGLE);
1993   res = Curl_connect(data, conn, &async, &protocol_done);
1994
1995   if((CURLE_OK == res) && async) {
1996     /* Now, if async is TRUE here, we need to wait for the name
1997        to resolve */
1998     res = Curl_wait_for_resolv(*conn, NULL);
1999     if(CURLE_OK == res)
2000       /* Resolved, continue with the connection */
2001       res = Curl_async_resolved(*conn, &protocol_done);
2002     else
2003       /* if we can't resolve, we kill this "connection" now */
2004       (void)Curl_disconnect(*conn, /* dead_connection */ FALSE);
2005   }
2006
2007   return res;
2008 }
2009
2010 CURLcode
2011 Curl_reconnect_request(struct connectdata **connp)
2012 {
2013   CURLcode result = CURLE_OK;
2014   struct connectdata *conn = *connp;
2015   struct SessionHandle *data = conn->data;
2016
2017   /* This was a re-use of a connection and we got a write error in the
2018    * DO-phase. Then we DISCONNECT this connection and have another attempt to
2019    * CONNECT and then DO again! The retry cannot possibly find another
2020    * connection to re-use, since we only keep one possible connection for
2021    * each.  */
2022
2023   infof(data, "Re-used connection seems dead, get a new one\n");
2024
2025   conn->bits.close = TRUE; /* enforce close of this connection */
2026   result = Curl_done(&conn, result, FALSE); /* we are so done with this */
2027
2028   /* conn may no longer be a good pointer */
2029
2030   /*
2031    * According to bug report #1330310. We need to check for CURLE_SEND_ERROR
2032    * here as well. I figure this could happen when the request failed on a FTP
2033    * connection and thus Curl_done() itself tried to use the connection
2034    * (again). Slight Lack of feedback in the report, but I don't think this
2035    * extra check can do much harm.
2036    */
2037   if((CURLE_OK == result) || (CURLE_SEND_ERROR == result)) {
2038     bool async;
2039     bool protocol_done = TRUE;
2040
2041     /* Now, redo the connect and get a new connection */
2042     result = Curl_connect(data, connp, &async, &protocol_done);
2043     if(CURLE_OK == result) {
2044       /* We have connected or sent away a name resolve query fine */
2045
2046       conn = *connp; /* setup conn to again point to something nice */
2047       if(async) {
2048         /* Now, if async is TRUE here, we need to wait for the name
2049            to resolve */
2050         result = Curl_wait_for_resolv(conn, NULL);
2051         if(result)
2052           return result;
2053
2054         /* Resolved, continue with the connection */
2055         result = Curl_async_resolved(conn, &protocol_done);
2056         if(result)
2057           return result;
2058       }
2059     }
2060   }
2061
2062   return result;
2063 }
2064
2065 /* Returns CURLE_OK *and* sets '*url' if a request retry is wanted.
2066
2067    NOTE: that the *url is malloc()ed. */
2068 CURLcode Curl_retry_request(struct connectdata *conn,
2069                             char **url)
2070 {
2071   struct SessionHandle *data = conn->data;
2072
2073   *url = NULL;
2074
2075   /* if we're talking upload, we can't do the checks below, unless the protocol
2076      is HTTP as when uploading over HTTP we will still get a response */
2077   if(data->set.upload &&
2078      !(conn->handler->protocol&(CURLPROTO_HTTP|CURLPROTO_RTSP)))
2079     return CURLE_OK;
2080
2081   if(/* workaround for broken TLS servers */ data->state.ssl_connect_retry ||
2082       ((data->req.bytecount +
2083         data->req.headerbytecount == 0) &&
2084         conn->bits.reuse &&
2085         !data->set.opt_no_body &&
2086         data->set.rtspreq != RTSPREQ_RECEIVE)) {
2087     /* We got no data, we attempted to re-use a connection and yet we want a
2088        "body". This might happen if the connection was left alive when we were
2089        done using it before, but that was closed when we wanted to read from
2090        it again. Bad luck. Retry the same request on a fresh connect! */
2091     infof(conn->data, "Connection died, retrying a fresh connect\n");
2092     *url = strdup(conn->data->change.url);
2093     if(!*url)
2094       return CURLE_OUT_OF_MEMORY;
2095
2096     conn->bits.close = TRUE; /* close this connection */
2097     conn->bits.retry = TRUE; /* mark this as a connection we're about
2098                                 to retry. Marking it this way should
2099                                 prevent i.e HTTP transfers to return
2100                                 error just because nothing has been
2101                                 transfered! */
2102
2103     if(data->state.proto.http->writebytecount)
2104       Curl_readrewind(conn);
2105   }
2106   return CURLE_OK;
2107 }
2108
2109 static CURLcode Curl_do_perform(struct SessionHandle *data)
2110 {
2111   CURLcode res;
2112   CURLcode res2;
2113   struct connectdata *conn=NULL;
2114   char *newurl = NULL; /* possibly a new URL to follow to! */
2115   followtype follow = FOLLOW_NONE;
2116
2117   data->state.used_interface = Curl_if_easy;
2118
2119   res = Curl_pretransfer(data);
2120   if(res)
2121     return res;
2122
2123   /*
2124    * It is important that there is NO 'return' from this function at any other
2125    * place than falling down to the end of the function! This is because we
2126    * have cleanup stuff that must be done before we get back, and that is only
2127    * performed after this do-while loop.
2128    */
2129
2130   for(;;) {
2131     res = connect_host(data, &conn);   /* primary connection */
2132
2133     if(res == CURLE_OK) {
2134       bool do_done;
2135       if(data->set.connect_only) {
2136         /* keep connection open for application to use the socket */
2137         conn->bits.close = FALSE;
2138         res = Curl_done(&conn, CURLE_OK, FALSE);
2139         break;
2140       }
2141       res = Curl_do(&conn, &do_done);
2142
2143       if(res == CURLE_OK) {
2144         if(conn->data->set.wildcardmatch) {
2145           if(conn->data->wildcard.state == CURLWC_DONE ||
2146              conn->data->wildcard.state == CURLWC_SKIP) {
2147             /* keep connection open for application to use the socket */
2148             conn->bits.close = FALSE;
2149             res = Curl_done(&conn, CURLE_OK, FALSE);
2150             break;
2151           }
2152         }
2153         res = Transfer(conn); /* now fetch that URL please */
2154         if((res == CURLE_OK) || (res == CURLE_RECV_ERROR)) {
2155           bool retry = FALSE;
2156           CURLcode rc = Curl_retry_request(conn, &newurl);
2157           if(rc)
2158             res = rc;
2159           else
2160             retry = (newurl?TRUE:FALSE);
2161
2162           if(retry) {
2163             /* we know (newurl != NULL) at this point */
2164             res = CURLE_OK;
2165             follow = FOLLOW_RETRY;
2166           }
2167           else if (res == CURLE_OK) {
2168             /*
2169              * We must duplicate the new URL here as the connection data may
2170              * be free()ed in the Curl_done() function. We prefer the newurl
2171              * one since that's used for redirects or just further requests
2172              * for retries or multi-stage HTTP auth methods etc.
2173              */
2174             if(data->req.newurl) {
2175               follow = FOLLOW_REDIR;
2176               newurl = strdup(data->req.newurl);
2177               if (!newurl)
2178                 res = CURLE_OUT_OF_MEMORY;
2179             }
2180             else if(data->req.location) {
2181               follow = FOLLOW_FAKE;
2182               newurl = strdup(data->req.location);
2183               if (!newurl)
2184                 res = CURLE_OUT_OF_MEMORY;
2185             }
2186           }
2187
2188           /* in the above cases where 'newurl' gets assigned, we have a fresh
2189            * allocated memory pointed to */
2190         }
2191         if(res != CURLE_OK) {
2192           /* The transfer phase returned error, we mark the connection to get
2193            * closed to prevent being re-used. This is because we can't
2194            * possibly know if the connection is in a good shape or not now. */
2195           conn->bits.close = TRUE;
2196
2197           if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET]) {
2198             /* if we failed anywhere, we must clean up the secondary socket if
2199                it was used */
2200             sclose(conn->sock[SECONDARYSOCKET]);
2201             conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD;
2202           }
2203         }
2204
2205         /* Always run Curl_done(), even if some of the previous calls
2206            failed, but return the previous (original) error code */
2207         res2 = Curl_done(&conn, res, FALSE);
2208
2209         if(CURLE_OK == res)
2210           res = res2;
2211       }
2212       else if(conn)
2213         /* Curl_do() failed, clean up left-overs in the done-call, but note
2214            that at some cases the conn pointer is NULL when Curl_do() failed
2215            and the connection cache is very small so only call Curl_done() if
2216            conn is still "alive". */
2217         /* ignore return code since we already have an error to return */
2218         (void)Curl_done(&conn, res, FALSE);
2219
2220       /*
2221        * Important: 'conn' cannot be used here, since it may have been closed
2222        * in 'Curl_done' or other functions.
2223        */
2224
2225       if((res == CURLE_OK) && follow) {
2226         res = Curl_follow(data, newurl, follow);
2227         if(CURLE_OK == res) {
2228           /* if things went fine, Curl_follow() freed or otherwise took
2229              responsibility for the newurl pointer */
2230           newurl = NULL;
2231           if(follow >= FOLLOW_RETRY) {
2232             follow = FOLLOW_NONE;
2233             continue;
2234           }
2235           /* else we break out of the loop below */
2236         }
2237       }
2238     }
2239     break; /* it only reaches here when this shouldn't loop */
2240
2241   } /* loop if Location: */
2242
2243   if(newurl)
2244     free(newurl);
2245
2246   if(res && !data->state.errorbuf) {
2247     /*
2248      * As an extra precaution: if no error string has been set and there was
2249      * an error, use the strerror() string or if things are so bad that not
2250      * even that is good, set a bad string that mentions the error code.
2251      */
2252     const char *str = curl_easy_strerror(res);
2253     if(!str)
2254       failf(data, "unspecified error %d", (int)res);
2255     else
2256       failf(data, "%s", str);
2257   }
2258
2259   /* run post-transfer unconditionally, but don't clobber the return code if
2260      we already have an error code recorder */
2261   res2 = Curl_posttransfer(data);
2262   if(!res && res2)
2263     res = res2;
2264
2265   return res;
2266 }
2267
2268 /*
2269  * Curl_perform() is the internal high-level function that gets called by the
2270  * external curl_easy_perform() function. It inits, performs and cleans up a
2271  * single file transfer.
2272  */
2273 CURLcode Curl_perform(struct SessionHandle *data)
2274 {
2275   CURLcode res;
2276   if(!data->set.wildcardmatch)
2277     return Curl_do_perform(data);
2278
2279   /* init main wildcard structures */
2280   res = Curl_wildcard_init(&data->wildcard);
2281   if(res)
2282     return res;
2283
2284   res = Curl_do_perform(data);
2285   if(res) {
2286     Curl_wildcard_dtor(&data->wildcard);
2287     return res;
2288   }
2289
2290   /* wildcard loop */
2291   while(!res && data->wildcard.state != CURLWC_DONE)
2292     res = Curl_do_perform(data);
2293
2294   Curl_wildcard_dtor(&data->wildcard);
2295
2296   /* wildcard download finished or failed */
2297   data->wildcard.state = CURLWC_INIT;
2298   return res;
2299 }
2300
2301 /*
2302  * Curl_setup_transfer() is called to setup some basic properties for the
2303  * upcoming transfer.
2304  */
2305 void
2306 Curl_setup_transfer(
2307   struct connectdata *conn, /* connection data */
2308   int sockindex,            /* socket index to read from or -1 */
2309   curl_off_t size,          /* -1 if unknown at this point */
2310   bool getheader,           /* TRUE if header parsing is wanted */
2311   curl_off_t *bytecountp,   /* return number of bytes read or NULL */
2312   int writesockindex,       /* socket index to write to, it may very well be
2313                                the same we read from. -1 disables */
2314   curl_off_t *writecountp   /* return number of bytes written or NULL */
2315   )
2316 {
2317   struct SessionHandle *data;
2318   struct SingleRequest *k;
2319
2320   DEBUGASSERT(conn != NULL);
2321
2322   data = conn->data;
2323   k = &data->req;
2324
2325   DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
2326
2327   /* now copy all input parameters */
2328   conn->sockfd = sockindex == -1 ?
2329       CURL_SOCKET_BAD : conn->sock[sockindex];
2330   conn->writesockfd = writesockindex == -1 ?
2331       CURL_SOCKET_BAD:conn->sock[writesockindex];
2332   k->getheader = getheader;
2333
2334   k->size = size;
2335   k->bytecountp = bytecountp;
2336   k->writebytecountp = writecountp;
2337
2338   /* The code sequence below is placed in this function just because all
2339      necessary input is not always known in do_complete() as this function may
2340      be called after that */
2341
2342   if(!k->getheader) {
2343     k->header = FALSE;
2344     if(size > 0)
2345       Curl_pgrsSetDownloadSize(data, size);
2346   }
2347   /* we want header and/or body, if neither then don't do this! */
2348   if(k->getheader || !data->set.opt_no_body) {
2349
2350     if(conn->sockfd != CURL_SOCKET_BAD)
2351       k->keepon |= KEEP_RECV;
2352
2353     if(conn->writesockfd != CURL_SOCKET_BAD) {
2354       /* HTTP 1.1 magic:
2355
2356          Even if we require a 100-return code before uploading data, we might
2357          need to write data before that since the REQUEST may not have been
2358          finished sent off just yet.
2359
2360          Thus, we must check if the request has been sent before we set the
2361          state info where we wait for the 100-return code
2362       */
2363       if((data->state.expect100header) &&
2364          (data->state.proto.http->sending == HTTPSEND_BODY)) {
2365         /* wait with write until we either got 100-continue or a timeout */
2366         k->exp100 = EXP100_AWAITING_CONTINUE;
2367         k->start100 = k->start;
2368
2369         /* set a timeout for the multi interface */
2370         Curl_expire(data, CURL_TIMEOUT_EXPECT_100);
2371       }
2372       else {
2373         if(data->state.expect100header)
2374           /* when we've sent off the rest of the headers, we must await a
2375              100-continue but first finish sending the request */
2376           k->exp100 = EXP100_SENDING_REQUEST;
2377
2378         /* enable the write bit when we're not waiting for continue */
2379         k->keepon |= KEEP_SEND;
2380       }
2381     } /* if(conn->writesockfd != CURL_SOCKET_BAD) */
2382   } /* if(k->getheader || !data->set.opt_no_body) */
2383
2384 }