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