26 #ifdef HAVE_NETINET_IN_H 27 #include <netinet/in.h> 32 #ifdef HAVE_ARPA_INET_H 33 #include <arpa/inet.h> 38 #ifdef HAVE_SYS_IOCTL_H 39 #include <sys/ioctl.h> 45 #ifdef HAVE_SYS_PARAM_H 46 #include <sys/param.h> 49 #ifdef HAVE_SYS_SELECT_H 50 #include <sys/select.h> 54 #error "We can't compile without socket() support!" 84 #if !defined(CURL_DISABLE_HTTP) || !defined(CURL_DISABLE_SMTP) || \ 85 !defined(CURL_DISABLE_IMAP) 93 const char *thisheader)
96 size_t thislen = strlen(thisheader);
115 size_t buffersize = (
size_t)bytes;
117 #ifdef CURL_DOES_CONVERSIONS 118 bool sending_http_headers =
FALSE;
126 sending_http_headers =
TRUE;
132 buffersize -= (8 + 2 + 2);
142 failf(data,
"operation aborted by callback");
153 failf(data,
"Read callback asked for PAUSE when not supported!");
167 else if((
size_t)nread > buffersize) {
170 failf(data,
"read function returned funny value");
191 const char *endofline_native;
192 const char *endofline_network;
201 endofline_native =
"\n";
202 endofline_network =
"\x0a";
205 endofline_native =
"\r\n";
206 endofline_network =
"\x0d\x0a";
208 hexlen =
snprintf(hexbuffer,
sizeof(hexbuffer),
209 "%x%s", nread, endofline_native);
221 strlen(endofline_network));
223 #ifdef CURL_DOES_CONVERSIONS 232 length = (int)strlen(hexbuffer);
241 if((nread - hexlen) == 0)
245 nread += (int)strlen(endofline_native);
247 #ifdef CURL_DOES_CONVERSIONS 295 failf(data,
"Cannot rewind mime/post data");
305 failf(data,
"seek callback returned error %d", (
int)err);
314 infof(data,
"the ioctl callback returned %d\n", (
int)err);
318 failf(data,
"ioctl callback returned error %d", (
int)err);
327 if(-1 != fseek(data->
state.
in, 0, SEEK_SET))
333 failf(data,
"necessary data rewind wasn't possible");
345 #
if defined(USE_NGHTTP2)
383 "Buffer after stream rewind (read_pos = %zu): [%s]\n",
401 if(timeofdoc <= data->
set.timevalue) {
403 "The requested document is not new enough\n");
411 "The requested document is not old enough\n");
432 int *didwhat,
bool *done,
438 bool is_empty_data =
FALSE;
439 bool readmore =
FALSE;
449 size_t bytestoread = buffersize;
452 #
if defined(USE_NGHTTP2)
468 bytestoread = (
size_t)totalleft;
485 DEBUGF(
infof(data,
"readwrite_data: we're done!\n"));
501 if(0 < nread || is_empty_data) {
504 else if(0 >= nread) {
507 DEBUGF(
infof(data,
"nread <= 0, server closed connection, bailing\n"));
524 #ifndef CURL_DISABLE_HTTP 529 bool stop_reading =
FALSE;
549 "Rewinding stream by : %zd" 550 " bytes on url %s (zero-length body)\n",
556 "Excess found in a non pipelined read:" 558 " url = %s (zero-length body)\n",
572 if(k->
str && !k->
header && (nread > 0 || is_empty_data)) {
581 #ifndef CURL_DISABLE_HTTP 600 infof(data,
"Ignoring the response-body\n");
609 infof(data,
"The entire document is already downloaded");
620 failf(data,
"HTTP server doesn't seem to support " 621 "byte ranges. Cannot resume.");
636 infof(data,
"Simulate a HTTP 304 response!\n");
639 connclose(conn,
"Simulated 304 handling");
657 k->
str, (
size_t)nread, conn);
661 k->
str, (
size_t)nread, conn);
664 #ifndef CURL_DISABLE_HTTP 678 failf(data,
"Failed writing data");
697 infof(conn->
data,
"Leftovers after chunking: %zu bytes\n",
701 infof(conn->
data,
"Rewinding %zu bytes\n",dataleft);
712 DEBUGF(
infof(data,
"Increasing bytecount by %zu from hbuflen\n",
724 "Rewinding stream by : %zu" 734 "Excess found in a non pipelined read:" 790 #ifndef CURL_DISABLE_POP3 815 failf(data,
"Unrecognized content encoding type. " 816 "libcurl understands `identity', `deflate' and `gzip' " 817 "content encodings.");
865 infof(data,
"we are done reading and this is set to close, stop send\n");
899 bool sending_http_headers =
FALSE;
940 sending_http_headers =
TRUE;
942 sending_http_headers =
FALSE;
969 if((!sending_http_headers) && (
979 failf(data,
"Failed to alloc scratch buffer!");
991 for(i = 0, si = 0; i < nread; i++, si++) {
1019 #ifndef CURL_DISABLE_SMTP 1045 (
size_t)bytes_written, conn);
1052 infof(data,
"We are completely uploaded and fine\n");
1121 DEBUGF(
infof(data,
"Curl_readwrite: forcibly told to drain data\n"));
1129 failf(data,
"select/poll returned error");
1139 result =
readwrite_data(data, conn, k, &didwhat, done, comeback);
1183 infof(data,
"Done waiting for 100-continue\n");
1198 failf(data,
"Operation timed out after %ld milliseconds with %" 1205 failf(data,
"Operation timed out after %ld milliseconds with %" 1243 failf(data,
"transfer closed with outstanding read data remaining");
1271 unsigned sockindex = 0;
1286 sock[sockindex] = conn->
sockfd;
1328 failf(data,
"No URL set!");
1379 #if defined(HAVE_SIGNAL) && defined(SIGPIPE) && !defined(HAVE_MSG_NOSIGNAL) 1384 data->
state.prev_signal = signal(SIGPIPE, SIG_IGN);
1421 #if defined(HAVE_SIGNAL) && defined(SIGPIPE) && !defined(HAVE_MSG_NOSIGNAL) 1424 signal(SIGPIPE, data->
state.prev_signal);
1432 #ifndef CURL_DISABLE_HTTP 1443 sep = strstr(url,
"//");
1449 query = strchr(sep,
'?');
1450 sep = strchr(sep,
'/');
1453 sep = url + strlen(url);
1456 query = url + strlen(url);
1458 return sep < query ? sep : query;
1469 const unsigned char *
ptr;
1472 const unsigned char *host_sep = (
const unsigned char *) url;
1477 for(ptr = (
unsigned char *)url; *
ptr; ptr++) {
1479 if(ptr < host_sep) {
1513 const unsigned char *iptr;
1515 const unsigned char *host_sep = (
const unsigned char *) url;
1520 for(iptr = (
unsigned char *)url;
1524 if(iptr < host_sep) {
1535 snprintf(optr, 4,
"%%%02x", *iptr);
1564 return (2 == sscanf(url,
"%15[^?&/:]://%c", prot, &letter)) ?
TRUE :
FALSE;
1584 bool host_changed =
FALSE;
1586 const char *useurl = relurl;
1591 char *url_clone =
strdup(base);
1597 protsep = strstr(url_clone,
"//");
1599 protsep = url_clone;
1603 if(
'/' != relurl[0]) {
1608 pathsep = strchr(protsep,
'?');
1616 if(useurl[0] !=
'?') {
1617 pathsep = strrchr(protsep,
'/');
1624 pathsep = strchr(protsep,
'/');
1626 protsep = pathsep + 1;
1633 if((useurl[0] ==
'.') && (useurl[1] ==
'/'))
1636 while((useurl[0] ==
'.') &&
1637 (useurl[1] ==
'.') &&
1638 (useurl[2] ==
'/')) {
1646 pathsep = strrchr(protsep,
'/');
1659 if((relurl[0] ==
'/') && (relurl[1] ==
'/')) {
1663 useurl = &relurl[2];
1665 host_changed =
TRUE;
1670 pathsep = strchr(protsep,
'/');
1675 char *sep = strchr(protsep,
'?');
1676 if(sep && (sep < pathsep))
1685 pathsep = strchr(protsep,
'?');
1699 urllen = strlen(url_clone);
1701 newest =
malloc(urllen + 1 +
1710 memcpy(newest, url_clone, urllen);
1713 if((
'/' == useurl[0]) || (protsep && !*protsep) || (
'?' == useurl[0]))
1716 newest[urllen++]=
'/';
1719 strcpy_url(&newest[urllen], useurl, !host_changed);
1735 #ifdef CURL_DISABLE_HTTP 1744 bool disallowport =
FALSE;
1745 bool reachedmax =
FALSE;
1795 disallowport =
TRUE;
1797 newest =
malloc(newlen + 1);
1829 infof(data,
"Issue another request to this URL: '%s'\n", data->
change.
url);
1872 infof(data,
"Switch from POST to GET\n");
1897 infof(data,
"Switch from POST to GET\n");
1908 infof(data,
"Disables POST, goes with %s\n",
1962 infof(conn->
data,
"Connection died, retrying a fresh connect\n");
2008 DEBUGASSERT((sockindex <= 1) && (sockindex >= -1));
2011 conn->
sockfd = sockindex == -1 ?
CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap, ssize_t length, ssize_t *wrote)
int Curl_debug(struct Curl_easy *data, curl_infotype type, char *ptr, size_t size, struct connectdata *conn)
CURLcode Curl_pop3_write(struct connectdata *conn, char *str, size_t nread)
CURLcode Curl_follow(struct Curl_easy *data, char *newurl, followtype type)
curl_wildcard_states state
static CURLcode readwrite_data(struct Curl_easy *data, struct connectdata *conn, struct SingleRequest *k, int *didwhat, bool *done, bool *comeback)
void Curl_pgrsSetUploadCounter(struct Curl_easy *data, curl_off_t size)
void Curl_expire_done(struct Curl_easy *data, expire_id id)
static CURLcode done_sending(struct connectdata *conn, struct SingleRequest *k)
#define CURL_DO_LINEEND_CONV
CURLcode Curl_readwrite(struct connectdata *conn, struct Curl_easy *data, bool *done, bool *comeback)
int(* perform_getsock)(const struct connectdata *conn, curl_socket_t *socks, int numsocks)
void Curl_pgrsTime(struct Curl_easy *data, timerid timer)
#define streamclose(x, y)
CURLcode Curl_posttransfer(struct Curl_easy *data)
static const char * find_host_sep(const char *url)
static size_t strlen_url(const char *url, bool relative)
const struct Curl_handler * handler
struct Curl_multi * multi
UNITTEST_START char * ptr
#define GETSOCK_READSOCK(x)
void Curl_init_CONNECT(struct Curl_easy *data)
CURLcode Curl_initinfo(struct Curl_easy *data)
struct Curl_chunker chunk
bool Curl_pipeline_wanted(const struct Curl_multi *multi, int bits)
struct curl_slist * headers
static bool is_absolute_url(const char *url)
static void read_rewind(struct connectdata *conn, size_t thismuch)
CURLcode(* readwrite)(struct Curl_easy *data, struct connectdata *conn, ssize_t *nread, bool *readmore)
void Curl_pgrsStartNow(struct Curl_easy *data)
UNITTEST_START int result
void Curl_cookie_loadfiles(struct Curl_easy *data)
CURLcode Curl_wildcard_init(struct WildcardData *wc)
struct DynamicStatic change
static void strcpy_url(char *output, const char *url, bool relative)
int Curl_pgrsUpdate(struct connectdata *conn)
curl_off_t writebytecount
memcpy(filename, filename1, strlen(filename1))
#define Curl_ssl_data_pending(x, y)
CURLcode Curl_readrewind(struct connectdata *conn)
UNITTEST_START char * output
#define CURL_REDIR_POST_301
enum SingleRequest::@32 badheader
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)
time_t Curl_timeleft(struct Curl_easy *data, struct curltime *nowp, bool duringconnect)
curl_easy_setopt expects a curl_off_t argument for this option curl_easy_setopt expects a curl_write_callback argument for this option curl_easy_setopt expects a curl_ioctl_callback argument for this option curl_easy_setopt expects a curl_opensocket_callback argument for this option curl_easy_setopt expects a curl_debug_callback argument for this option curl_easy_setopt expects a curl_conv_callback argument for this option curl_easy_setopt expects a private data pointer as argument for this option curl_easy_setopt expects a FILE *argument for this option curl_easy_setopt expects a struct curl_httppost *argument for this option curl_easy_setopt expects a struct curl_slist *argument for this option curl_easy_getinfo expects a pointer to char *for this info curl_easy_getinfo expects a pointer to double for this info curl_easy_getinfo expects a pointer to struct curl_tlssessioninfo *for this info curl_easy_getinfo expects a pointer to curl_socket_t for this info size_t
CURLcode Curl_mime_rewind(curl_mimepart *part)
bool Curl_meets_timecondition(struct Curl_easy *data, time_t timeofdoc)
UNITTEST_START struct Curl_easy data
#define strncasecompare(a, b, c)
#define Curl_ssl_initsessions(x, y)
void Curl_pgrsSetDownloadSize(struct Curl_easy *data, curl_off_t size)
#define Curl_convert_to_network(a, b, c)
CURL_TYPEOF_CURL_OFF_T curl_off_t
size_t(* curl_read_callback)(char *buffer, size_t size, size_t nitems, void *instream)
CURLcode Curl_write(struct connectdata *conn, curl_socket_t sockfd, const void *mem, size_t len, ssize_t *written)
CURLcode Curl_fillreadbuffer(struct connectdata *conn, int bytes, int *nreadp)
#define GETSOCK_WRITESOCK(x)
void Curl_pgrsResetTransferSizes(struct Curl_easy *data)
CURLcode Curl_unencode_gzip_write(struct connectdata *conn, struct SingleRequest *k, ssize_t nread)
CURLcode Curl_speedcheck(struct Curl_easy *data, struct curltime now)
struct curl_slist * cookielist
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, size_t len)
#define Curl_safefree(ptr)
curl_socket_t writesockfd
curl_ioctl_callback ioctl_func
CURLcode Curl_smtp_escape_eob(struct connectdata *conn, const ssize_t nread)
#define PROTOPT_NONETWORK
#define CURL_READFUNC_ABORT
int Curl_socket_check(curl_socket_t readfd0, curl_socket_t readfd1, curl_socket_t writefd, time_t timeout_ms)
char uploadbuffer[UPLOAD_BUFSIZE+1]
CURLcode Curl_http_readwrite_headers(struct Curl_easy *data, struct connectdata *conn, ssize_t *nread, bool *stop_reading)
curl_off_t writebytecount
#define CURL_REDIR_POST_302
TFSIMD_FORCE_INLINE Vector3 absolute() const
int Curl_single_getsock(const struct connectdata *conn, curl_socket_t *sock, int numsocks)
curl_off_t * writebytecountp
CURLcode Curl_pretransfer(struct Curl_easy *data)
char * Curl_checkheaders(const struct connectdata *conn, const char *thisheader)
void Curl_pgrsSetDownloadCounter(struct Curl_easy *data, curl_off_t size)
#define Curl_http2_done_sending(x)
struct curltime t_startsingle
curl_TimeCond timecondition
curl_read_callback fread_func_set
struct curl_slist * resolve
#define CURL_READFUNC_PAUSE
#define Curl_tvdiff(x, y)
#define CURL_REDIR_POST_303
curl_off_t crlf_conversions
curl_read_callback fread_func
static CURLcode readwrite_upload(struct Curl_easy *data, struct connectdata *conn, int *didwhat)
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
const char * Curl_chunked_strerror(CHUNKcode code)
#define PROTO_FAMILY_POP3
curl_seek_callback seek_func
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id id)
struct WildcardData wildcard
struct ssl_general_config general_ssl
CURLcode Curl_unencode_deflate_write(struct connectdata *conn, struct SingleRequest *req, ssize_t nread)
#define PROTO_FAMILY_HTTP
#define PROTO_FAMILY_SMTP
static int data_pending(const struct connectdata *conn)
static char * concat_url(const char *base, const char *relurl)
CURLcode Curl_retry_request(struct connectdata *conn, char **url)
CURLcode Curl_read(struct connectdata *conn, curl_socket_t sockfd, char *buf, size_t sizerequested, ssize_t *n)
CURLcode Curl_loadhostpairs(struct Curl_easy *data)
#define CURL_FORMAT_CURL_OFF_T
struct curl_llist_element * head
case 1: list has >1 element, removing head : 1: list size will be decremented by one 2: head will be ...