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