1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2016, 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 25 #ifdef HAVE_NETINET_IN_H 26 #include <netinet/in.h> 27 #endif 28 #ifdef HAVE_NETDB_H 29 #include <netdb.h> 30 #endif 31 #ifdef HAVE_ARPA_INET_H 32 #include <arpa/inet.h> 33 #endif 34 #ifdef HAVE_NET_IF_H 35 #include <net/if.h> 36 #endif 37 #ifdef HAVE_SYS_IOCTL_H 38 #include <sys/ioctl.h> 39 #endif 40 41 #ifdef HAVE_SYS_PARAM_H 42 #include <sys/param.h> 43 #endif 44 45 #ifdef __VMS 46 #include <in.h> 47 #include <inet.h> 48 #endif 49 50 #ifdef HAVE_SYS_UN_H 51 #include <sys/un.h> 52 #endif 53 54 #ifndef HAVE_SOCKET 55 #error "We can't compile without socket() support!" 56 #endif 57 58 #ifdef HAVE_LIMITS_H 59 #include <limits.h> 60 #endif 61 62 #ifdef USE_LIBIDN2 63 #include <idn2.h> 64 65 #elif defined(USE_WIN32_IDN) 66 /* prototype for curl_win32_idn_to_ascii() */ 67 bool curl_win32_idn_to_ascii(const char *in, char **out); 68 #endif /* USE_LIBIDN2 */ 69 70 #include "urldata.h" 71 #include "netrc.h" 72 73 #include "formdata.h" 74 #include "vtls/vtls.h" 75 #include "hostip.h" 76 #include "transfer.h" 77 #include "sendf.h" 78 #include "progress.h" 79 #include "cookie.h" 80 #include "strcase.h" 81 #include "strerror.h" 82 #include "escape.h" 83 #include "strtok.h" 84 #include "share.h" 85 #include "content_encoding.h" 86 #include "http_digest.h" 87 #include "http_negotiate.h" 88 #include "select.h" 89 #include "multiif.h" 90 #include "easyif.h" 91 #include "speedcheck.h" 92 #include "warnless.h" 93 #include "non-ascii.h" 94 #include "inet_pton.h" 95 #include "getinfo.h" 96 97 /* And now for the protocols */ 98 #include "ftp.h" 99 #include "dict.h" 100 #include "telnet.h" 101 #include "tftp.h" 102 #include "http.h" 103 #include "http2.h" 104 #include "file.h" 105 #include "curl_ldap.h" 106 #include "ssh.h" 107 #include "imap.h" 108 #include "url.h" 109 #include "connect.h" 110 #include "inet_ntop.h" 111 #include "http_ntlm.h" 112 #include "curl_ntlm_wb.h" 113 #include "socks.h" 114 #include "curl_rtmp.h" 115 #include "gopher.h" 116 #include "http_proxy.h" 117 #include "conncache.h" 118 #include "multihandle.h" 119 #include "pipeline.h" 120 #include "dotdot.h" 121 #include "strdup.h" 122 /* The last 3 #include files should be in this order */ 123 #include "curl_printf.h" 124 #include "curl_memory.h" 125 #include "memdebug.h" 126 127 /* Local static prototypes */ 128 static struct connectdata * 129 find_oldest_idle_connection_in_bundle(struct Curl_easy *data, 130 struct connectbundle *bundle); 131 static void conn_free(struct connectdata *conn); 132 static void free_fixed_hostname(struct hostname *host); 133 static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke); 134 static CURLcode parse_url_login(struct Curl_easy *data, 135 struct connectdata *conn, 136 char **userptr, char **passwdptr, 137 char **optionsptr); 138 static CURLcode parse_login_details(const char *login, const size_t len, 139 char **userptr, char **passwdptr, 140 char **optionsptr); 141 static unsigned int get_protocol_family(unsigned int protocol); 142 143 /* 144 * Protocol table. 145 */ 146 147 static const struct Curl_handler * const protocols[] = { 148 149 #ifndef CURL_DISABLE_HTTP 150 &Curl_handler_http, 151 #endif 152 153 #if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP) 154 &Curl_handler_https, 155 #endif 156 157 #ifndef CURL_DISABLE_FTP 158 &Curl_handler_ftp, 159 #endif 160 161 #if defined(USE_SSL) && !defined(CURL_DISABLE_FTP) 162 &Curl_handler_ftps, 163 #endif 164 165 #ifndef CURL_DISABLE_TELNET 166 &Curl_handler_telnet, 167 #endif 168 169 #ifndef CURL_DISABLE_DICT 170 &Curl_handler_dict, 171 #endif 172 173 #ifndef CURL_DISABLE_LDAP 174 &Curl_handler_ldap, 175 #if !defined(CURL_DISABLE_LDAPS) && \ 176 ((defined(USE_OPENLDAP) && defined(USE_SSL)) || \ 177 (!defined(USE_OPENLDAP) && defined(HAVE_LDAP_SSL))) 178 &Curl_handler_ldaps, 179 #endif 180 #endif 181 182 #ifndef CURL_DISABLE_FILE 183 &Curl_handler_file, 184 #endif 185 186 #ifndef CURL_DISABLE_TFTP 187 &Curl_handler_tftp, 188 #endif 189 190 #ifdef USE_LIBSSH2 191 &Curl_handler_scp, 192 &Curl_handler_sftp, 193 #endif 194 195 #ifndef CURL_DISABLE_IMAP 196 &Curl_handler_imap, 197 #ifdef USE_SSL 198 &Curl_handler_imaps, 199 #endif 200 #endif 201 202 #ifndef CURL_DISABLE_POP3 203 &Curl_handler_pop3, 204 #ifdef USE_SSL 205 &Curl_handler_pop3s, 206 #endif 207 #endif 208 209 #if !defined(CURL_DISABLE_SMB) && defined(USE_NTLM) && \ 210 (CURL_SIZEOF_CURL_OFF_T > 4) && \ 211 (!defined(USE_WINDOWS_SSPI) || defined(USE_WIN32_CRYPTO)) 212 &Curl_handler_smb, 213 #ifdef USE_SSL 214 &Curl_handler_smbs, 215 #endif 216 #endif 217 218 #ifndef CURL_DISABLE_SMTP 219 &Curl_handler_smtp, 220 #ifdef USE_SSL 221 &Curl_handler_smtps, 222 #endif 223 #endif 224 225 #ifndef CURL_DISABLE_RTSP 226 &Curl_handler_rtsp, 227 #endif 228 229 #ifndef CURL_DISABLE_GOPHER 230 &Curl_handler_gopher, 231 #endif 232 233 #ifdef USE_LIBRTMP 234 &Curl_handler_rtmp, 235 &Curl_handler_rtmpt, 236 &Curl_handler_rtmpe, 237 &Curl_handler_rtmpte, 238 &Curl_handler_rtmps, 239 &Curl_handler_rtmpts, 240 #endif 241 242 (struct Curl_handler *) NULL 243 }; 244 245 /* 246 * Dummy handler for undefined protocol schemes. 247 */ 248 249 static const struct Curl_handler Curl_handler_dummy = { 250 "<no protocol>", /* scheme */ 251 ZERO_NULL, /* setup_connection */ 252 ZERO_NULL, /* do_it */ 253 ZERO_NULL, /* done */ 254 ZERO_NULL, /* do_more */ 255 ZERO_NULL, /* connect_it */ 256 ZERO_NULL, /* connecting */ 257 ZERO_NULL, /* doing */ 258 ZERO_NULL, /* proto_getsock */ 259 ZERO_NULL, /* doing_getsock */ 260 ZERO_NULL, /* domore_getsock */ 261 ZERO_NULL, /* perform_getsock */ 262 ZERO_NULL, /* disconnect */ 263 ZERO_NULL, /* readwrite */ 264 0, /* defport */ 265 0, /* protocol */ 266 PROTOPT_NONE /* flags */ 267 }; 268 269 void Curl_freeset(struct Curl_easy *data) 270 { 271 /* Free all dynamic strings stored in the data->set substructure. */ 272 enum dupstring i; 273 for(i=(enum dupstring)0; i < STRING_LAST; i++) { 274 Curl_safefree(data->set.str[i]); 275 } 276 277 if(data->change.referer_alloc) { 278 Curl_safefree(data->change.referer); 279 data->change.referer_alloc = FALSE; 280 } 281 data->change.referer = NULL; 282 if(data->change.url_alloc) { 283 Curl_safefree(data->change.url); 284 data->change.url_alloc = FALSE; 285 } 286 data->change.url = NULL; 287 } 288 289 static CURLcode setstropt(char **charp, const char *s) 290 { 291 /* Release the previous storage at `charp' and replace by a dynamic storage 292 copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */ 293 294 Curl_safefree(*charp); 295 296 if(s) { 297 char *str = strdup(s); 298 299 if(!str) 300 return CURLE_OUT_OF_MEMORY; 301 302 *charp = str; 303 } 304 305 return CURLE_OK; 306 } 307 308 static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp) 309 { 310 CURLcode result = CURLE_OK; 311 char *user = NULL; 312 char *passwd = NULL; 313 314 /* Parse the login details if specified. It not then we treat NULL as a hint 315 to clear the existing data */ 316 if(option) { 317 result = parse_login_details(option, strlen(option), 318 (userp ? &user : NULL), 319 (passwdp ? &passwd : NULL), 320 NULL); 321 } 322 323 if(!result) { 324 /* Store the username part of option if required */ 325 if(userp) { 326 if(!user && option && option[0] == ':') { 327 /* Allocate an empty string instead of returning NULL as user name */ 328 user = strdup(""); 329 if(!user) 330 result = CURLE_OUT_OF_MEMORY; 331 } 332 333 Curl_safefree(*userp); 334 *userp = user; 335 } 336 337 /* Store the password part of option if required */ 338 if(passwdp) { 339 Curl_safefree(*passwdp); 340 *passwdp = passwd; 341 } 342 } 343 344 return result; 345 } 346 347 CURLcode Curl_dupset(struct Curl_easy *dst, struct Curl_easy *src) 348 { 349 CURLcode result = CURLE_OK; 350 enum dupstring i; 351 352 /* Copy src->set into dst->set first, then deal with the strings 353 afterwards */ 354 dst->set = src->set; 355 356 /* clear all string pointers first */ 357 memset(dst->set.str, 0, STRING_LAST * sizeof(char *)); 358 359 /* duplicate all strings */ 360 for(i=(enum dupstring)0; i< STRING_LASTZEROTERMINATED; i++) { 361 result = setstropt(&dst->set.str[i], src->set.str[i]); 362 if(result) 363 return result; 364 } 365 366 /* duplicate memory areas pointed to */ 367 i = STRING_COPYPOSTFIELDS; 368 if(src->set.postfieldsize && src->set.str[i]) { 369 /* postfieldsize is curl_off_t, Curl_memdup() takes a size_t ... */ 370 dst->set.str[i] = Curl_memdup(src->set.str[i], 371 curlx_sotouz(src->set.postfieldsize)); 372 if(!dst->set.str[i]) 373 return CURLE_OUT_OF_MEMORY; 374 /* point to the new copy */ 375 dst->set.postfields = dst->set.str[i]; 376 } 377 378 return CURLE_OK; 379 } 380 381 /* 382 * This is the internal function curl_easy_cleanup() calls. This should 383 * cleanup and free all resources associated with this sessionhandle. 384 * 385 * NOTE: if we ever add something that attempts to write to a socket or 386 * similar here, we must ignore SIGPIPE first. It is currently only done 387 * when curl_easy_perform() is invoked. 388 */ 389 390 CURLcode Curl_close(struct Curl_easy *data) 391 { 392 struct Curl_multi *m; 393 394 if(!data) 395 return CURLE_OK; 396 397 Curl_expire_clear(data); /* shut off timers */ 398 399 m = data->multi; 400 401 if(m) 402 /* This handle is still part of a multi handle, take care of this first 403 and detach this handle from there. */ 404 curl_multi_remove_handle(data->multi, data); 405 406 if(data->multi_easy) 407 /* when curl_easy_perform() is used, it creates its own multi handle to 408 use and this is the one */ 409 curl_multi_cleanup(data->multi_easy); 410 411 /* Destroy the timeout list that is held in the easy handle. It is 412 /normally/ done by curl_multi_remove_handle() but this is "just in 413 case" */ 414 if(data->state.timeoutlist) { 415 Curl_llist_destroy(data->state.timeoutlist, NULL); 416 data->state.timeoutlist = NULL; 417 } 418 419 data->magic = 0; /* force a clear AFTER the possibly enforced removal from 420 the multi handle, since that function uses the magic 421 field! */ 422 423 if(data->state.rangestringalloc) 424 free(data->state.range); 425 426 /* Free the pathbuffer */ 427 Curl_safefree(data->state.pathbuffer); 428 data->state.path = NULL; 429 430 /* freed here just in case DONE wasn't called */ 431 Curl_free_request_state(data); 432 433 /* Close down all open SSL info and sessions */ 434 Curl_ssl_close_all(data); 435 Curl_safefree(data->state.first_host); 436 Curl_safefree(data->state.scratch); 437 Curl_ssl_free_certinfo(data); 438 439 /* Cleanup possible redirect junk */ 440 free(data->req.newurl); 441 data->req.newurl = NULL; 442 443 if(data->change.referer_alloc) { 444 Curl_safefree(data->change.referer); 445 data->change.referer_alloc = FALSE; 446 } 447 data->change.referer = NULL; 448 449 if(data->change.url_alloc) { 450 Curl_safefree(data->change.url); 451 data->change.url_alloc = FALSE; 452 } 453 data->change.url = NULL; 454 455 Curl_safefree(data->state.headerbuff); 456 457 Curl_flush_cookies(data, 1); 458 459 Curl_digest_cleanup(data); 460 461 Curl_safefree(data->info.contenttype); 462 Curl_safefree(data->info.wouldredirect); 463 464 /* this destroys the channel and we cannot use it anymore after this */ 465 Curl_resolver_cleanup(data->state.resolver); 466 467 Curl_convert_close(data); 468 469 /* No longer a dirty share, if it exists */ 470 if(data->share) { 471 Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE); 472 data->share->dirty--; 473 Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); 474 } 475 476 if(data->set.wildcardmatch) { 477 /* destruct wildcard structures if it is needed */ 478 struct WildcardData *wc = &data->wildcard; 479 Curl_wildcard_dtor(wc); 480 } 481 482 Curl_freeset(data); 483 free(data); 484 return CURLE_OK; 485 } 486 487 /* 488 * Initialize the UserDefined fields within a Curl_easy. 489 * This may be safely called on a new or existing Curl_easy. 490 */ 491 CURLcode Curl_init_userdefined(struct UserDefined *set) 492 { 493 CURLcode result = CURLE_OK; 494 495 set->out = stdout; /* default output to stdout */ 496 set->in_set = stdin; /* default input from stdin */ 497 set->err = stderr; /* default stderr to stderr */ 498 499 /* use fwrite as default function to store output */ 500 set->fwrite_func = (curl_write_callback)fwrite; 501 502 /* use fread as default function to read input */ 503 set->fread_func_set = (curl_read_callback)fread; 504 set->is_fread_set = 0; 505 set->is_fwrite_set = 0; 506 507 set->seek_func = ZERO_NULL; 508 set->seek_client = ZERO_NULL; 509 510 /* conversion callbacks for non-ASCII hosts */ 511 set->convfromnetwork = ZERO_NULL; 512 set->convtonetwork = ZERO_NULL; 513 set->convfromutf8 = ZERO_NULL; 514 515 set->filesize = -1; /* we don't know the size */ 516 set->postfieldsize = -1; /* unknown size */ 517 set->maxredirs = -1; /* allow any amount by default */ 518 519 set->httpreq = HTTPREQ_GET; /* Default HTTP request */ 520 set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */ 521 set->ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */ 522 set->ftp_use_eprt = TRUE; /* FTP defaults to EPRT operations */ 523 set->ftp_use_pret = FALSE; /* mainly useful for drftpd servers */ 524 set->ftp_filemethod = FTPFILE_MULTICWD; 525 526 set->dns_cache_timeout = 60; /* Timeout every 60 seconds by default */ 527 528 /* Set the default size of the SSL session ID cache */ 529 set->general_ssl.max_ssl_sessions = 5; 530 531 set->proxyport = CURL_DEFAULT_PROXY_PORT; /* from url.h */ 532 set->proxytype = CURLPROXY_HTTP; /* defaults to HTTP proxy */ 533 set->httpauth = CURLAUTH_BASIC; /* defaults to basic */ 534 set->proxyauth = CURLAUTH_BASIC; /* defaults to basic */ 535 536 /* make libcurl quiet by default: */ 537 set->hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */ 538 539 /* 540 * libcurl 7.10 introduced SSL verification *by default*! This needs to be 541 * switched off unless wanted. 542 */ 543 set->ssl.primary.verifypeer = TRUE; 544 set->ssl.primary.verifyhost = TRUE; 545 #ifdef USE_TLS_SRP 546 set->ssl.authtype = CURL_TLSAUTH_NONE; 547 #endif 548 set->ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth 549 type */ 550 set->general_ssl.sessionid = TRUE; /* session ID caching enabled by 551 default */ 552 set->proxy_ssl = set->ssl; 553 554 set->new_file_perms = 0644; /* Default permissions */ 555 set->new_directory_perms = 0755; /* Default permissions */ 556 557 /* for the *protocols fields we don't use the CURLPROTO_ALL convenience 558 define since we internally only use the lower 16 bits for the passed 559 in bitmask to not conflict with the private bits */ 560 set->allowed_protocols = CURLPROTO_ALL; 561 set->redir_protocols = CURLPROTO_ALL & /* All except FILE, SCP and SMB */ 562 ~(CURLPROTO_FILE | CURLPROTO_SCP | CURLPROTO_SMB | 563 CURLPROTO_SMBS); 564 565 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) 566 /* 567 * disallow unprotected protection negotiation NEC reference implementation 568 * seem not to follow rfc1961 section 4.3/4.4 569 */ 570 set->socks5_gssapi_nec = FALSE; 571 #endif 572 573 /* This is our preferred CA cert bundle/path since install time */ 574 #if defined(CURL_CA_BUNDLE) 575 result = setstropt(&set->str[STRING_SSL_CAFILE_ORIG], CURL_CA_BUNDLE); 576 if(result) 577 return result; 578 #endif 579 #if defined(CURL_CA_PATH) 580 result = setstropt(&set->str[STRING_SSL_CAPATH_ORIG], CURL_CA_PATH); 581 if(result) 582 return result; 583 584 result = setstropt(&set->str[STRING_SSL_CAPATH_PROXY], 585 (char *) CURL_CA_PATH); 586 #endif 587 588 set->wildcardmatch = FALSE; 589 set->chunk_bgn = ZERO_NULL; 590 set->chunk_end = ZERO_NULL; 591 592 /* tcp keepalives are disabled by default, but provide reasonable values for 593 * the interval and idle times. 594 */ 595 set->tcp_keepalive = FALSE; 596 set->tcp_keepintvl = 60; 597 set->tcp_keepidle = 60; 598 set->tcp_fastopen = FALSE; 599 set->tcp_nodelay = TRUE; 600 601 set->ssl_enable_npn = TRUE; 602 set->ssl_enable_alpn = TRUE; 603 604 set->expect_100_timeout = 1000L; /* Wait for a second by default. */ 605 set->sep_headers = TRUE; /* separated header lists by default */ 606 607 Curl_http2_init_userset(set); 608 return result; 609 } 610 611 /** 612 * Curl_open() 613 * 614 * @param curl is a pointer to a sessionhandle pointer that gets set by this 615 * function. 616 * @return CURLcode 617 */ 618 619 CURLcode Curl_open(struct Curl_easy **curl) 620 { 621 CURLcode result; 622 struct Curl_easy *data; 623 624 /* Very simple start-up: alloc the struct, init it with zeroes and return */ 625 data = calloc(1, sizeof(struct Curl_easy)); 626 if(!data) { 627 /* this is a very serious error */ 628 DEBUGF(fprintf(stderr, "Error: calloc of Curl_easy failed\n")); 629 return CURLE_OUT_OF_MEMORY; 630 } 631 632 data->magic = CURLEASY_MAGIC_NUMBER; 633 634 result = Curl_resolver_init(&data->state.resolver); 635 if(result) { 636 DEBUGF(fprintf(stderr, "Error: resolver_init failed\n")); 637 free(data); 638 return result; 639 } 640 641 /* We do some initial setup here, all those fields that can't be just 0 */ 642 643 data->state.headerbuff = malloc(HEADERSIZE); 644 if(!data->state.headerbuff) { 645 DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n")); 646 result = CURLE_OUT_OF_MEMORY; 647 } 648 else { 649 result = Curl_init_userdefined(&data->set); 650 651 data->state.headersize=HEADERSIZE; 652 653 Curl_convert_init(data); 654 655 Curl_initinfo(data); 656 657 /* most recent connection is not yet defined */ 658 data->state.lastconnect = NULL; 659 660 data->progress.flags |= PGRS_HIDE; 661 data->state.current_speed = -1; /* init to negative == impossible */ 662 663 data->wildcard.state = CURLWC_INIT; 664 data->wildcard.filelist = NULL; 665 data->set.fnmatch = ZERO_NULL; 666 data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */ 667 668 Curl_http2_init_state(&data->state); 669 } 670 671 if(result) { 672 Curl_resolver_cleanup(data->state.resolver); 673 free(data->state.headerbuff); 674 Curl_freeset(data); 675 free(data); 676 data = NULL; 677 } 678 else 679 *curl = data; 680 681 return result; 682 } 683 684 CURLcode Curl_setopt(struct Curl_easy *data, CURLoption option, 685 va_list param) 686 { 687 char *argptr; 688 CURLcode result = CURLE_OK; 689 long arg; 690 #ifndef CURL_DISABLE_HTTP 691 curl_off_t bigsize; 692 #endif 693 694 switch(option) { 695 case CURLOPT_DNS_CACHE_TIMEOUT: 696 data->set.dns_cache_timeout = va_arg(param, long); 697 break; 698 case CURLOPT_DNS_USE_GLOBAL_CACHE: 699 /* remember we want this enabled */ 700 arg = va_arg(param, long); 701 data->set.global_dns_cache = (0 != arg) ? TRUE : FALSE; 702 break; 703 case CURLOPT_SSL_CIPHER_LIST: 704 /* set a list of cipher we want to use in the SSL connection */ 705 result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_ORIG], 706 va_arg(param, char *)); 707 break; 708 case CURLOPT_PROXY_SSL_CIPHER_LIST: 709 /* set a list of cipher we want to use in the SSL connection for proxy */ 710 result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST_PROXY], 711 va_arg(param, char *)); 712 break; 713 714 case CURLOPT_RANDOM_FILE: 715 /* 716 * This is the path name to a file that contains random data to seed 717 * the random SSL stuff with. The file is only used for reading. 718 */ 719 result = setstropt(&data->set.str[STRING_SSL_RANDOM_FILE], 720 va_arg(param, char *)); 721 break; 722 case CURLOPT_EGDSOCKET: 723 /* 724 * The Entropy Gathering Daemon socket pathname 725 */ 726 result = setstropt(&data->set.str[STRING_SSL_EGDSOCKET], 727 va_arg(param, char *)); 728 break; 729 case CURLOPT_MAXCONNECTS: 730 /* 731 * Set the absolute number of maximum simultaneous alive connection that 732 * libcurl is allowed to have. 733 */ 734 data->set.maxconnects = va_arg(param, long); 735 break; 736 case CURLOPT_FORBID_REUSE: 737 /* 738 * When this transfer is done, it must not be left to be reused by a 739 * subsequent transfer but shall be closed immediately. 740 */ 741 data->set.reuse_forbid = (0 != va_arg(param, long)) ? TRUE : FALSE; 742 break; 743 case CURLOPT_FRESH_CONNECT: 744 /* 745 * This transfer shall not use a previously cached connection but 746 * should be made with a fresh new connect! 747 */ 748 data->set.reuse_fresh = (0 != va_arg(param, long)) ? TRUE : FALSE; 749 break; 750 case CURLOPT_VERBOSE: 751 /* 752 * Verbose means infof() calls that give a lot of information about 753 * the connection and transfer procedures as well as internal choices. 754 */ 755 data->set.verbose = (0 != va_arg(param, long)) ? TRUE : FALSE; 756 break; 757 case CURLOPT_HEADER: 758 /* 759 * Set to include the header in the general data output stream. 760 */ 761 data->set.include_header = (0 != va_arg(param, long)) ? TRUE : FALSE; 762 break; 763 case CURLOPT_NOPROGRESS: 764 /* 765 * Shut off the internal supported progress meter 766 */ 767 data->set.hide_progress = (0 != va_arg(param, long)) ? TRUE : FALSE; 768 if(data->set.hide_progress) 769 data->progress.flags |= PGRS_HIDE; 770 else 771 data->progress.flags &= ~PGRS_HIDE; 772 break; 773 case CURLOPT_NOBODY: 774 /* 775 * Do not include the body part in the output data stream. 776 */ 777 data->set.opt_no_body = (0 != va_arg(param, long)) ? TRUE : FALSE; 778 break; 779 case CURLOPT_FAILONERROR: 780 /* 781 * Don't output the >=400 error code HTML-page, but instead only 782 * return error. 783 */ 784 data->set.http_fail_on_error = (0 != va_arg(param, long)) ? TRUE : FALSE; 785 break; 786 case CURLOPT_KEEP_SENDING_ON_ERROR: 787 data->set.http_keep_sending_on_error = (0 != va_arg(param, long)) ? 788 TRUE : FALSE; 789 break; 790 case CURLOPT_UPLOAD: 791 case CURLOPT_PUT: 792 /* 793 * We want to sent data to the remote host. If this is HTTP, that equals 794 * using the PUT request. 795 */ 796 data->set.upload = (0 != va_arg(param, long)) ? TRUE : FALSE; 797 if(data->set.upload) { 798 /* If this is HTTP, PUT is what's needed to "upload" */ 799 data->set.httpreq = HTTPREQ_PUT; 800 data->set.opt_no_body = FALSE; /* this is implied */ 801 } 802 else 803 /* In HTTP, the opposite of upload is GET (unless NOBODY is true as 804 then this can be changed to HEAD later on) */ 805 data->set.httpreq = HTTPREQ_GET; 806 break; 807 case CURLOPT_FILETIME: 808 /* 809 * Try to get the file time of the remote document. The time will 810 * later (possibly) become available using curl_easy_getinfo(). 811 */ 812 data->set.get_filetime = (0 != va_arg(param, long)) ? TRUE : FALSE; 813 break; 814 case CURLOPT_FTP_CREATE_MISSING_DIRS: 815 /* 816 * An FTP option that modifies an upload to create missing directories on 817 * the server. 818 */ 819 switch(va_arg(param, long)) { 820 case 0: 821 data->set.ftp_create_missing_dirs = 0; 822 break; 823 case 1: 824 data->set.ftp_create_missing_dirs = 1; 825 break; 826 case 2: 827 data->set.ftp_create_missing_dirs = 2; 828 break; 829 default: 830 /* reserve other values for future use */ 831 result = CURLE_UNKNOWN_OPTION; 832 break; 833 } 834 break; 835 case CURLOPT_SERVER_RESPONSE_TIMEOUT: 836 /* 837 * Option that specifies how quickly an server response must be obtained 838 * before it is considered failure. For pingpong protocols. 839 */ 840 data->set.server_response_timeout = va_arg(param, long) * 1000; 841 break; 842 case CURLOPT_TFTP_NO_OPTIONS: 843 /* 844 * Option that prevents libcurl from sending TFTP option requests to the 845 * server. 846 */ 847 data->set.tftp_no_options = va_arg(param, long) != 0; 848 break; 849 case CURLOPT_TFTP_BLKSIZE: 850 /* 851 * TFTP option that specifies the block size to use for data transmission. 852 */ 853 data->set.tftp_blksize = va_arg(param, long); 854 break; 855 case CURLOPT_DIRLISTONLY: 856 /* 857 * An option that changes the command to one that asks for a list 858 * only, no file info details. 859 */ 860 data->set.ftp_list_only = (0 != va_arg(param, long)) ? TRUE : FALSE; 861 break; 862 case CURLOPT_APPEND: 863 /* 864 * We want to upload and append to an existing file. 865 */ 866 data->set.ftp_append = (0 != va_arg(param, long)) ? TRUE : FALSE; 867 break; 868 case CURLOPT_FTP_FILEMETHOD: 869 /* 870 * How do access files over FTP. 871 */ 872 data->set.ftp_filemethod = (curl_ftpfile)va_arg(param, long); 873 break; 874 case CURLOPT_NETRC: 875 /* 876 * Parse the $HOME/.netrc file 877 */ 878 data->set.use_netrc = (enum CURL_NETRC_OPTION)va_arg(param, long); 879 break; 880 case CURLOPT_NETRC_FILE: 881 /* 882 * Use this file instead of the $HOME/.netrc file 883 */ 884 result = setstropt(&data->set.str[STRING_NETRC_FILE], 885 va_arg(param, char *)); 886 break; 887 case CURLOPT_TRANSFERTEXT: 888 /* 889 * This option was previously named 'FTPASCII'. Renamed to work with 890 * more protocols than merely FTP. 891 * 892 * Transfer using ASCII (instead of BINARY). 893 */ 894 data->set.prefer_ascii = (0 != va_arg(param, long)) ? TRUE : FALSE; 895 break; 896 case CURLOPT_TIMECONDITION: 897 /* 898 * Set HTTP time condition. This must be one of the defines in the 899 * curl/curl.h header file. 900 */ 901 data->set.timecondition = (curl_TimeCond)va_arg(param, long); 902 break; 903 case CURLOPT_TIMEVALUE: 904 /* 905 * This is the value to compare with the remote document with the 906 * method set with CURLOPT_TIMECONDITION 907 */ 908 data->set.timevalue = (time_t)va_arg(param, long); 909 break; 910 case CURLOPT_SSLVERSION: 911 /* 912 * Set explicit SSL version to try to connect with, as some SSL 913 * implementations are lame. 914 */ 915 #ifdef USE_SSL 916 data->set.ssl.primary.version = va_arg(param, long); 917 #else 918 result = CURLE_UNKNOWN_OPTION; 919 #endif 920 break; 921 case CURLOPT_PROXY_SSLVERSION: 922 /* 923 * Set explicit SSL version to try to connect with for proxy, as some SSL 924 * implementations are lame. 925 */ 926 #ifdef USE_SSL 927 data->set.proxy_ssl.primary.version = va_arg(param, long); 928 #else 929 result = CURLE_UNKNOWN_OPTION; 930 #endif 931 break; 932 933 #ifndef CURL_DISABLE_HTTP 934 case CURLOPT_AUTOREFERER: 935 /* 936 * Switch on automatic referer that gets set if curl follows locations. 937 */ 938 data->set.http_auto_referer = (0 != va_arg(param, long)) ? TRUE : FALSE; 939 break; 940 941 case CURLOPT_ACCEPT_ENCODING: 942 /* 943 * String to use at the value of Accept-Encoding header. 944 * 945 * If the encoding is set to "" we use an Accept-Encoding header that 946 * encompasses all the encodings we support. 947 * If the encoding is set to NULL we don't send an Accept-Encoding header 948 * and ignore an received Content-Encoding header. 949 * 950 */ 951 argptr = va_arg(param, char *); 952 result = setstropt(&data->set.str[STRING_ENCODING], 953 (argptr && !*argptr)? 954 ALL_CONTENT_ENCODINGS: argptr); 955 break; 956 957 case CURLOPT_TRANSFER_ENCODING: 958 data->set.http_transfer_encoding = (0 != va_arg(param, long)) ? 959 TRUE : FALSE; 960 break; 961 962 case CURLOPT_FOLLOWLOCATION: 963 /* 964 * Follow Location: header hints on a HTTP-server. 965 */ 966 data->set.http_follow_location = (0 != va_arg(param, long)) ? TRUE : FALSE; 967 break; 968 969 case CURLOPT_UNRESTRICTED_AUTH: 970 /* 971 * Send authentication (user+password) when following locations, even when 972 * hostname changed. 973 */ 974 data->set.http_disable_hostname_check_before_authentication = 975 (0 != va_arg(param, long)) ? TRUE : FALSE; 976 break; 977 978 case CURLOPT_MAXREDIRS: 979 /* 980 * The maximum amount of hops you allow curl to follow Location: 981 * headers. This should mostly be used to detect never-ending loops. 982 */ 983 data->set.maxredirs = va_arg(param, long); 984 break; 985 986 case CURLOPT_POSTREDIR: 987 { 988 /* 989 * Set the behaviour of POST when redirecting 990 * CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302 991 * CURL_REDIR_POST_301 - POST is kept as POST after 301 992 * CURL_REDIR_POST_302 - POST is kept as POST after 302 993 * CURL_REDIR_POST_303 - POST is kept as POST after 303 994 * CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303 995 * other - POST is kept as POST after 301 and 302 996 */ 997 int postRedir = curlx_sltosi(va_arg(param, long)); 998 data->set.keep_post = postRedir & CURL_REDIR_POST_ALL; 999 } 1000 break; 1001 1002 case CURLOPT_POST: 1003 /* Does this option serve a purpose anymore? Yes it does, when 1004 CURLOPT_POSTFIELDS isn't used and the POST data is read off the 1005 callback! */ 1006 if(va_arg(param, long)) { 1007 data->set.httpreq = HTTPREQ_POST; 1008 data->set.opt_no_body = FALSE; /* this is implied */ 1009 } 1010 else 1011 data->set.httpreq = HTTPREQ_GET; 1012 break; 1013 1014 case CURLOPT_COPYPOSTFIELDS: 1015 /* 1016 * A string with POST data. Makes curl HTTP POST. Even if it is NULL. 1017 * If needed, CURLOPT_POSTFIELDSIZE must have been set prior to 1018 * CURLOPT_COPYPOSTFIELDS and not altered later. 1019 */ 1020 argptr = va_arg(param, char *); 1021 1022 if(!argptr || data->set.postfieldsize == -1) 1023 result = setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr); 1024 else { 1025 /* 1026 * Check that requested length does not overflow the size_t type. 1027 */ 1028 1029 if((data->set.postfieldsize < 0) || 1030 ((sizeof(curl_off_t) != sizeof(size_t)) && 1031 (data->set.postfieldsize > (curl_off_t)((size_t)-1)))) 1032 result = CURLE_OUT_OF_MEMORY; 1033 else { 1034 char *p; 1035 1036 (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 1037 1038 /* Allocate even when size == 0. This satisfies the need of possible 1039 later address compare to detect the COPYPOSTFIELDS mode, and 1040 to mark that postfields is used rather than read function or 1041 form data. 1042 */ 1043 p = malloc((size_t)(data->set.postfieldsize? 1044 data->set.postfieldsize:1)); 1045 1046 if(!p) 1047 result = CURLE_OUT_OF_MEMORY; 1048 else { 1049 if(data->set.postfieldsize) 1050 memcpy(p, argptr, (size_t)data->set.postfieldsize); 1051 1052 data->set.str[STRING_COPYPOSTFIELDS] = p; 1053 } 1054 } 1055 } 1056 1057 data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS]; 1058 data->set.httpreq = HTTPREQ_POST; 1059 break; 1060 1061 case CURLOPT_POSTFIELDS: 1062 /* 1063 * Like above, but use static data instead of copying it. 1064 */ 1065 data->set.postfields = va_arg(param, void *); 1066 /* Release old copied data. */ 1067 (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 1068 data->set.httpreq = HTTPREQ_POST; 1069 break; 1070 1071 case CURLOPT_POSTFIELDSIZE: 1072 /* 1073 * The size of the POSTFIELD data to prevent libcurl to do strlen() to 1074 * figure it out. Enables binary posts. 1075 */ 1076 bigsize = va_arg(param, long); 1077 1078 if(data->set.postfieldsize < bigsize && 1079 data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) { 1080 /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */ 1081 (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 1082 data->set.postfields = NULL; 1083 } 1084 1085 data->set.postfieldsize = bigsize; 1086 break; 1087 1088 case CURLOPT_POSTFIELDSIZE_LARGE: 1089 /* 1090 * The size of the POSTFIELD data to prevent libcurl to do strlen() to 1091 * figure it out. Enables binary posts. 1092 */ 1093 bigsize = va_arg(param, curl_off_t); 1094 1095 if(data->set.postfieldsize < bigsize && 1096 data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) { 1097 /* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */ 1098 (void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL); 1099 data->set.postfields = NULL; 1100 } 1101 1102 data->set.postfieldsize = bigsize; 1103 break; 1104 1105 case CURLOPT_HTTPPOST: 1106 /* 1107 * Set to make us do HTTP POST 1108 */ 1109 data->set.httppost = va_arg(param, struct curl_httppost *); 1110 data->set.httpreq = HTTPREQ_POST_FORM; 1111 data->set.opt_no_body = FALSE; /* this is implied */ 1112 break; 1113 1114 case CURLOPT_REFERER: 1115 /* 1116 * String to set in the HTTP Referer: field. 1117 */ 1118 if(data->change.referer_alloc) { 1119 Curl_safefree(data->change.referer); 1120 data->change.referer_alloc = FALSE; 1121 } 1122 result = setstropt(&data->set.str[STRING_SET_REFERER], 1123 va_arg(param, char *)); 1124 data->change.referer = data->set.str[STRING_SET_REFERER]; 1125 break; 1126 1127 case CURLOPT_USERAGENT: 1128 /* 1129 * String to use in the HTTP User-Agent field 1130 */ 1131 result = setstropt(&data->set.str[STRING_USERAGENT], 1132 va_arg(param, char *)); 1133 break; 1134 1135 case CURLOPT_HTTPHEADER: 1136 /* 1137 * Set a list with HTTP headers to use (or replace internals with) 1138 */ 1139 data->set.headers = va_arg(param, struct curl_slist *); 1140 break; 1141 1142 case CURLOPT_PROXYHEADER: 1143 /* 1144 * Set a list with proxy headers to use (or replace internals with) 1145 * 1146 * Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a 1147 * long time we remain doing it this way until CURLOPT_PROXYHEADER is 1148 * used. As soon as this option has been used, if set to anything but 1149 * NULL, custom headers for proxies are only picked from this list. 1150 * 1151 * Set this option to NULL to restore the previous behavior. 1152 */ 1153 data->set.proxyheaders = va_arg(param, struct curl_slist *); 1154 break; 1155 1156 case CURLOPT_HEADEROPT: 1157 /* 1158 * Set header option. 1159 */ 1160 arg = va_arg(param, long); 1161 data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE; 1162 break; 1163 1164 case CURLOPT_HTTP200ALIASES: 1165 /* 1166 * Set a list of aliases for HTTP 200 in response header 1167 */ 1168 data->set.http200aliases = va_arg(param, struct curl_slist *); 1169 break; 1170 1171 #if !defined(CURL_DISABLE_COOKIES) 1172 case CURLOPT_COOKIE: 1173 /* 1174 * Cookie string to send to the remote server in the request. 1175 */ 1176 result = setstropt(&data->set.str[STRING_COOKIE], 1177 va_arg(param, char *)); 1178 break; 1179 1180 case CURLOPT_COOKIEFILE: 1181 /* 1182 * Set cookie file to read and parse. Can be used multiple times. 1183 */ 1184 argptr = (char *)va_arg(param, void *); 1185 if(argptr) { 1186 struct curl_slist *cl; 1187 /* append the cookie file name to the list of file names, and deal with 1188 them later */ 1189 cl = curl_slist_append(data->change.cookielist, argptr); 1190 if(!cl) { 1191 curl_slist_free_all(data->change.cookielist); 1192 data->change.cookielist = NULL; 1193 return CURLE_OUT_OF_MEMORY; 1194 } 1195 data->change.cookielist = cl; /* store the list for later use */ 1196 } 1197 break; 1198 1199 case CURLOPT_COOKIEJAR: 1200 /* 1201 * Set cookie file name to dump all cookies to when we're done. 1202 */ 1203 { 1204 struct CookieInfo *newcookies; 1205 result = setstropt(&data->set.str[STRING_COOKIEJAR], 1206 va_arg(param, char *)); 1207 1208 /* 1209 * Activate the cookie parser. This may or may not already 1210 * have been made. 1211 */ 1212 newcookies = Curl_cookie_init(data, NULL, data->cookies, 1213 data->set.cookiesession); 1214 if(!newcookies) 1215 result = CURLE_OUT_OF_MEMORY; 1216 data->cookies = newcookies; 1217 } 1218 break; 1219 1220 case CURLOPT_COOKIESESSION: 1221 /* 1222 * Set this option to TRUE to start a new "cookie session". It will 1223 * prevent the forthcoming read-cookies-from-file actions to accept 1224 * cookies that are marked as being session cookies, as they belong to a 1225 * previous session. 1226 * 1227 * In the original Netscape cookie spec, "session cookies" are cookies 1228 * with no expire date set. RFC2109 describes the same action if no 1229 * 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds 1230 * a 'Discard' action that can enforce the discard even for cookies that 1231 * have a Max-Age. 1232 * 1233 * We run mostly with the original cookie spec, as hardly anyone implements 1234 * anything else. 1235 */ 1236 data->set.cookiesession = (0 != va_arg(param, long)) ? TRUE : FALSE; 1237 break; 1238 1239 case CURLOPT_COOKIELIST: 1240 argptr = va_arg(param, char *); 1241 1242 if(argptr == NULL) 1243 break; 1244 1245 if(strcasecompare(argptr, "ALL")) { 1246 /* clear all cookies */ 1247 Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 1248 Curl_cookie_clearall(data->cookies); 1249 Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 1250 } 1251 else if(strcasecompare(argptr, "SESS")) { 1252 /* clear session cookies */ 1253 Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 1254 Curl_cookie_clearsess(data->cookies); 1255 Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 1256 } 1257 else if(strcasecompare(argptr, "FLUSH")) { 1258 /* flush cookies to file, takes care of the locking */ 1259 Curl_flush_cookies(data, 0); 1260 } 1261 else if(strcasecompare(argptr, "RELOAD")) { 1262 /* reload cookies from file */ 1263 Curl_cookie_loadfiles(data); 1264 break; 1265 } 1266 else { 1267 if(!data->cookies) 1268 /* if cookie engine was not running, activate it */ 1269 data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE); 1270 1271 argptr = strdup(argptr); 1272 if(!argptr || !data->cookies) { 1273 result = CURLE_OUT_OF_MEMORY; 1274 free(argptr); 1275 } 1276 else { 1277 Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE); 1278 1279 if(checkprefix("Set-Cookie:", argptr)) 1280 /* HTTP Header format line */ 1281 Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL); 1282 1283 else 1284 /* Netscape format line */ 1285 Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL); 1286 1287 Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE); 1288 free(argptr); 1289 } 1290 } 1291 1292 break; 1293 #endif /* CURL_DISABLE_COOKIES */ 1294 1295 case CURLOPT_HTTPGET: 1296 /* 1297 * Set to force us do HTTP GET 1298 */ 1299 if(va_arg(param, long)) { 1300 data->set.httpreq = HTTPREQ_GET; 1301 data->set.upload = FALSE; /* switch off upload */ 1302 data->set.opt_no_body = FALSE; /* this is implied */ 1303 } 1304 break; 1305 1306 case CURLOPT_HTTP_VERSION: 1307 /* 1308 * This sets a requested HTTP version to be used. The value is one of 1309 * the listed enums in curl/curl.h. 1310 */ 1311 arg = va_arg(param, long); 1312 #ifndef USE_NGHTTP2 1313 if(arg >= CURL_HTTP_VERSION_2) 1314 return CURLE_UNSUPPORTED_PROTOCOL; 1315 #endif 1316 data->set.httpversion = arg; 1317 break; 1318 1319 case CURLOPT_HTTPAUTH: 1320 /* 1321 * Set HTTP Authentication type BITMASK. 1322 */ 1323 { 1324 int bitcheck; 1325 bool authbits; 1326 unsigned long auth = va_arg(param, unsigned long); 1327 1328 if(auth == CURLAUTH_NONE) { 1329 data->set.httpauth = auth; 1330 break; 1331 } 1332 1333 /* the DIGEST_IE bit is only used to set a special marker, for all the 1334 rest we need to handle it as normal DIGEST */ 1335 data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE; 1336 1337 if(auth & CURLAUTH_DIGEST_IE) { 1338 auth |= CURLAUTH_DIGEST; /* set standard digest bit */ 1339 auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */ 1340 } 1341 1342 /* switch off bits we can't support */ 1343 #ifndef USE_NTLM 1344 auth &= ~CURLAUTH_NTLM; /* no NTLM support */ 1345 auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 1346 #elif !defined(NTLM_WB_ENABLED) 1347 auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 1348 #endif 1349 #ifndef USE_SPNEGO 1350 auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without 1351 GSS-API or SSPI */ 1352 #endif 1353 1354 /* check if any auth bit lower than CURLAUTH_ONLY is still set */ 1355 bitcheck = 0; 1356 authbits = FALSE; 1357 while(bitcheck < 31) { 1358 if(auth & (1UL << bitcheck++)) { 1359 authbits = TRUE; 1360 break; 1361 } 1362 } 1363 if(!authbits) 1364 return CURLE_NOT_BUILT_IN; /* no supported types left! */ 1365 1366 data->set.httpauth = auth; 1367 } 1368 break; 1369 1370 case CURLOPT_EXPECT_100_TIMEOUT_MS: 1371 /* 1372 * Time to wait for a response to a HTTP request containing an 1373 * Expect: 100-continue header before sending the data anyway. 1374 */ 1375 data->set.expect_100_timeout = va_arg(param, long); 1376 break; 1377 1378 #endif /* CURL_DISABLE_HTTP */ 1379 1380 case CURLOPT_CUSTOMREQUEST: 1381 /* 1382 * Set a custom string to use as request 1383 */ 1384 result = setstropt(&data->set.str[STRING_CUSTOMREQUEST], 1385 va_arg(param, char *)); 1386 1387 /* we don't set 1388 data->set.httpreq = HTTPREQ_CUSTOM; 1389 here, we continue as if we were using the already set type 1390 and this just changes the actual request keyword */ 1391 break; 1392 1393 #ifndef CURL_DISABLE_PROXY 1394 case CURLOPT_HTTPPROXYTUNNEL: 1395 /* 1396 * Tunnel operations through the proxy instead of normal proxy use 1397 */ 1398 data->set.tunnel_thru_httpproxy = (0 != va_arg(param, long)) ? 1399 TRUE : FALSE; 1400 break; 1401 1402 case CURLOPT_PROXYPORT: 1403 /* 1404 * Explicitly set HTTP proxy port number. 1405 */ 1406 data->set.proxyport = va_arg(param, long); 1407 break; 1408 1409 case CURLOPT_PROXYAUTH: 1410 /* 1411 * Set HTTP Authentication type BITMASK. 1412 */ 1413 { 1414 int bitcheck; 1415 bool authbits; 1416 unsigned long auth = va_arg(param, unsigned long); 1417 1418 if(auth == CURLAUTH_NONE) { 1419 data->set.proxyauth = auth; 1420 break; 1421 } 1422 1423 /* the DIGEST_IE bit is only used to set a special marker, for all the 1424 rest we need to handle it as normal DIGEST */ 1425 data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE; 1426 1427 if(auth & CURLAUTH_DIGEST_IE) { 1428 auth |= CURLAUTH_DIGEST; /* set standard digest bit */ 1429 auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */ 1430 } 1431 /* switch off bits we can't support */ 1432 #ifndef USE_NTLM 1433 auth &= ~CURLAUTH_NTLM; /* no NTLM support */ 1434 auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 1435 #elif !defined(NTLM_WB_ENABLED) 1436 auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */ 1437 #endif 1438 #ifndef USE_SPNEGO 1439 auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without 1440 GSS-API or SSPI */ 1441 #endif 1442 1443 /* check if any auth bit lower than CURLAUTH_ONLY is still set */ 1444 bitcheck = 0; 1445 authbits = FALSE; 1446 while(bitcheck < 31) { 1447 if(auth & (1UL << bitcheck++)) { 1448 authbits = TRUE; 1449 break; 1450 } 1451 } 1452 if(!authbits) 1453 return CURLE_NOT_BUILT_IN; /* no supported types left! */ 1454 1455 data->set.proxyauth = auth; 1456 } 1457 break; 1458 1459 case CURLOPT_PROXY: 1460 /* 1461 * Set proxy server:port to use as proxy. 1462 * 1463 * If the proxy is set to "" (and CURLOPT_SOCKS_PROXY is set to "" or NULL) 1464 * we explicitly say that we don't want to use a proxy 1465 * (even though there might be environment variables saying so). 1466 * 1467 * Setting it to NULL, means no proxy but allows the environment variables 1468 * to decide for us (if CURLOPT_SOCKS_PROXY setting it to NULL). 1469 */ 1470 result = setstropt(&data->set.str[STRING_PROXY], 1471 va_arg(param, char *)); 1472 break; 1473 1474 case CURLOPT_SOCKS_PROXY: 1475 /* 1476 * Set proxy server:port to use as SOCKS proxy. 1477 * 1478 * If the proxy is set to "" or NULL we explicitly say that we don't want 1479 * to use the socks proxy. 1480 */ 1481 result = setstropt(&data->set.str[STRING_SOCKS_PROXY], 1482 va_arg(param, char *)); 1483 break; 1484 1485 case CURLOPT_PROXYTYPE: 1486 /* 1487 * Set proxy type. HTTP/HTTP_1_0/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME 1488 */ 1489 data->set.proxytype = (curl_proxytype)va_arg(param, long); 1490 break; 1491 1492 case CURLOPT_SOCKS_PROXYTYPE: 1493 /* 1494 * Set proxy type. SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME 1495 */ 1496 data->set.socks_proxytype = (curl_proxytype)va_arg(param, long); 1497 break; 1498 1499 case CURLOPT_PROXY_TRANSFER_MODE: 1500 /* 1501 * set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy 1502 */ 1503 switch (va_arg(param, long)) { 1504 case 0: 1505 data->set.proxy_transfer_mode = FALSE; 1506 break; 1507 case 1: 1508 data->set.proxy_transfer_mode = TRUE; 1509 break; 1510 default: 1511 /* reserve other values for future use */ 1512 result = CURLE_UNKNOWN_OPTION; 1513 break; 1514 } 1515 break; 1516 #endif /* CURL_DISABLE_PROXY */ 1517 1518 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) 1519 case CURLOPT_SOCKS5_GSSAPI_NEC: 1520 /* 1521 * Set flag for NEC SOCK5 support 1522 */ 1523 data->set.socks5_gssapi_nec = (0 != va_arg(param, long)) ? TRUE : FALSE; 1524 break; 1525 1526 case CURLOPT_SOCKS5_GSSAPI_SERVICE: 1527 case CURLOPT_PROXY_SERVICE_NAME: 1528 /* 1529 * Set proxy authentication service name for Kerberos 5 and SPNEGO 1530 */ 1531 result = setstropt(&data->set.str[STRING_PROXY_SERVICE_NAME], 1532 va_arg(param, char *)); 1533 break; 1534 #endif 1535 1536 #if !defined(CURL_DISABLE_CRYPTO_AUTH) || defined(USE_KERBEROS5) || \ 1537 defined(USE_SPNEGO) 1538 case CURLOPT_SERVICE_NAME: 1539 /* 1540 * Set authentication service name for DIGEST-MD5, Kerberos 5 and SPNEGO 1541 */ 1542 result = setstropt(&data->set.str[STRING_SERVICE_NAME], 1543 va_arg(param, char *)); 1544 break; 1545 1546 #endif 1547 1548 case CURLOPT_HEADERDATA: 1549 /* 1550 * Custom pointer to pass the header write callback function 1551 */ 1552 data->set.writeheader = (void *)va_arg(param, void *); 1553 break; 1554 case CURLOPT_ERRORBUFFER: 1555 /* 1556 * Error buffer provided by the caller to get the human readable 1557 * error string in. 1558 */ 1559 data->set.errorbuffer = va_arg(param, char *); 1560 break; 1561 case CURLOPT_WRITEDATA: 1562 /* 1563 * FILE pointer to write to. Or possibly 1564 * used as argument to the write callback. 1565 */ 1566 data->set.out = va_arg(param, void *); 1567 break; 1568 case CURLOPT_FTPPORT: 1569 /* 1570 * Use FTP PORT, this also specifies which IP address to use 1571 */ 1572 result = setstropt(&data->set.str[STRING_FTPPORT], 1573 va_arg(param, char *)); 1574 data->set.ftp_use_port = (data->set.str[STRING_FTPPORT]) ? TRUE : FALSE; 1575 break; 1576 1577 case CURLOPT_FTP_USE_EPRT: 1578 data->set.ftp_use_eprt = (0 != va_arg(param, long)) ? TRUE : FALSE; 1579 break; 1580 1581 case CURLOPT_FTP_USE_EPSV: 1582 data->set.ftp_use_epsv = (0 != va_arg(param, long)) ? TRUE : FALSE; 1583 break; 1584 1585 case CURLOPT_FTP_USE_PRET: 1586 data->set.ftp_use_pret = (0 != va_arg(param, long)) ? TRUE : FALSE; 1587 break; 1588 1589 case CURLOPT_FTP_SSL_CCC: 1590 data->set.ftp_ccc = (curl_ftpccc)va_arg(param, long); 1591 break; 1592 1593 case CURLOPT_FTP_SKIP_PASV_IP: 1594 /* 1595 * Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the 1596 * bypass of the IP address in PASV responses. 1597 */ 1598 data->set.ftp_skip_ip = (0 != va_arg(param, long)) ? TRUE : FALSE; 1599 break; 1600 1601 case CURLOPT_READDATA: 1602 /* 1603 * FILE pointer to read the file to be uploaded from. Or possibly 1604 * used as argument to the read callback. 1605 */ 1606 data->set.in_set = va_arg(param, void *); 1607 break; 1608 case CURLOPT_INFILESIZE: 1609 /* 1610 * If known, this should inform curl about the file size of the 1611 * to-be-uploaded file. 1612 */ 1613 data->set.filesize = va_arg(param, long); 1614 break; 1615 case CURLOPT_INFILESIZE_LARGE: 1616 /* 1617 * If known, this should inform curl about the file size of the 1618 * to-be-uploaded file. 1619 */ 1620 data->set.filesize = va_arg(param, curl_off_t); 1621 break; 1622 case CURLOPT_LOW_SPEED_LIMIT: 1623 /* 1624 * The low speed limit that if transfers are below this for 1625 * CURLOPT_LOW_SPEED_TIME, the transfer is aborted. 1626 */ 1627 data->set.low_speed_limit=va_arg(param, long); 1628 break; 1629 case CURLOPT_MAX_SEND_SPEED_LARGE: 1630 /* 1631 * When transfer uploads are faster then CURLOPT_MAX_SEND_SPEED_LARGE 1632 * bytes per second the transfer is throttled.. 1633 */ 1634 data->set.max_send_speed=va_arg(param, curl_off_t); 1635 break; 1636 case CURLOPT_MAX_RECV_SPEED_LARGE: 1637 /* 1638 * When receiving data faster than CURLOPT_MAX_RECV_SPEED_LARGE bytes per 1639 * second the transfer is throttled.. 1640 */ 1641 data->set.max_recv_speed=va_arg(param, curl_off_t); 1642 break; 1643 case CURLOPT_LOW_SPEED_TIME: 1644 /* 1645 * The low speed time that if transfers are below the set 1646 * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted. 1647 */ 1648 data->set.low_speed_time=va_arg(param, long); 1649 break; 1650 case CURLOPT_URL: 1651 /* 1652 * The URL to fetch. 1653 */ 1654 if(data->change.url_alloc) { 1655 /* the already set URL is allocated, free it first! */ 1656 Curl_safefree(data->change.url); 1657 data->change.url_alloc = FALSE; 1658 } 1659 result = setstropt(&data->set.str[STRING_SET_URL], 1660 va_arg(param, char *)); 1661 data->change.url = data->set.str[STRING_SET_URL]; 1662 break; 1663 case CURLOPT_PORT: 1664 /* 1665 * The port number to use when getting the URL 1666 */ 1667 data->set.use_port = va_arg(param, long); 1668 break; 1669 case CURLOPT_TIMEOUT: 1670 /* 1671 * The maximum time you allow curl to use for a single transfer 1672 * operation. 1673 */ 1674 data->set.timeout = va_arg(param, long) * 1000L; 1675 break; 1676 1677 case CURLOPT_TIMEOUT_MS: 1678 data->set.timeout = va_arg(param, long); 1679 break; 1680 1681 case CURLOPT_CONNECTTIMEOUT: 1682 /* 1683 * The maximum time you allow curl to use to connect. 1684 */ 1685 data->set.connecttimeout = va_arg(param, long) * 1000L; 1686 break; 1687 1688 case CURLOPT_CONNECTTIMEOUT_MS: 1689 data->set.connecttimeout = va_arg(param, long); 1690 break; 1691 1692 case CURLOPT_ACCEPTTIMEOUT_MS: 1693 /* 1694 * The maximum time you allow curl to wait for server connect 1695 */ 1696 data->set.accepttimeout = va_arg(param, long); 1697 break; 1698 1699 case CURLOPT_USERPWD: 1700 /* 1701 * user:password to use in the operation 1702 */ 1703 result = setstropt_userpwd(va_arg(param, char *), 1704 &data->set.str[STRING_USERNAME], 1705 &data->set.str[STRING_PASSWORD]); 1706 break; 1707 1708 case CURLOPT_USERNAME: 1709 /* 1710 * authentication user name to use in the operation 1711 */ 1712 result = setstropt(&data->set.str[STRING_USERNAME], 1713 va_arg(param, char *)); 1714 break; 1715 1716 case CURLOPT_PASSWORD: 1717 /* 1718 * authentication password to use in the operation 1719 */ 1720 result = setstropt(&data->set.str[STRING_PASSWORD], 1721 va_arg(param, char *)); 1722 break; 1723 1724 case CURLOPT_LOGIN_OPTIONS: 1725 /* 1726 * authentication options to use in the operation 1727 */ 1728 result = setstropt(&data->set.str[STRING_OPTIONS], 1729 va_arg(param, char *)); 1730 break; 1731 1732 case CURLOPT_XOAUTH2_BEARER: 1733 /* 1734 * OAuth 2.0 bearer token to use in the operation 1735 */ 1736 result = setstropt(&data->set.str[STRING_BEARER], 1737 va_arg(param, char *)); 1738 break; 1739 1740 case CURLOPT_POSTQUOTE: 1741 /* 1742 * List of RAW FTP commands to use after a transfer 1743 */ 1744 data->set.postquote = va_arg(param, struct curl_slist *); 1745 break; 1746 case CURLOPT_PREQUOTE: 1747 /* 1748 * List of RAW FTP commands to use prior to RETR (Wesley Laxton) 1749 */ 1750 data->set.prequote = va_arg(param, struct curl_slist *); 1751 break; 1752 case CURLOPT_QUOTE: 1753 /* 1754 * List of RAW FTP commands to use before a transfer 1755 */ 1756 data->set.quote = va_arg(param, struct curl_slist *); 1757 break; 1758 case CURLOPT_RESOLVE: 1759 /* 1760 * List of NAME:[address] names to populate the DNS cache with 1761 * Prefix the NAME with dash (-) to _remove_ the name from the cache. 1762 * 1763 * Names added with this API will remain in the cache until explicitly 1764 * removed or the handle is cleaned up. 1765 * 1766 * This API can remove any name from the DNS cache, but only entries 1767 * that aren't actually in use right now will be pruned immediately. 1768 */ 1769 data->set.resolve = va_arg(param, struct curl_slist *); 1770 data->change.resolve = data->set.resolve; 1771 break; 1772 case CURLOPT_PROGRESSFUNCTION: 1773 /* 1774 * Progress callback function 1775 */ 1776 data->set.fprogress = va_arg(param, curl_progress_callback); 1777 if(data->set.fprogress) 1778 data->progress.callback = TRUE; /* no longer internal */ 1779 else 1780 data->progress.callback = FALSE; /* NULL enforces internal */ 1781 break; 1782 1783 case CURLOPT_XFERINFOFUNCTION: 1784 /* 1785 * Transfer info callback function 1786 */ 1787 data->set.fxferinfo = va_arg(param, curl_xferinfo_callback); 1788 if(data->set.fxferinfo) 1789 data->progress.callback = TRUE; /* no longer internal */ 1790 else 1791 data->progress.callback = FALSE; /* NULL enforces internal */ 1792 1793 break; 1794 1795 case CURLOPT_PROGRESSDATA: 1796 /* 1797 * Custom client data to pass to the progress callback 1798 */ 1799 data->set.progress_client = va_arg(param, void *); 1800 break; 1801 1802 #ifndef CURL_DISABLE_PROXY 1803 case CURLOPT_PROXYUSERPWD: 1804 /* 1805 * user:password needed to use the proxy 1806 */ 1807 result = setstropt_userpwd(va_arg(param, char *), 1808 &data->set.str[STRING_PROXYUSERNAME], 1809 &data->set.str[STRING_PROXYPASSWORD]); 1810 break; 1811 case CURLOPT_PROXYUSERNAME: 1812 /* 1813 * authentication user name to use in the operation 1814 */ 1815 result = setstropt(&data->set.str[STRING_PROXYUSERNAME], 1816 va_arg(param, char *)); 1817 break; 1818 case CURLOPT_PROXYPASSWORD: 1819 /* 1820 * authentication password to use in the operation 1821 */ 1822 result = setstropt(&data->set.str[STRING_PROXYPASSWORD], 1823 va_arg(param, char *)); 1824 break; 1825 case CURLOPT_NOPROXY: 1826 /* 1827 * proxy exception list 1828 */ 1829 result = setstropt(&data->set.str[STRING_NOPROXY], 1830 va_arg(param, char *)); 1831 break; 1832 #endif 1833 1834 case CURLOPT_RANGE: 1835 /* 1836 * What range of the file you want to transfer 1837 */ 1838 result = setstropt(&data->set.str[STRING_SET_RANGE], 1839 va_arg(param, char *)); 1840 break; 1841 case CURLOPT_RESUME_FROM: 1842 /* 1843 * Resume transfer at the give file position 1844 */ 1845 data->set.set_resume_from = va_arg(param, long); 1846 break; 1847 case CURLOPT_RESUME_FROM_LARGE: 1848 /* 1849 * Resume transfer at the give file position 1850 */ 1851 data->set.set_resume_from = va_arg(param, curl_off_t); 1852 break; 1853 case CURLOPT_DEBUGFUNCTION: 1854 /* 1855 * stderr write callback. 1856 */ 1857 data->set.fdebug = va_arg(param, curl_debug_callback); 1858 /* 1859 * if the callback provided is NULL, it'll use the default callback 1860 */ 1861 break; 1862 case CURLOPT_DEBUGDATA: 1863 /* 1864 * Set to a void * that should receive all error writes. This 1865 * defaults to CURLOPT_STDERR for normal operations. 1866 */ 1867 data->set.debugdata = va_arg(param, void *); 1868 break; 1869 case CURLOPT_STDERR: 1870 /* 1871 * Set to a FILE * that should receive all error writes. This 1872 * defaults to stderr for normal operations. 1873 */ 1874 data->set.err = va_arg(param, FILE *); 1875 if(!data->set.err) 1876 data->set.err = stderr; 1877 break; 1878 case CURLOPT_HEADERFUNCTION: 1879 /* 1880 * Set header write callback 1881 */ 1882 data->set.fwrite_header = va_arg(param, curl_write_callback); 1883 break; 1884 case CURLOPT_WRITEFUNCTION: 1885 /* 1886 * Set data write callback 1887 */ 1888 data->set.fwrite_func = va_arg(param, curl_write_callback); 1889 if(!data->set.fwrite_func) { 1890 data->set.is_fwrite_set = 0; 1891 /* When set to NULL, reset to our internal default function */ 1892 data->set.fwrite_func = (curl_write_callback)fwrite; 1893 } 1894 else 1895 data->set.is_fwrite_set = 1; 1896 break; 1897 case CURLOPT_READFUNCTION: 1898 /* 1899 * Read data callback 1900 */ 1901 data->set.fread_func_set = va_arg(param, curl_read_callback); 1902 if(!data->set.fread_func_set) { 1903 data->set.is_fread_set = 0; 1904 /* When set to NULL, reset to our internal default function */ 1905 data->set.fread_func_set = (curl_read_callback)fread; 1906 } 1907 else 1908 data->set.is_fread_set = 1; 1909 break; 1910 case CURLOPT_SEEKFUNCTION: 1911 /* 1912 * Seek callback. Might be NULL. 1913 */ 1914 data->set.seek_func = va_arg(param, curl_seek_callback); 1915 break; 1916 case CURLOPT_SEEKDATA: 1917 /* 1918 * Seek control callback. Might be NULL. 1919 */ 1920 data->set.seek_client = va_arg(param, void *); 1921 break; 1922 case CURLOPT_CONV_FROM_NETWORK_FUNCTION: 1923 /* 1924 * "Convert from network encoding" callback 1925 */ 1926 data->set.convfromnetwork = va_arg(param, curl_conv_callback); 1927 break; 1928 case CURLOPT_CONV_TO_NETWORK_FUNCTION: 1929 /* 1930 * "Convert to network encoding" callback 1931 */ 1932 data->set.convtonetwork = va_arg(param, curl_conv_callback); 1933 break; 1934 case CURLOPT_CONV_FROM_UTF8_FUNCTION: 1935 /* 1936 * "Convert from UTF-8 encoding" callback 1937 */ 1938 data->set.convfromutf8 = va_arg(param, curl_conv_callback); 1939 break; 1940 case CURLOPT_IOCTLFUNCTION: 1941 /* 1942 * I/O control callback. Might be NULL. 1943 */ 1944 data->set.ioctl_func = va_arg(param, curl_ioctl_callback); 1945 break; 1946 case CURLOPT_IOCTLDATA: 1947 /* 1948 * I/O control data pointer. Might be NULL. 1949 */ 1950 data->set.ioctl_client = va_arg(param, void *); 1951 break; 1952 case CURLOPT_SSLCERT: 1953 /* 1954 * String that holds file name of the SSL certificate to use 1955 */ 1956 result = setstropt(&data->set.str[STRING_CERT_ORIG], 1957 va_arg(param, char *)); 1958 break; 1959 case CURLOPT_PROXY_SSLCERT: 1960 /* 1961 * String that holds file name of the SSL certificate to use for proxy 1962 */ 1963 result = setstropt(&data->set.str[STRING_CERT_PROXY], 1964 va_arg(param, char *)); 1965 break; 1966 case CURLOPT_SSLCERTTYPE: 1967 /* 1968 * String that holds file type of the SSL certificate to use 1969 */ 1970 result = setstropt(&data->set.str[STRING_CERT_TYPE_ORIG], 1971 va_arg(param, char *)); 1972 break; 1973 case CURLOPT_PROXY_SSLCERTTYPE: 1974 /* 1975 * String that holds file type of the SSL certificate to use for proxy 1976 */ 1977 result = setstropt(&data->set.str[STRING_CERT_TYPE_PROXY], 1978 va_arg(param, char *)); 1979 break; 1980 case CURLOPT_SSLKEY: 1981 /* 1982 * String that holds file name of the SSL key to use 1983 */ 1984 result = setstropt(&data->set.str[STRING_KEY_ORIG], 1985 va_arg(param, char *)); 1986 break; 1987 case CURLOPT_PROXY_SSLKEY: 1988 /* 1989 * String that holds file name of the SSL key to use for proxy 1990 */ 1991 result = setstropt(&data->set.str[STRING_KEY_PROXY], 1992 va_arg(param, char *)); 1993 break; 1994 case CURLOPT_SSLKEYTYPE: 1995 /* 1996 * String that holds file type of the SSL key to use 1997 */ 1998 result = setstropt(&data->set.str[STRING_KEY_TYPE_ORIG], 1999 va_arg(param, char *)); 2000 break; 2001 case CURLOPT_PROXY_SSLKEYTYPE: 2002 /* 2003 * String that holds file type of the SSL key to use for proxy 2004 */ 2005 result = setstropt(&data->set.str[STRING_KEY_TYPE_PROXY], 2006 va_arg(param, char *)); 2007 break; 2008 case CURLOPT_KEYPASSWD: 2009 /* 2010 * String that holds the SSL or SSH private key password. 2011 */ 2012 result = setstropt(&data->set.str[STRING_KEY_PASSWD_ORIG], 2013 va_arg(param, char *)); 2014 break; 2015 case CURLOPT_PROXY_KEYPASSWD: 2016 /* 2017 * String that holds the SSL private key password for proxy. 2018 */ 2019 result = setstropt(&data->set.str[STRING_KEY_PASSWD_PROXY], 2020 va_arg(param, char *)); 2021 break; 2022 case CURLOPT_SSLENGINE: 2023 /* 2024 * String that holds the SSL crypto engine. 2025 */ 2026 argptr = va_arg(param, char *); 2027 if(argptr && argptr[0]) 2028 result = Curl_ssl_set_engine(data, argptr); 2029 break; 2030 2031 case CURLOPT_SSLENGINE_DEFAULT: 2032 /* 2033 * flag to set engine as default. 2034 */ 2035 result = Curl_ssl_set_engine_default(data); 2036 break; 2037 case CURLOPT_CRLF: 2038 /* 2039 * Kludgy option to enable CRLF conversions. Subject for removal. 2040 */ 2041 data->set.crlf = (0 != va_arg(param, long)) ? TRUE : FALSE; 2042 break; 2043 2044 case CURLOPT_INTERFACE: 2045 /* 2046 * Set what interface or address/hostname to bind the socket to when 2047 * performing an operation and thus what from-IP your connection will use. 2048 */ 2049 result = setstropt(&data->set.str[STRING_DEVICE], 2050 va_arg(param, char *)); 2051 break; 2052 case CURLOPT_LOCALPORT: 2053 /* 2054 * Set what local port to bind the socket to when performing an operation. 2055 */ 2056 data->set.localport = curlx_sltous(va_arg(param, long)); 2057 break; 2058 case CURLOPT_LOCALPORTRANGE: 2059 /* 2060 * Set number of local ports to try, starting with CURLOPT_LOCALPORT. 2061 */ 2062 data->set.localportrange = curlx_sltosi(va_arg(param, long)); 2063 break; 2064 case CURLOPT_KRBLEVEL: 2065 /* 2066 * A string that defines the kerberos security level. 2067 */ 2068 result = setstropt(&data->set.str[STRING_KRB_LEVEL], 2069 va_arg(param, char *)); 2070 data->set.krb = (data->set.str[STRING_KRB_LEVEL]) ? TRUE : FALSE; 2071 break; 2072 case CURLOPT_GSSAPI_DELEGATION: 2073 /* 2074 * GSS-API credential delegation 2075 */ 2076 data->set.gssapi_delegation = va_arg(param, long); 2077 break; 2078 case CURLOPT_SSL_VERIFYPEER: 2079 /* 2080 * Enable peer SSL verifying. 2081 */ 2082 data->set.ssl.primary.verifypeer = (0 != va_arg(param, long)) ? 2083 TRUE : FALSE; 2084 break; 2085 case CURLOPT_PROXY_SSL_VERIFYPEER: 2086 /* 2087 * Enable peer SSL verifying for proxy. 2088 */ 2089 data->set.proxy_ssl.primary.verifypeer = 2090 (0 != va_arg(param, long))?TRUE:FALSE; 2091 break; 2092 case CURLOPT_SSL_VERIFYHOST: 2093 /* 2094 * Enable verification of the host name in the peer certificate 2095 */ 2096 arg = va_arg(param, long); 2097 2098 /* Obviously people are not reading documentation and too many thought 2099 this argument took a boolean when it wasn't and misused it. We thus ban 2100 1 as a sensible input and we warn about its use. Then we only have the 2101 2 action internally stored as TRUE. */ 2102 2103 if(1 == arg) { 2104 failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!"); 2105 return CURLE_BAD_FUNCTION_ARGUMENT; 2106 } 2107 2108 data->set.ssl.primary.verifyhost = (0 != arg) ? TRUE : FALSE; 2109 break; 2110 case CURLOPT_PROXY_SSL_VERIFYHOST: 2111 /* 2112 * Enable verification of the host name in the peer certificate for proxy 2113 */ 2114 arg = va_arg(param, long); 2115 2116 /* Obviously people are not reading documentation and too many thought 2117 this argument took a boolean when it wasn't and misused it. We thus ban 2118 1 as a sensible input and we warn about its use. Then we only have the 2119 2 action internally stored as TRUE. */ 2120 2121 if(1 == arg) { 2122 failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!"); 2123 return CURLE_BAD_FUNCTION_ARGUMENT; 2124 } 2125 2126 data->set.proxy_ssl.primary.verifyhost = (0 != arg)?TRUE:FALSE; 2127 break; 2128 case CURLOPT_SSL_VERIFYSTATUS: 2129 /* 2130 * Enable certificate status verifying. 2131 */ 2132 if(!Curl_ssl_cert_status_request()) { 2133 result = CURLE_NOT_BUILT_IN; 2134 break; 2135 } 2136 2137 data->set.ssl.primary.verifystatus = (0 != va_arg(param, long)) ? 2138 TRUE : FALSE; 2139 break; 2140 case CURLOPT_SSL_CTX_FUNCTION: 2141 #ifdef have_curlssl_ssl_ctx 2142 /* 2143 * Set a SSL_CTX callback 2144 */ 2145 data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback); 2146 #else 2147 result = CURLE_NOT_BUILT_IN; 2148 #endif 2149 break; 2150 case CURLOPT_SSL_CTX_DATA: 2151 #ifdef have_curlssl_ssl_ctx 2152 /* 2153 * Set a SSL_CTX callback parameter pointer 2154 */ 2155 data->set.ssl.fsslctxp = va_arg(param, void *); 2156 #else 2157 result = CURLE_NOT_BUILT_IN; 2158 #endif 2159 break; 2160 case CURLOPT_SSL_FALSESTART: 2161 /* 2162 * Enable TLS false start. 2163 */ 2164 if(!Curl_ssl_false_start()) { 2165 result = CURLE_NOT_BUILT_IN; 2166 break; 2167 } 2168 2169 data->set.ssl.falsestart = (0 != va_arg(param, long)) ? TRUE : FALSE; 2170 break; 2171 case CURLOPT_CERTINFO: 2172 #ifdef have_curlssl_certinfo 2173 data->set.ssl.certinfo = (0 != va_arg(param, long)) ? TRUE : FALSE; 2174 #else 2175 result = CURLE_NOT_BUILT_IN; 2176 #endif 2177 break; 2178 case CURLOPT_PINNEDPUBLICKEY: 2179 #ifdef have_curlssl_pinnedpubkey /* only by supported backends */ 2180 /* 2181 * Set pinned public key for SSL connection. 2182 * Specify file name of the public key in DER format. 2183 */ 2184 result = setstropt(&data->set.str[STRING_SSL_PINNEDPUBLICKEY], 2185 va_arg(param, char *)); 2186 #else 2187 result = CURLE_NOT_BUILT_IN; 2188 #endif 2189 break; 2190 case CURLOPT_CAINFO: 2191 /* 2192 * Set CA info for SSL connection. Specify file name of the CA certificate 2193 */ 2194 result = setstropt(&data->set.str[STRING_SSL_CAFILE_ORIG], 2195 va_arg(param, char *)); 2196 break; 2197 case CURLOPT_PROXY_CAINFO: 2198 /* 2199 * Set CA info SSL connection for proxy. Specify file name of the 2200 * CA certificate 2201 */ 2202 result = setstropt(&data->set.str[STRING_SSL_CAFILE_PROXY], 2203 va_arg(param, char *)); 2204 break; 2205 case CURLOPT_CAPATH: 2206 #ifdef have_curlssl_ca_path /* not supported by all backends */ 2207 /* 2208 * Set CA path info for SSL connection. Specify directory name of the CA 2209 * certificates which have been prepared using openssl c_rehash utility. 2210 */ 2211 /* This does not work on windows. */ 2212 result = setstropt(&data->set.str[STRING_SSL_CAPATH_ORIG], 2213 va_arg(param, char *)); 2214 break; 2215 case CURLOPT_PROXY_CAPATH: 2216 /* 2217 * Set CA path info for SSL connection proxy. Specify directory name of the 2218 * CA certificates which have been prepared using openssl c_rehash utility. 2219 */ 2220 /* This does not work on windows. */ 2221 result = setstropt(&data->set.str[STRING_SSL_CAPATH_PROXY], 2222 va_arg(param, char *)); 2223 #else 2224 result = CURLE_NOT_BUILT_IN; 2225 #endif 2226 break; 2227 case CURLOPT_CRLFILE: 2228 /* 2229 * Set CRL file info for SSL connection. Specify file name of the CRL 2230 * to check certificates revocation 2231 */ 2232 result = setstropt(&data->set.str[STRING_SSL_CRLFILE_ORIG], 2233 va_arg(param, char *)); 2234 break; 2235 case CURLOPT_PROXY_CRLFILE: 2236 /* 2237 * Set CRL file info for SSL connection for proxy. Specify file name of the 2238 * CRL to check certificates revocation 2239 */ 2240 result = setstropt(&data->set.str[STRING_SSL_CRLFILE_PROXY], 2241 va_arg(param, char *)); 2242 break; 2243 case CURLOPT_ISSUERCERT: 2244 /* 2245 * Set Issuer certificate file 2246 * to check certificates issuer 2247 */ 2248 result = setstropt(&data->set.str[STRING_SSL_ISSUERCERT_ORIG], 2249 va_arg(param, char *)); 2250 break; 2251 case CURLOPT_TELNETOPTIONS: 2252 /* 2253 * Set a linked list of telnet options 2254 */ 2255 data->set.telnet_options = va_arg(param, struct curl_slist *); 2256 break; 2257 2258 case CURLOPT_BUFFERSIZE: 2259 /* 2260 * The application kindly asks for a differently sized receive buffer. 2261 * If it seems reasonable, we'll use it. 2262 */ 2263 data->set.buffer_size = va_arg(param, long); 2264 2265 if((data->set.buffer_size> (BUFSIZE -1)) || 2266 (data->set.buffer_size < 1)) 2267 data->set.buffer_size = 0; /* huge internal default */ 2268 2269 break; 2270 2271 case CURLOPT_NOSIGNAL: 2272 /* 2273 * The application asks not to set any signal() or alarm() handlers, 2274 * even when using a timeout. 2275 */ 2276 data->set.no_signal = (0 != va_arg(param, long)) ? TRUE : FALSE; 2277 break; 2278 2279 case CURLOPT_SHARE: 2280 { 2281 struct Curl_share *set; 2282 set = va_arg(param, struct Curl_share *); 2283 2284 /* disconnect from old share, if any */ 2285 if(data->share) { 2286 Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE); 2287 2288 if(data->dns.hostcachetype == HCACHE_SHARED) { 2289 data->dns.hostcache = NULL; 2290 data->dns.hostcachetype = HCACHE_NONE; 2291 } 2292 2293 #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) 2294 if(data->share->cookies == data->cookies) 2295 data->cookies = NULL; 2296 #endif 2297 2298 if(data->share->sslsession == data->state.session) 2299 data->state.session = NULL; 2300 2301 data->share->dirty--; 2302 2303 Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); 2304 data->share = NULL; 2305 } 2306 2307 /* use new share if it set */ 2308 data->share = set; 2309 if(data->share) { 2310 2311 Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE); 2312 2313 data->share->dirty++; 2314 2315 if(data->share->specifier & (1<< CURL_LOCK_DATA_DNS)) { 2316 /* use shared host cache */ 2317 data->dns.hostcache = &data->share->hostcache; 2318 data->dns.hostcachetype = HCACHE_SHARED; 2319 } 2320 #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES) 2321 if(data->share->cookies) { 2322 /* use shared cookie list, first free own one if any */ 2323 Curl_cookie_cleanup(data->cookies); 2324 /* enable cookies since we now use a share that uses cookies! */ 2325 data->cookies = data->share->cookies; 2326 } 2327 #endif /* CURL_DISABLE_HTTP */ 2328 if(data->share->sslsession) { 2329 data->set.general_ssl.max_ssl_sessions = data->share->max_ssl_sessions; 2330 data->state.session = data->share->sslsession; 2331 } 2332 Curl_share_unlock(data, CURL_LOCK_DATA_SHARE); 2333 2334 } 2335 /* check for host cache not needed, 2336 * it will be done by curl_easy_perform */ 2337 } 2338 break; 2339 2340 case CURLOPT_PRIVATE: 2341 /* 2342 * Set private data pointer. 2343 */ 2344 data->set.private_data = va_arg(param, void *); 2345 break; 2346 2347 case CURLOPT_MAXFILESIZE: 2348 /* 2349 * Set the maximum size of a file to download. 2350 */ 2351 data->set.max_filesize = va_arg(param, long); 2352 break; 2353 2354 #ifdef USE_SSL 2355 case CURLOPT_USE_SSL: 2356 /* 2357 * Make transfers attempt to use SSL/TLS. 2358 */ 2359 data->set.use_ssl = (curl_usessl)va_arg(param, long); 2360 break; 2361 2362 case CURLOPT_SSL_OPTIONS: 2363 arg = va_arg(param, long); 2364 data->set.ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE; 2365 data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE); 2366 break; 2367 2368 case CURLOPT_PROXY_SSL_OPTIONS: 2369 arg = va_arg(param, long); 2370 data->set.proxy_ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE; 2371 data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE); 2372 break; 2373 2374 #endif 2375 case CURLOPT_FTPSSLAUTH: 2376 /* 2377 * Set a specific auth for FTP-SSL transfers. 2378 */ 2379 data->set.ftpsslauth = (curl_ftpauth)va_arg(param, long); 2380 break; 2381 2382 case CURLOPT_IPRESOLVE: 2383 data->set.ipver = va_arg(param, long); 2384 break; 2385 2386 case CURLOPT_MAXFILESIZE_LARGE: 2387 /* 2388 * Set the maximum size of a file to download. 2389 */ 2390 data->set.max_filesize = va_arg(param, curl_off_t); 2391 break; 2392 2393 case CURLOPT_TCP_NODELAY: 2394 /* 2395 * Enable or disable TCP_NODELAY, which will disable/enable the Nagle 2396 * algorithm 2397 */ 2398 data->set.tcp_nodelay = (0 != va_arg(param, long)) ? TRUE : FALSE; 2399 break; 2400 2401 case CURLOPT_FTP_ACCOUNT: 2402 result = setstropt(&data->set.str[STRING_FTP_ACCOUNT], 2403 va_arg(param, char *)); 2404 break; 2405 2406 case CURLOPT_IGNORE_CONTENT_LENGTH: 2407 data->set.ignorecl = (0 != va_arg(param, long)) ? TRUE : FALSE; 2408 break; 2409 2410 case CURLOPT_CONNECT_ONLY: 2411 /* 2412 * No data transfer, set up connection and let application use the socket 2413 */ 2414 data->set.connect_only = (0 != va_arg(param, long)) ? TRUE : FALSE; 2415 break; 2416 2417 case CURLOPT_FTP_ALTERNATIVE_TO_USER: 2418 result = setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER], 2419 va_arg(param, char *)); 2420 break; 2421 2422 case CURLOPT_SOCKOPTFUNCTION: 2423 /* 2424 * socket callback function: called after socket() but before connect() 2425 */ 2426 data->set.fsockopt = va_arg(param, curl_sockopt_callback); 2427 break; 2428 2429 case CURLOPT_SOCKOPTDATA: 2430 /* 2431 * socket callback data pointer. Might be NULL. 2432 */ 2433 data->set.sockopt_client = va_arg(param, void *); 2434 break; 2435 2436 case CURLOPT_OPENSOCKETFUNCTION: 2437 /* 2438 * open/create socket callback function: called instead of socket(), 2439 * before connect() 2440 */ 2441 data->set.fopensocket = va_arg(param, curl_opensocket_callback); 2442 break; 2443 2444 case CURLOPT_OPENSOCKETDATA: 2445 /* 2446 * socket callback data pointer. Might be NULL. 2447 */ 2448 data->set.opensocket_client = va_arg(param, void *); 2449 break; 2450 2451 case CURLOPT_CLOSESOCKETFUNCTION: 2452 /* 2453 * close socket callback function: called instead of close() 2454 * when shutting down a connection 2455 */ 2456 data->set.fclosesocket = va_arg(param, curl_closesocket_callback); 2457 break; 2458 2459 case CURLOPT_CLOSESOCKETDATA: 2460 /* 2461 * socket callback data pointer. Might be NULL. 2462 */ 2463 data->set.closesocket_client = va_arg(param, void *); 2464 break; 2465 2466 case CURLOPT_SSL_SESSIONID_CACHE: 2467 data->set.general_ssl.sessionid = (0 != va_arg(param, long)) ? 2468 TRUE : FALSE; 2469 break; 2470 2471 #ifdef USE_LIBSSH2 2472 /* we only include SSH options if explicitly built to support SSH */ 2473 case CURLOPT_SSH_AUTH_TYPES: 2474 data->set.ssh_auth_types = va_arg(param, long); 2475 break; 2476 2477 case CURLOPT_SSH_PUBLIC_KEYFILE: 2478 /* 2479 * Use this file instead of the $HOME/.ssh/id_dsa.pub file 2480 */ 2481 result = setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY], 2482 va_arg(param, char *)); 2483 break; 2484 2485 case CURLOPT_SSH_PRIVATE_KEYFILE: 2486 /* 2487 * Use this file instead of the $HOME/.ssh/id_dsa file 2488 */ 2489 result = setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY], 2490 va_arg(param, char *)); 2491 break; 2492 case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5: 2493 /* 2494 * Option to allow for the MD5 of the host public key to be checked 2495 * for validation purposes. 2496 */ 2497 result = setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5], 2498 va_arg(param, char *)); 2499 break; 2500 #ifdef HAVE_LIBSSH2_KNOWNHOST_API 2501 case CURLOPT_SSH_KNOWNHOSTS: 2502 /* 2503 * Store the file name to read known hosts from. 2504 */ 2505 result = setstropt(&data->set.str[STRING_SSH_KNOWNHOSTS], 2506 va_arg(param, char *)); 2507 break; 2508 2509 case CURLOPT_SSH_KEYFUNCTION: 2510 /* setting to NULL is fine since the ssh.c functions themselves will 2511 then rever to use the internal default */ 2512 data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback); 2513 break; 2514 2515 case CURLOPT_SSH_KEYDATA: 2516 /* 2517 * Custom client data to pass to the SSH keyfunc callback 2518 */ 2519 data->set.ssh_keyfunc_userp = va_arg(param, void *); 2520 break; 2521 #endif /* HAVE_LIBSSH2_KNOWNHOST_API */ 2522 2523 #endif /* USE_LIBSSH2 */ 2524 2525 case CURLOPT_HTTP_TRANSFER_DECODING: 2526 /* 2527 * disable libcurl transfer encoding is used 2528 */ 2529 data->set.http_te_skip = (0 == va_arg(param, long)) ? TRUE : FALSE; 2530 break; 2531 2532 case CURLOPT_HTTP_CONTENT_DECODING: 2533 /* 2534 * raw data passed to the application when content encoding is used 2535 */ 2536 data->set.http_ce_skip = (0 == va_arg(param, long)) ? TRUE : FALSE; 2537 break; 2538 2539 case CURLOPT_NEW_FILE_PERMS: 2540 /* 2541 * Uses these permissions instead of 0644 2542 */ 2543 data->set.new_file_perms = va_arg(param, long); 2544 break; 2545 2546 case CURLOPT_NEW_DIRECTORY_PERMS: 2547 /* 2548 * Uses these permissions instead of 0755 2549 */ 2550 data->set.new_directory_perms = va_arg(param, long); 2551 break; 2552 2553 case CURLOPT_ADDRESS_SCOPE: 2554 /* 2555 * We always get longs when passed plain numericals, but for this value we 2556 * know that an unsigned int will always hold the value so we blindly 2557 * typecast to this type 2558 */ 2559 data->set.scope_id = curlx_sltoui(va_arg(param, long)); 2560 break; 2561 2562 case CURLOPT_PROTOCOLS: 2563 /* set the bitmask for the protocols that are allowed to be used for the 2564 transfer, which thus helps the app which takes URLs from users or other 2565 external inputs and want to restrict what protocol(s) to deal 2566 with. Defaults to CURLPROTO_ALL. */ 2567 data->set.allowed_protocols = va_arg(param, long); 2568 break; 2569 2570 case CURLOPT_REDIR_PROTOCOLS: 2571 /* set the bitmask for the protocols that libcurl is allowed to follow to, 2572 as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs 2573 to be set in both bitmasks to be allowed to get redirected to. Defaults 2574 to all protocols except FILE and SCP. */ 2575 data->set.redir_protocols = va_arg(param, long); 2576 break; 2577 2578 case CURLOPT_DEFAULT_PROTOCOL: 2579 /* Set the protocol to use when the URL doesn't include any protocol */ 2580 result = setstropt(&data->set.str[STRING_DEFAULT_PROTOCOL], 2581 va_arg(param, char *)); 2582 break; 2583 2584 case CURLOPT_MAIL_FROM: 2585 /* Set the SMTP mail originator */ 2586 result = setstropt(&data->set.str[STRING_MAIL_FROM], 2587 va_arg(param, char *)); 2588 break; 2589 2590 case CURLOPT_MAIL_AUTH: 2591 /* Set the SMTP auth originator */ 2592 result = setstropt(&data->set.str[STRING_MAIL_AUTH], 2593 va_arg(param, char *)); 2594 break; 2595 2596 case CURLOPT_MAIL_RCPT: 2597 /* Set the list of mail recipients */ 2598 data->set.mail_rcpt = va_arg(param, struct curl_slist *); 2599 break; 2600 2601 case CURLOPT_SASL_IR: 2602 /* Enable/disable SASL initial response */ 2603 data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE; 2604 break; 2605 2606 case CURLOPT_RTSP_REQUEST: 2607 { 2608 /* 2609 * Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...) 2610 * Would this be better if the RTSPREQ_* were just moved into here? 2611 */ 2612 long curl_rtspreq = va_arg(param, long); 2613 Curl_RtspReq rtspreq = RTSPREQ_NONE; 2614 switch(curl_rtspreq) { 2615 case CURL_RTSPREQ_OPTIONS: 2616 rtspreq = RTSPREQ_OPTIONS; 2617 break; 2618 2619 case CURL_RTSPREQ_DESCRIBE: 2620 rtspreq = RTSPREQ_DESCRIBE; 2621 break; 2622 2623 case CURL_RTSPREQ_ANNOUNCE: 2624 rtspreq = RTSPREQ_ANNOUNCE; 2625 break; 2626 2627 case CURL_RTSPREQ_SETUP: 2628 rtspreq = RTSPREQ_SETUP; 2629 break; 2630 2631 case CURL_RTSPREQ_PLAY: 2632 rtspreq = RTSPREQ_PLAY; 2633 break; 2634 2635 case CURL_RTSPREQ_PAUSE: 2636 rtspreq = RTSPREQ_PAUSE; 2637 break; 2638 2639 case CURL_RTSPREQ_TEARDOWN: 2640 rtspreq = RTSPREQ_TEARDOWN; 2641 break; 2642 2643 case CURL_RTSPREQ_GET_PARAMETER: 2644 rtspreq = RTSPREQ_GET_PARAMETER; 2645 break; 2646 2647 case CURL_RTSPREQ_SET_PARAMETER: 2648 rtspreq = RTSPREQ_SET_PARAMETER; 2649 break; 2650 2651 case CURL_RTSPREQ_RECORD: 2652 rtspreq = RTSPREQ_RECORD; 2653 break; 2654 2655 case CURL_RTSPREQ_RECEIVE: 2656 rtspreq = RTSPREQ_RECEIVE; 2657 break; 2658 default: 2659 rtspreq = RTSPREQ_NONE; 2660 } 2661 2662 data->set.rtspreq = rtspreq; 2663 break; 2664 } 2665 2666 2667 case CURLOPT_RTSP_SESSION_ID: 2668 /* 2669 * Set the RTSP Session ID manually. Useful if the application is 2670 * resuming a previously established RTSP session 2671 */ 2672 result = setstropt(&data->set.str[STRING_RTSP_SESSION_ID], 2673 va_arg(param, char *)); 2674 break; 2675 2676 case CURLOPT_RTSP_STREAM_URI: 2677 /* 2678 * Set the Stream URI for the RTSP request. Unless the request is 2679 * for generic server options, the application will need to set this. 2680 */ 2681 result = setstropt(&data->set.str[STRING_RTSP_STREAM_URI], 2682 va_arg(param, char *)); 2683 break; 2684 2685 case CURLOPT_RTSP_TRANSPORT: 2686 /* 2687 * The content of the Transport: header for the RTSP request 2688 */ 2689 result = setstropt(&data->set.str[STRING_RTSP_TRANSPORT], 2690 va_arg(param, char *)); 2691 break; 2692 2693 case CURLOPT_RTSP_CLIENT_CSEQ: 2694 /* 2695 * Set the CSEQ number to issue for the next RTSP request. Useful if the 2696 * application is resuming a previously broken connection. The CSEQ 2697 * will increment from this new number henceforth. 2698 */ 2699 data->state.rtsp_next_client_CSeq = va_arg(param, long); 2700 break; 2701 2702 case CURLOPT_RTSP_SERVER_CSEQ: 2703 /* Same as the above, but for server-initiated requests */ 2704 data->state.rtsp_next_client_CSeq = va_arg(param, long); 2705 break; 2706 2707 case CURLOPT_INTERLEAVEDATA: 2708 data->set.rtp_out = va_arg(param, void *); 2709 break; 2710 case CURLOPT_INTERLEAVEFUNCTION: 2711 /* Set the user defined RTP write function */ 2712 data->set.fwrite_rtp = va_arg(param, curl_write_callback); 2713 break; 2714 2715 case CURLOPT_WILDCARDMATCH: 2716 data->set.wildcardmatch = (0 != va_arg(param, long)) ? TRUE : FALSE; 2717 break; 2718 case CURLOPT_CHUNK_BGN_FUNCTION: 2719 data->set.chunk_bgn = va_arg(param, curl_chunk_bgn_callback); 2720 break; 2721 case CURLOPT_CHUNK_END_FUNCTION: 2722 data->set.chunk_end = va_arg(param, curl_chunk_end_callback); 2723 break; 2724 case CURLOPT_FNMATCH_FUNCTION: 2725 data->set.fnmatch = va_arg(param, curl_fnmatch_callback); 2726 break; 2727 case CURLOPT_CHUNK_DATA: 2728 data->wildcard.customptr = va_arg(param, void *); 2729 break; 2730 case CURLOPT_FNMATCH_DATA: 2731 data->set.fnmatch_data = va_arg(param, void *); 2732 break; 2733 #ifdef USE_TLS_SRP 2734 case CURLOPT_TLSAUTH_USERNAME: 2735 result = setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_ORIG], 2736 va_arg(param, char *)); 2737 if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype) 2738 data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */ 2739 break; 2740 case CURLOPT_PROXY_TLSAUTH_USERNAME: 2741 result = setstropt(&data->set.str[STRING_TLSAUTH_USERNAME_PROXY], 2742 va_arg(param, char *)); 2743 if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] && 2744 !data->set.proxy_ssl.authtype) 2745 data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */ 2746 break; 2747 case CURLOPT_TLSAUTH_PASSWORD: 2748 result = setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_ORIG], 2749 va_arg(param, char *)); 2750 if(data->set.str[STRING_TLSAUTH_USERNAME_ORIG] && !data->set.ssl.authtype) 2751 data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */ 2752 break; 2753 case CURLOPT_PROXY_TLSAUTH_PASSWORD: 2754 result = setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD_PROXY], 2755 va_arg(param, char *)); 2756 if(data->set.str[STRING_TLSAUTH_USERNAME_PROXY] && 2757 !data->set.proxy_ssl.authtype) 2758 data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */ 2759 break; 2760 case CURLOPT_TLSAUTH_TYPE: 2761 if(strncasecompare((char *)va_arg(param, char *), "SRP", strlen("SRP"))) 2762 data->set.ssl.authtype = CURL_TLSAUTH_SRP; 2763 else 2764 data->set.ssl.authtype = CURL_TLSAUTH_NONE; 2765 break; 2766 case CURLOPT_PROXY_TLSAUTH_TYPE: 2767 if(strncasecompare((char *)va_arg(param, char *), "SRP", strlen("SRP"))) 2768 data->set.proxy_ssl.authtype = CURL_TLSAUTH_SRP; 2769 else 2770 data->set.proxy_ssl.authtype = CURL_TLSAUTH_NONE; 2771 break; 2772 #endif 2773 case CURLOPT_DNS_SERVERS: 2774 result = Curl_set_dns_servers(data, va_arg(param, char *)); 2775 break; 2776 case CURLOPT_DNS_INTERFACE: 2777 result = Curl_set_dns_interface(data, va_arg(param, char *)); 2778 break; 2779 case CURLOPT_DNS_LOCAL_IP4: 2780 result = Curl_set_dns_local_ip4(data, va_arg(param, char *)); 2781 break; 2782 case CURLOPT_DNS_LOCAL_IP6: 2783 result = Curl_set_dns_local_ip6(data, va_arg(param, char *)); 2784 break; 2785 2786 case CURLOPT_TCP_KEEPALIVE: 2787 data->set.tcp_keepalive = (0 != va_arg(param, long)) ? TRUE : FALSE; 2788 break; 2789 case CURLOPT_TCP_KEEPIDLE: 2790 data->set.tcp_keepidle = va_arg(param, long); 2791 break; 2792 case CURLOPT_TCP_KEEPINTVL: 2793 data->set.tcp_keepintvl = va_arg(param, long); 2794 break; 2795 case CURLOPT_TCP_FASTOPEN: 2796 #if defined(CONNECT_DATA_IDEMPOTENT) || defined(MSG_FASTOPEN) 2797 data->set.tcp_fastopen = (0 != va_arg(param, long))?TRUE:FALSE; 2798 #else 2799 result = CURLE_NOT_BUILT_IN; 2800 #endif 2801 break; 2802 case CURLOPT_SSL_ENABLE_NPN: 2803 data->set.ssl_enable_npn = (0 != va_arg(param, long)) ? TRUE : FALSE; 2804 break; 2805 case CURLOPT_SSL_ENABLE_ALPN: 2806 data->set.ssl_enable_alpn = (0 != va_arg(param, long)) ? TRUE : FALSE; 2807 break; 2808 2809 #ifdef USE_UNIX_SOCKETS 2810 case CURLOPT_UNIX_SOCKET_PATH: 2811 result = setstropt(&data->set.str[STRING_UNIX_SOCKET_PATH], 2812 va_arg(param, char *)); 2813 break; 2814 #endif 2815 2816 case CURLOPT_PATH_AS_IS: 2817 data->set.path_as_is = (0 != va_arg(param, long)) ? TRUE : FALSE; 2818 break; 2819 case CURLOPT_PIPEWAIT: 2820 data->set.pipewait = (0 != va_arg(param, long)) ? TRUE : FALSE; 2821 break; 2822 case CURLOPT_STREAM_WEIGHT: 2823 #ifndef USE_NGHTTP2 2824 return CURLE_NOT_BUILT_IN; 2825 #else 2826 arg = va_arg(param, long); 2827 if((arg>=1) && (arg <= 256)) 2828 data->set.stream_weight = (int)arg; 2829 break; 2830 #endif 2831 case CURLOPT_STREAM_DEPENDS: 2832 case CURLOPT_STREAM_DEPENDS_E: 2833 { 2834 #ifndef USE_NGHTTP2 2835 return CURLE_NOT_BUILT_IN; 2836 #else 2837 struct Curl_easy *dep = va_arg(param, struct Curl_easy *); 2838 if(dep && GOOD_EASY_HANDLE(dep)) { 2839 data->set.stream_depends_on = dep; 2840 data->set.stream_depends_e = (option == CURLOPT_STREAM_DEPENDS_E); 2841 } 2842 break; 2843 #endif 2844 } 2845 case CURLOPT_CONNECT_TO: 2846 data->set.connect_to = va_arg(param, struct curl_slist *); 2847 break; 2848 default: 2849 /* unknown tag and its companion, just ignore: */ 2850 result = CURLE_UNKNOWN_OPTION; 2851 break; 2852 } 2853 2854 return result; 2855 } 2856 2857 #ifdef USE_RECV_BEFORE_SEND_WORKAROUND 2858 static void conn_reset_postponed_data(struct connectdata *conn, int num) 2859 { 2860 struct postponed_data * const psnd = &(conn->postponed[num]); 2861 if(psnd->buffer) { 2862 DEBUGASSERT(psnd->allocated_size > 0); 2863 DEBUGASSERT(psnd->recv_size <= psnd->allocated_size); 2864 DEBUGASSERT(psnd->recv_size ? 2865 (psnd->recv_processed < psnd->recv_size) : 2866 (psnd->recv_processed == 0)); 2867 DEBUGASSERT(psnd->bindsock != CURL_SOCKET_BAD); 2868 free(psnd->buffer); 2869 psnd->buffer = NULL; 2870 psnd->allocated_size = 0; 2871 psnd->recv_size = 0; 2872 psnd->recv_processed = 0; 2873 #ifdef DEBUGBUILD 2874 psnd->bindsock = CURL_SOCKET_BAD; /* used only for DEBUGASSERT */ 2875 #endif /* DEBUGBUILD */ 2876 } 2877 else { 2878 DEBUGASSERT (psnd->allocated_size == 0); 2879 DEBUGASSERT (psnd->recv_size == 0); 2880 DEBUGASSERT (psnd->recv_processed == 0); 2881 DEBUGASSERT (psnd->bindsock == CURL_SOCKET_BAD); 2882 } 2883 } 2884 2885 static void conn_reset_all_postponed_data(struct connectdata *conn) 2886 { 2887 conn_reset_postponed_data(conn, 0); 2888 conn_reset_postponed_data(conn, 1); 2889 } 2890 #else /* ! USE_RECV_BEFORE_SEND_WORKAROUND */ 2891 /* Use "do-nothing" macros instead of functions when workaround not used */ 2892 #define conn_reset_postponed_data(c,n) do {} WHILE_FALSE 2893 #define conn_reset_all_postponed_data(c) do {} WHILE_FALSE 2894 #endif /* ! USE_RECV_BEFORE_SEND_WORKAROUND */ 2895 2896 static void conn_free(struct connectdata *conn) 2897 { 2898 if(!conn) 2899 return; 2900 2901 /* possible left-overs from the async name resolvers */ 2902 Curl_resolver_cancel(conn); 2903 2904 /* close the SSL stuff before we close any sockets since they will/may 2905 write to the sockets */ 2906 Curl_ssl_close(conn, FIRSTSOCKET); 2907 Curl_ssl_close(conn, SECONDARYSOCKET); 2908 2909 /* close possibly still open sockets */ 2910 if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET]) 2911 Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]); 2912 if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET]) 2913 Curl_closesocket(conn, conn->sock[FIRSTSOCKET]); 2914 if(CURL_SOCKET_BAD != conn->tempsock[0]) 2915 Curl_closesocket(conn, conn->tempsock[0]); 2916 if(CURL_SOCKET_BAD != conn->tempsock[1]) 2917 Curl_closesocket(conn, conn->tempsock[1]); 2918 2919 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ 2920 defined(NTLM_WB_ENABLED) 2921 Curl_ntlm_wb_cleanup(conn); 2922 #endif 2923 2924 Curl_safefree(conn->user); 2925 Curl_safefree(conn->passwd); 2926 Curl_safefree(conn->oauth_bearer); 2927 Curl_safefree(conn->options); 2928 Curl_safefree(conn->http_proxy.user); 2929 Curl_safefree(conn->socks_proxy.user); 2930 Curl_safefree(conn->http_proxy.passwd); 2931 Curl_safefree(conn->socks_proxy.passwd); 2932 Curl_safefree(conn->allocptr.proxyuserpwd); 2933 Curl_safefree(conn->allocptr.uagent); 2934 Curl_safefree(conn->allocptr.userpwd); 2935 Curl_safefree(conn->allocptr.accept_encoding); 2936 Curl_safefree(conn->allocptr.te); 2937 Curl_safefree(conn->allocptr.rangeline); 2938 Curl_safefree(conn->allocptr.ref); 2939 Curl_safefree(conn->allocptr.host); 2940 Curl_safefree(conn->allocptr.cookiehost); 2941 Curl_safefree(conn->allocptr.rtsp_transport); 2942 Curl_safefree(conn->trailer); 2943 Curl_safefree(conn->host.rawalloc); /* host name buffer */ 2944 Curl_safefree(conn->conn_to_host.rawalloc); /* host name buffer */ 2945 Curl_safefree(conn->secondaryhostname); 2946 Curl_safefree(conn->http_proxy.host.rawalloc); /* http proxy name buffer */ 2947 Curl_safefree(conn->socks_proxy.host.rawalloc); /* socks proxy name buffer */ 2948 Curl_safefree(conn->master_buffer); 2949 2950 conn_reset_all_postponed_data(conn); 2951 2952 Curl_llist_destroy(conn->send_pipe, NULL); 2953 Curl_llist_destroy(conn->recv_pipe, NULL); 2954 2955 conn->send_pipe = NULL; 2956 conn->recv_pipe = NULL; 2957 2958 Curl_safefree(conn->localdev); 2959 Curl_free_primary_ssl_config(&conn->ssl_config); 2960 Curl_free_primary_ssl_config(&conn->proxy_ssl_config); 2961 2962 #ifdef USE_UNIX_SOCKETS 2963 Curl_safefree(conn->unix_domain_socket); 2964 #endif 2965 2966 free(conn); /* free all the connection oriented data */ 2967 } 2968 2969 /* 2970 * Disconnects the given connection. Note the connection may not be the 2971 * primary connection, like when freeing room in the connection cache or 2972 * killing of a dead old connection. 2973 * 2974 * This function MUST NOT reset state in the Curl_easy struct if that 2975 * isn't strictly bound to the life-time of *this* particular connection. 2976 * 2977 */ 2978 2979 CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection) 2980 { 2981 struct Curl_easy *data; 2982 if(!conn) 2983 return CURLE_OK; /* this is closed and fine already */ 2984 data = conn->data; 2985 2986 if(!data) { 2987 DEBUGF(fprintf(stderr, "DISCONNECT without easy handle, ignoring\n")); 2988 return CURLE_OK; 2989 } 2990 2991 /* 2992 * If this connection isn't marked to force-close, leave it open if there 2993 * are other users of it 2994 */ 2995 if(!conn->bits.close && 2996 (conn->send_pipe->size + conn->recv_pipe->size)) { 2997 DEBUGF(infof(data, "Curl_disconnect, usecounter: %d\n", 2998 conn->send_pipe->size + conn->recv_pipe->size)); 2999 return CURLE_OK; 3000 } 3001 3002 if(conn->dns_entry != NULL) { 3003 Curl_resolv_unlock(data, conn->dns_entry); 3004 conn->dns_entry = NULL; 3005 } 3006 3007 Curl_hostcache_prune(data); /* kill old DNS cache entries */ 3008 3009 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) 3010 /* Cleanup NTLM connection-related data */ 3011 Curl_http_ntlm_cleanup(conn); 3012 #endif 3013 3014 if(conn->handler->disconnect) 3015 /* This is set if protocol-specific cleanups should be made */ 3016 conn->handler->disconnect(conn, dead_connection); 3017 3018 /* unlink ourselves! */ 3019 infof(data, "Closing connection %ld\n", conn->connection_id); 3020 Curl_conncache_remove_conn(data->state.conn_cache, conn); 3021 3022 free_fixed_hostname(&conn->host); 3023 free_fixed_hostname(&conn->conn_to_host); 3024 free_fixed_hostname(&conn->proxy); 3025 free_fixed_hostname(&conn->http_proxy.host); 3026 free_fixed_hostname(&conn->socks_proxy.host); 3027 3028 Curl_ssl_close(conn, FIRSTSOCKET); 3029 3030 /* Indicate to all handles on the pipe that we're dead */ 3031 if(Curl_pipeline_wanted(data->multi, CURLPIPE_ANY)) { 3032 signalPipeClose(conn->send_pipe, TRUE); 3033 signalPipeClose(conn->recv_pipe, TRUE); 3034 } 3035 3036 conn_free(conn); 3037 3038 return CURLE_OK; 3039 } 3040 3041 /* 3042 * This function should return TRUE if the socket is to be assumed to 3043 * be dead. Most commonly this happens when the server has closed the 3044 * connection due to inactivity. 3045 */ 3046 static bool SocketIsDead(curl_socket_t sock) 3047 { 3048 int sval; 3049 bool ret_val = TRUE; 3050 3051 sval = SOCKET_READABLE(sock, 0); 3052 if(sval == 0) 3053 /* timeout */ 3054 ret_val = FALSE; 3055 3056 return ret_val; 3057 } 3058 3059 /* 3060 * IsPipeliningPossible() returns TRUE if the options set would allow 3061 * pipelining/multiplexing and the connection is using a HTTP protocol. 3062 */ 3063 static bool IsPipeliningPossible(const struct Curl_easy *handle, 3064 const struct connectdata *conn) 3065 { 3066 /* If a HTTP protocol and pipelining is enabled */ 3067 if((conn->handler->protocol & PROTO_FAMILY_HTTP) && 3068 (!conn->bits.protoconnstart || !conn->bits.close)) { 3069 3070 if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) && 3071 (handle->set.httpversion != CURL_HTTP_VERSION_1_0) && 3072 (handle->set.httpreq == HTTPREQ_GET || 3073 handle->set.httpreq == HTTPREQ_HEAD)) 3074 /* didn't ask for HTTP/1.0 and a GET or HEAD */ 3075 return TRUE; 3076 3077 if(Curl_pipeline_wanted(handle->multi, CURLPIPE_MULTIPLEX) && 3078 (handle->set.httpversion >= CURL_HTTP_VERSION_2)) 3079 /* allows HTTP/2 */ 3080 return TRUE; 3081 } 3082 return FALSE; 3083 } 3084 3085 int Curl_removeHandleFromPipeline(struct Curl_easy *handle, 3086 struct curl_llist *pipeline) 3087 { 3088 if(pipeline) { 3089 struct curl_llist_element *curr; 3090 3091 curr = pipeline->head; 3092 while(curr) { 3093 if(curr->ptr == handle) { 3094 Curl_llist_remove(pipeline, curr, NULL); 3095 return 1; /* we removed a handle */ 3096 } 3097 curr = curr->next; 3098 } 3099 } 3100 3101 return 0; 3102 } 3103 3104 #if 0 /* this code is saved here as it is useful for debugging purposes */ 3105 static void Curl_printPipeline(struct curl_llist *pipeline) 3106 { 3107 struct curl_llist_element *curr; 3108 3109 curr = pipeline->head; 3110 while(curr) { 3111 struct Curl_easy *data = (struct Curl_easy *) curr->ptr; 3112 infof(data, "Handle in pipeline: %s\n", data->state.path); 3113 curr = curr->next; 3114 } 3115 } 3116 #endif 3117 3118 static struct Curl_easy* gethandleathead(struct curl_llist *pipeline) 3119 { 3120 struct curl_llist_element *curr = pipeline->head; 3121 if(curr) { 3122 return (struct Curl_easy *) curr->ptr; 3123 } 3124 3125 return NULL; 3126 } 3127 3128 /* remove the specified connection from all (possible) pipelines and related 3129 queues */ 3130 void Curl_getoff_all_pipelines(struct Curl_easy *data, 3131 struct connectdata *conn) 3132 { 3133 bool recv_head = (conn->readchannel_inuse && 3134 Curl_recvpipe_head(data, conn)); 3135 bool send_head = (conn->writechannel_inuse && 3136 Curl_sendpipe_head(data, conn)); 3137 3138 if(Curl_removeHandleFromPipeline(data, conn->recv_pipe) && recv_head) 3139 Curl_pipeline_leave_read(conn); 3140 if(Curl_removeHandleFromPipeline(data, conn->send_pipe) && send_head) 3141 Curl_pipeline_leave_write(conn); 3142 } 3143 3144 static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke) 3145 { 3146 struct curl_llist_element *curr; 3147 3148 if(!pipeline) 3149 return; 3150 3151 curr = pipeline->head; 3152 while(curr) { 3153 struct curl_llist_element *next = curr->next; 3154 struct Curl_easy *data = (struct Curl_easy *) curr->ptr; 3155 3156 #ifdef DEBUGBUILD /* debug-only code */ 3157 if(data->magic != CURLEASY_MAGIC_NUMBER) { 3158 /* MAJOR BADNESS */ 3159 infof(data, "signalPipeClose() found BAAD easy handle\n"); 3160 } 3161 #endif 3162 3163 if(pipe_broke) 3164 data->state.pipe_broke = TRUE; 3165 Curl_multi_handlePipeBreak(data); 3166 Curl_llist_remove(pipeline, curr, NULL); 3167 curr = next; 3168 } 3169 } 3170 3171 /* 3172 * This function finds the connection in the connection 3173 * cache that has been unused for the longest time. 3174 * 3175 * Returns the pointer to the oldest idle connection, or NULL if none was 3176 * found. 3177 */ 3178 struct connectdata * 3179 Curl_oldest_idle_connection(struct Curl_easy *data) 3180 { 3181 struct conncache *bc = data->state.conn_cache; 3182 struct curl_hash_iterator iter; 3183 struct curl_llist_element *curr; 3184 struct curl_hash_element *he; 3185 time_t highscore=-1; 3186 time_t score; 3187 struct timeval now; 3188 struct connectdata *conn_candidate = NULL; 3189 struct connectbundle *bundle; 3190 3191 now = Curl_tvnow(); 3192 3193 Curl_hash_start_iterate(&bc->hash, &iter); 3194 3195 he = Curl_hash_next_element(&iter); 3196 while(he) { 3197 struct connectdata *conn; 3198 3199 bundle = he->ptr; 3200 3201 curr = bundle->conn_list->head; 3202 while(curr) { 3203 conn = curr->ptr; 3204 3205 if(!conn->inuse) { 3206 /* Set higher score for the age passed since the connection was used */ 3207 score = Curl_tvdiff(now, conn->now); 3208 3209 if(score > highscore) { 3210 highscore = score; 3211 conn_candidate = conn; 3212 } 3213 } 3214 curr = curr->next; 3215 } 3216 3217 he = Curl_hash_next_element(&iter); 3218 } 3219 3220 return conn_candidate; 3221 } 3222 3223 static bool 3224 proxy_info_matches(const struct proxy_info* data, 3225 const struct proxy_info* needle) 3226 { 3227 if((data->proxytype == needle->proxytype) && 3228 (data->port == needle->port) && 3229 Curl_safe_strcasecompare(data->host.name, needle->host.name) && 3230 Curl_safe_strcasecompare(data->user, needle->user) && 3231 Curl_safe_strcasecompare(data->passwd, needle->passwd)) 3232 return TRUE; 3233 3234 return FALSE; 3235 } 3236 3237 3238 /* 3239 * This function finds the connection in the connection 3240 * bundle that has been unused for the longest time. 3241 * 3242 * Returns the pointer to the oldest idle connection, or NULL if none was 3243 * found. 3244 */ 3245 static struct connectdata * 3246 find_oldest_idle_connection_in_bundle(struct Curl_easy *data, 3247 struct connectbundle *bundle) 3248 { 3249 struct curl_llist_element *curr; 3250 time_t highscore=-1; 3251 time_t score; 3252 struct timeval now; 3253 struct connectdata *conn_candidate = NULL; 3254 struct connectdata *conn; 3255 3256 (void)data; 3257 3258 now = Curl_tvnow(); 3259 3260 curr = bundle->conn_list->head; 3261 while(curr) { 3262 conn = curr->ptr; 3263 3264 if(!conn->inuse) { 3265 /* Set higher score for the age passed since the connection was used */ 3266 score = Curl_tvdiff(now, conn->now); 3267 3268 if(score > highscore) { 3269 highscore = score; 3270 conn_candidate = conn; 3271 } 3272 } 3273 curr = curr->next; 3274 } 3275 3276 return conn_candidate; 3277 } 3278 3279 /* 3280 * This function checks if given connection is dead and disconnects if so. 3281 * (That also removes it from the connection cache.) 3282 * 3283 * Returns TRUE if the connection actually was dead and disconnected. 3284 */ 3285 static bool disconnect_if_dead(struct connectdata *conn, 3286 struct Curl_easy *data) 3287 { 3288 size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size; 3289 if(!pipeLen && !conn->inuse) { 3290 /* The check for a dead socket makes sense only if there are no 3291 handles in pipeline and the connection isn't already marked in 3292 use */ 3293 bool dead; 3294 if(conn->handler->protocol & CURLPROTO_RTSP) 3295 /* RTSP is a special case due to RTP interleaving */ 3296 dead = Curl_rtsp_connisdead(conn); 3297 else 3298 dead = SocketIsDead(conn->sock[FIRSTSOCKET]); 3299 3300 if(dead) { 3301 conn->data = data; 3302 infof(data, "Connection %ld seems to be dead!\n", conn->connection_id); 3303 3304 /* disconnect resources */ 3305 Curl_disconnect(conn, /* dead_connection */TRUE); 3306 return TRUE; 3307 } 3308 } 3309 return FALSE; 3310 } 3311 3312 /* 3313 * Wrapper to use disconnect_if_dead() function in Curl_conncache_foreach() 3314 * 3315 * Returns always 0. 3316 */ 3317 static int call_disconnect_if_dead(struct connectdata *conn, 3318 void *param) 3319 { 3320 struct Curl_easy* data = (struct Curl_easy*)param; 3321 disconnect_if_dead(conn, data); 3322 return 0; /* continue iteration */ 3323 } 3324 3325 /* 3326 * This function scans the connection cache for half-open/dead connections, 3327 * closes and removes them. 3328 * The cleanup is done at most once per second. 3329 */ 3330 static void prune_dead_connections(struct Curl_easy *data) 3331 { 3332 struct timeval now = Curl_tvnow(); 3333 time_t elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup); 3334 3335 if(elapsed >= 1000L) { 3336 Curl_conncache_foreach(data->state.conn_cache, data, 3337 call_disconnect_if_dead); 3338 data->state.conn_cache->last_cleanup = now; 3339 } 3340 } 3341 3342 3343 static size_t max_pipeline_length(struct Curl_multi *multi) 3344 { 3345 return multi ? multi->max_pipeline_length : 0; 3346 } 3347 3348 3349 /* 3350 * Given one filled in connection struct (named needle), this function should 3351 * detect if there already is one that has all the significant details 3352 * exactly the same and thus should be used instead. 3353 * 3354 * If there is a match, this function returns TRUE - and has marked the 3355 * connection as 'in-use'. It must later be called with ConnectionDone() to 3356 * return back to 'idle' (unused) state. 3357 * 3358 * The force_reuse flag is set if the connection must be used, even if 3359 * the pipelining strategy wants to open a new connection instead of reusing. 3360 */ 3361 static bool 3362 ConnectionExists(struct Curl_easy *data, 3363 struct connectdata *needle, 3364 struct connectdata **usethis, 3365 bool *force_reuse, 3366 bool *waitpipe) 3367 { 3368 struct connectdata *check; 3369 struct connectdata *chosen = 0; 3370 bool foundPendingCandidate = FALSE; 3371 bool canPipeline = IsPipeliningPossible(data, needle); 3372 struct connectbundle *bundle; 3373 3374 #ifdef USE_NTLM 3375 bool wantNTLMhttp = ((data->state.authhost.want & 3376 (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && 3377 (needle->handler->protocol & PROTO_FAMILY_HTTP)); 3378 bool wantProxyNTLMhttp = (needle->bits.proxy_user_passwd && 3379 ((data->state.authproxy.want & 3380 (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && 3381 (needle->handler->protocol & PROTO_FAMILY_HTTP))); 3382 #endif 3383 3384 *force_reuse = FALSE; 3385 *waitpipe = FALSE; 3386 3387 /* We can't pipe if the site is blacklisted */ 3388 if(canPipeline && Curl_pipeline_site_blacklisted(data, needle)) { 3389 canPipeline = FALSE; 3390 } 3391 3392 /* Look up the bundle with all the connections to this 3393 particular host */ 3394 bundle = Curl_conncache_find_bundle(needle, data->state.conn_cache); 3395 if(bundle) { 3396 /* Max pipe length is zero (unlimited) for multiplexed connections */ 3397 size_t max_pipe_len = (bundle->multiuse != BUNDLE_MULTIPLEX)? 3398 max_pipeline_length(data->multi):0; 3399 size_t best_pipe_len = max_pipe_len; 3400 struct curl_llist_element *curr; 3401 const char *hostname; 3402 3403 if(needle->bits.conn_to_host) 3404 hostname = needle->conn_to_host.name; 3405 else 3406 hostname = needle->host.name; 3407 3408 infof(data, "Found bundle for host %s: %p [%s]\n", 3409 hostname, (void *)bundle, 3410 (bundle->multiuse== BUNDLE_PIPELINING? 3411 "can pipeline": 3412 (bundle->multiuse== BUNDLE_MULTIPLEX? 3413 "can multiplex":"serially"))); 3414 3415 /* We can't pipe if we don't know anything about the server */ 3416 if(canPipeline) { 3417 if(bundle->multiuse <= BUNDLE_UNKNOWN) { 3418 if((bundle->multiuse == BUNDLE_UNKNOWN) && data->set.pipewait) { 3419 infof(data, "Server doesn't support multi-use yet, wait\n"); 3420 *waitpipe = TRUE; 3421 return FALSE; /* no re-use */ 3422 } 3423 3424 infof(data, "Server doesn't support multi-use (yet)\n"); 3425 canPipeline = FALSE; 3426 } 3427 if((bundle->multiuse == BUNDLE_PIPELINING) && 3428 !Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1)) { 3429 /* not asked for, switch off */ 3430 infof(data, "Could pipeline, but not asked to!\n"); 3431 canPipeline = FALSE; 3432 } 3433 else if((bundle->multiuse == BUNDLE_MULTIPLEX) && 3434 !Curl_pipeline_wanted(data->multi, CURLPIPE_MULTIPLEX)) { 3435 infof(data, "Could multiplex, but not asked to!\n"); 3436 canPipeline = FALSE; 3437 } 3438 } 3439 3440 curr = bundle->conn_list->head; 3441 while(curr) { 3442 bool match = FALSE; 3443 size_t pipeLen; 3444 3445 /* 3446 * Note that if we use a HTTP proxy in normal mode (no tunneling), we 3447 * check connections to that proxy and not to the actual remote server. 3448 */ 3449 check = curr->ptr; 3450 curr = curr->next; 3451 3452 if(disconnect_if_dead(check, data)) 3453 continue; 3454 3455 pipeLen = check->send_pipe->size + check->recv_pipe->size; 3456 3457 if(canPipeline) { 3458 if(check->bits.protoconnstart && check->bits.close) 3459 continue; 3460 3461 if(!check->bits.multiplex) { 3462 /* If not multiplexing, make sure the pipe has only GET requests */ 3463 struct Curl_easy* sh = gethandleathead(check->send_pipe); 3464 struct Curl_easy* rh = gethandleathead(check->recv_pipe); 3465 if(sh) { 3466 if(!IsPipeliningPossible(sh, check)) 3467 continue; 3468 } 3469 else if(rh) { 3470 if(!IsPipeliningPossible(rh, check)) 3471 continue; 3472 } 3473 } 3474 } 3475 else { 3476 if(pipeLen > 0) { 3477 /* can only happen within multi handles, and means that another easy 3478 handle is using this connection */ 3479 continue; 3480 } 3481 3482 if(Curl_resolver_asynch()) { 3483 /* ip_addr_str[0] is NUL only if the resolving of the name hasn't 3484 completed yet and until then we don't re-use this connection */ 3485 if(!check->ip_addr_str[0]) { 3486 infof(data, 3487 "Connection #%ld is still name resolving, can't reuse\n", 3488 check->connection_id); 3489 continue; 3490 } 3491 } 3492 3493 if((check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) || 3494 check->bits.close) { 3495 if(!check->bits.close) 3496 foundPendingCandidate = TRUE; 3497 /* Don't pick a connection that hasn't connected yet or that is going 3498 to get closed. */ 3499 infof(data, "Connection #%ld isn't open enough, can't reuse\n", 3500 check->connection_id); 3501 #ifdef DEBUGBUILD 3502 if(check->recv_pipe->size > 0) { 3503 infof(data, 3504 "BAD! Unconnected #%ld has a non-empty recv pipeline!\n", 3505 check->connection_id); 3506 } 3507 #endif 3508 continue; 3509 } 3510 } 3511 3512 #ifdef USE_UNIX_SOCKETS 3513 if(needle->unix_domain_socket) { 3514 if(!check->unix_domain_socket) 3515 continue; 3516 if(strcmp(needle->unix_domain_socket, check->unix_domain_socket)) 3517 continue; 3518 } 3519 else if(check->unix_domain_socket) 3520 continue; 3521 #endif 3522 3523 if((needle->handler->flags&PROTOPT_SSL) != 3524 (check->handler->flags&PROTOPT_SSL)) 3525 /* don't do mixed SSL and non-SSL connections */ 3526 if(get_protocol_family(check->handler->protocol) != 3527 needle->handler->protocol || !check->tls_upgraded) 3528 /* except protocols that have been upgraded via TLS */ 3529 continue; 3530 3531 if(needle->bits.httpproxy != check->bits.httpproxy || 3532 needle->bits.socksproxy != check->bits.socksproxy) 3533 continue; 3534 3535 if(needle->bits.socksproxy && !proxy_info_matches(&needle->socks_proxy, 3536 &check->socks_proxy)) 3537 continue; 3538 3539 if(needle->bits.conn_to_host != check->bits.conn_to_host) 3540 /* don't mix connections that use the "connect to host" feature and 3541 * connections that don't use this feature */ 3542 continue; 3543 3544 if(needle->bits.conn_to_port != check->bits.conn_to_port) 3545 /* don't mix connections that use the "connect to port" feature and 3546 * connections that don't use this feature */ 3547 continue; 3548 3549 if(needle->bits.httpproxy) { 3550 if(!proxy_info_matches(&needle->http_proxy, &check->http_proxy)) 3551 continue; 3552 3553 if(needle->bits.tunnel_proxy != check->bits.tunnel_proxy) 3554 continue; 3555 3556 if(needle->http_proxy.proxytype == CURLPROXY_HTTPS) { 3557 /* use https proxy */ 3558 if(needle->handler->flags&PROTOPT_SSL) { 3559 /* use double layer ssl */ 3560 if(!Curl_ssl_config_matches(&needle->proxy_ssl_config, 3561 &check->proxy_ssl_config)) 3562 continue; 3563 if(check->proxy_ssl[FIRSTSOCKET].state != ssl_connection_complete) 3564 continue; 3565 } 3566 else { 3567 if(!Curl_ssl_config_matches(&needle->ssl_config, 3568 &check->ssl_config)) 3569 continue; 3570 if(check->ssl[FIRSTSOCKET].state != ssl_connection_complete) 3571 continue; 3572 } 3573 } 3574 } 3575 3576 if(!canPipeline && check->inuse) 3577 /* this request can't be pipelined but the checked connection is 3578 already in use so we skip it */ 3579 continue; 3580 3581 if(needle->localdev || needle->localport) { 3582 /* If we are bound to a specific local end (IP+port), we must not 3583 re-use a random other one, although if we didn't ask for a 3584 particular one we can reuse one that was bound. 3585 3586 This comparison is a bit rough and too strict. Since the input 3587 parameters can be specified in numerous ways and still end up the 3588 same it would take a lot of processing to make it really accurate. 3589 Instead, this matching will assume that re-uses of bound connections 3590 will most likely also re-use the exact same binding parameters and 3591 missing out a few edge cases shouldn't hurt anyone very much. 3592 */ 3593 if((check->localport != needle->localport) || 3594 (check->localportrange != needle->localportrange) || 3595 (needle->localdev && 3596 (!check->localdev || strcmp(check->localdev, needle->localdev)))) 3597 continue; 3598 } 3599 3600 if(!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) { 3601 /* This protocol requires credentials per connection, 3602 so verify that we're using the same name and password as well */ 3603 if(strcmp(needle->user, check->user) || 3604 strcmp(needle->passwd, check->passwd)) { 3605 /* one of them was different */ 3606 continue; 3607 } 3608 } 3609 3610 if(!needle->bits.httpproxy || (needle->handler->flags&PROTOPT_SSL) || 3611 needle->bits.tunnel_proxy) { 3612 /* The requested connection does not use a HTTP proxy or it uses SSL or 3613 it is a non-SSL protocol tunneled or it is a non-SSL protocol which 3614 is allowed to be upgraded via TLS */ 3615 3616 if((strcasecompare(needle->handler->scheme, check->handler->scheme) || 3617 (get_protocol_family(check->handler->protocol) == 3618 needle->handler->protocol && check->tls_upgraded)) && 3619 (!needle->bits.conn_to_host || strcasecompare( 3620 needle->conn_to_host.name, check->conn_to_host.name)) && 3621 (!needle->bits.conn_to_port || 3622 needle->conn_to_port == check->conn_to_port) && 3623 strcasecompare(needle->host.name, check->host.name) && 3624 needle->remote_port == check->remote_port) { 3625 /* The schemes match or the the protocol family is the same and the 3626 previous connection was TLS upgraded, and the hostname and host 3627 port match */ 3628 if(needle->handler->flags & PROTOPT_SSL) { 3629 /* This is a SSL connection so verify that we're using the same 3630 SSL options as well */ 3631 if(!Curl_ssl_config_matches(&needle->ssl_config, 3632 &check->ssl_config)) { 3633 DEBUGF(infof(data, 3634 "Connection #%ld has different SSL parameters, " 3635 "can't reuse\n", 3636 check->connection_id)); 3637 continue; 3638 } 3639 else if(check->ssl[FIRSTSOCKET].state != ssl_connection_complete) { 3640 foundPendingCandidate = TRUE; 3641 DEBUGF(infof(data, 3642 "Connection #%ld has not started SSL connect, " 3643 "can't reuse\n", 3644 check->connection_id)); 3645 continue; 3646 } 3647 } 3648 match = TRUE; 3649 } 3650 } 3651 else { 3652 /* The requested connection is using the same HTTP proxy in normal 3653 mode (no tunneling) */ 3654 match = TRUE; 3655 } 3656 3657 if(match) { 3658 #if defined(USE_NTLM) 3659 /* If we are looking for an HTTP+NTLM connection, check if this is 3660 already authenticating with the right credentials. If not, keep 3661 looking so that we can reuse NTLM connections if 3662 possible. (Especially we must not reuse the same connection if 3663 partway through a handshake!) */ 3664 if(wantNTLMhttp) { 3665 if(strcmp(needle->user, check->user) || 3666 strcmp(needle->passwd, check->passwd)) 3667 continue; 3668 } 3669 else if(check->ntlm.state != NTLMSTATE_NONE) { 3670 /* Connection is using NTLM auth but we don't want NTLM */ 3671 continue; 3672 } 3673 3674 /* Same for Proxy NTLM authentication */ 3675 if(wantProxyNTLMhttp) { 3676 /* Both check->http_proxy.user and check->http_proxy.passwd can be 3677 * NULL */ 3678 if(!check->http_proxy.user || !check->http_proxy.passwd) 3679 continue; 3680 3681 if(strcmp(needle->http_proxy.user, check->http_proxy.user) || 3682 strcmp(needle->http_proxy.passwd, check->http_proxy.passwd)) 3683 continue; 3684 } 3685 else if(check->proxyntlm.state != NTLMSTATE_NONE) { 3686 /* Proxy connection is using NTLM auth but we don't want NTLM */ 3687 continue; 3688 } 3689 3690 if(wantNTLMhttp || wantProxyNTLMhttp) { 3691 /* Credentials are already checked, we can use this connection */ 3692 chosen = check; 3693 3694 if((wantNTLMhttp && 3695 (check->ntlm.state != NTLMSTATE_NONE)) || 3696 (wantProxyNTLMhttp && 3697 (check->proxyntlm.state != NTLMSTATE_NONE))) { 3698 /* We must use this connection, no other */ 3699 *force_reuse = TRUE; 3700 break; 3701 } 3702 3703 /* Continue look up for a better connection */ 3704 continue; 3705 } 3706 #endif 3707 if(canPipeline) { 3708 /* We can pipeline if we want to. Let's continue looking for 3709 the optimal connection to use, i.e the shortest pipe that is not 3710 blacklisted. */ 3711 3712 if(pipeLen == 0) { 3713 /* We have the optimal connection. Let's stop looking. */ 3714 chosen = check; 3715 break; 3716 } 3717 3718 /* We can't use the connection if the pipe is full */ 3719 if(max_pipe_len && (pipeLen >= max_pipe_len)) { 3720 infof(data, "Pipe is full, skip (%zu)\n", pipeLen); 3721 continue; 3722 } 3723 #ifdef USE_NGHTTP2 3724 /* If multiplexed, make sure we don't go over concurrency limit */ 3725 if(check->bits.multiplex) { 3726 /* Multiplexed connections can only be HTTP/2 for now */ 3727 struct http_conn *httpc = &check->proto.httpc; 3728 if(pipeLen >= httpc->settings.max_concurrent_streams) { 3729 infof(data, "MAX_CONCURRENT_STREAMS reached, skip (%zu)\n", 3730 pipeLen); 3731 continue; 3732 } 3733 } 3734 #endif 3735 /* We can't use the connection if the pipe is penalized */ 3736 if(Curl_pipeline_penalized(data, check)) { 3737 infof(data, "Penalized, skip\n"); 3738 continue; 3739 } 3740 3741 if(max_pipe_len) { 3742 if(pipeLen < best_pipe_len) { 3743 /* This connection has a shorter pipe so far. We'll pick this 3744 and continue searching */ 3745 chosen = check; 3746 best_pipe_len = pipeLen; 3747 continue; 3748 } 3749 } 3750 else { 3751 /* When not pipelining (== multiplexed), we have a match here! */ 3752 chosen = check; 3753 infof(data, "Multiplexed connection found!\n"); 3754 break; 3755 } 3756 } 3757 else { 3758 /* We have found a connection. Let's stop searching. */ 3759 chosen = check; 3760 break; 3761 } 3762 } 3763 } 3764 } 3765 3766 if(chosen) { 3767 *usethis = chosen; 3768 return TRUE; /* yes, we found one to use! */ 3769 } 3770 3771 if(foundPendingCandidate && data->set.pipewait) { 3772 infof(data, 3773 "Found pending candidate for reuse and CURLOPT_PIPEWAIT is set\n"); 3774 *waitpipe = TRUE; 3775 } 3776 3777 return FALSE; /* no matching connecting exists */ 3778 } 3779 3780 /* after a TCP connection to the proxy has been verified, this function does 3781 the next magic step. 3782 3783 Note: this function's sub-functions call failf() 3784 3785 */ 3786 CURLcode Curl_connected_proxy(struct connectdata *conn, int sockindex) 3787 { 3788 CURLcode result = CURLE_OK; 3789 3790 if(conn->bits.socksproxy) { 3791 #ifndef CURL_DISABLE_PROXY 3792 const char * const host = conn->bits.conn_to_host ? 3793 conn->conn_to_host.name : 3794 conn->bits.httpproxy ? 3795 conn->http_proxy.host.name : 3796 sockindex == SECONDARYSOCKET ? 3797 conn->secondaryhostname : conn->host.name; 3798 const int port = conn->bits.conn_to_port ? conn->conn_to_port : 3799 conn->bits.httpproxy ? 3800 (int)conn->http_proxy.port : 3801 sockindex == SECONDARYSOCKET ? 3802 conn->secondary_port : conn->remote_port; 3803 conn->bits.socksproxy_connecting = TRUE; 3804 switch(conn->socks_proxy.proxytype) { 3805 case CURLPROXY_SOCKS5: 3806 case CURLPROXY_SOCKS5_HOSTNAME: 3807 result = Curl_SOCKS5(conn->socks_proxy.user, conn->socks_proxy.passwd, 3808 host, port, sockindex, conn); 3809 break; 3810 3811 case CURLPROXY_SOCKS4: 3812 case CURLPROXY_SOCKS4A: 3813 result = Curl_SOCKS4(conn->socks_proxy.user, host, port, sockindex, 3814 conn); 3815 break; 3816 3817 default: 3818 failf(conn->data, "unknown proxytype option given"); 3819 result = CURLE_COULDNT_CONNECT; 3820 } /* switch proxytype */ 3821 conn->bits.socksproxy_connecting = FALSE; 3822 #else 3823 (void)sockindex; 3824 #endif /* CURL_DISABLE_PROXY */ 3825 } 3826 3827 return result; 3828 } 3829 3830 /* 3831 * verboseconnect() displays verbose information after a connect 3832 */ 3833 #ifndef CURL_DISABLE_VERBOSE_STRINGS 3834 void Curl_verboseconnect(struct connectdata *conn) 3835 { 3836 if(conn->data->set.verbose) 3837 infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n", 3838 conn->bits.socksproxy ? conn->socks_proxy.host.dispname : 3839 conn->bits.httpproxy ? conn->http_proxy.host.dispname : 3840 conn->host.dispname, 3841 conn->ip_addr_str, conn->port, conn->connection_id); 3842 } 3843 #endif 3844 3845 int Curl_protocol_getsock(struct connectdata *conn, 3846 curl_socket_t *socks, 3847 int numsocks) 3848 { 3849 if(conn->handler->proto_getsock) 3850 return conn->handler->proto_getsock(conn, socks, numsocks); 3851 return GETSOCK_BLANK; 3852 } 3853 3854 int Curl_doing_getsock(struct connectdata *conn, 3855 curl_socket_t *socks, 3856 int numsocks) 3857 { 3858 if(conn && conn->handler->doing_getsock) 3859 return conn->handler->doing_getsock(conn, socks, numsocks); 3860 return GETSOCK_BLANK; 3861 } 3862 3863 /* 3864 * We are doing protocol-specific connecting and this is being called over and 3865 * over from the multi interface until the connection phase is done on 3866 * protocol layer. 3867 */ 3868 3869 CURLcode Curl_protocol_connecting(struct connectdata *conn, 3870 bool *done) 3871 { 3872 CURLcode result=CURLE_OK; 3873 3874 if(conn && conn->handler->connecting) { 3875 *done = FALSE; 3876 result = conn->handler->connecting(conn, done); 3877 } 3878 else 3879 *done = TRUE; 3880 3881 return result; 3882 } 3883 3884 /* 3885 * We are DOING this is being called over and over from the multi interface 3886 * until the DOING phase is done on protocol layer. 3887 */ 3888 3889 CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done) 3890 { 3891 CURLcode result=CURLE_OK; 3892 3893 if(conn && conn->handler->doing) { 3894 *done = FALSE; 3895 result = conn->handler->doing(conn, done); 3896 } 3897 else 3898 *done = TRUE; 3899 3900 return result; 3901 } 3902 3903 /* 3904 * We have discovered that the TCP connection has been successful, we can now 3905 * proceed with some action. 3906 * 3907 */ 3908 CURLcode Curl_protocol_connect(struct connectdata *conn, 3909 bool *protocol_done) 3910 { 3911 CURLcode result=CURLE_OK; 3912 3913 *protocol_done = FALSE; 3914 3915 if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) { 3916 /* We already are connected, get back. This may happen when the connect 3917 worked fine in the first call, like when we connect to a local server 3918 or proxy. Note that we don't know if the protocol is actually done. 3919 3920 Unless this protocol doesn't have any protocol-connect callback, as 3921 then we know we're done. */ 3922 if(!conn->handler->connecting) 3923 *protocol_done = TRUE; 3924 3925 return CURLE_OK; 3926 } 3927 3928 if(!conn->bits.protoconnstart) { 3929 3930 result = Curl_proxy_connect(conn, FIRSTSOCKET); 3931 if(result) 3932 return result; 3933 3934 if(CONNECT_FIRSTSOCKET_PROXY_SSL()) 3935 /* wait for HTTPS proxy SSL initialization to complete */ 3936 return CURLE_OK; 3937 3938 if(conn->bits.tunnel_proxy && conn->bits.httpproxy && 3939 (conn->tunnel_state[FIRSTSOCKET] != TUNNEL_COMPLETE)) 3940 /* when using an HTTP tunnel proxy, await complete tunnel establishment 3941 before proceeding further. Return CURLE_OK so we'll be called again */ 3942 return CURLE_OK; 3943 3944 if(conn->handler->connect_it) { 3945 /* is there a protocol-specific connect() procedure? */ 3946 3947 /* Call the protocol-specific connect function */ 3948 result = conn->handler->connect_it(conn, protocol_done); 3949 } 3950 else 3951 *protocol_done = TRUE; 3952 3953 /* it has started, possibly even completed but that knowledge isn't stored 3954 in this bit! */ 3955 if(!result) 3956 conn->bits.protoconnstart = TRUE; 3957 } 3958 3959 return result; /* pass back status */ 3960 } 3961 3962 /* 3963 * Helpers for IDNA convertions. 3964 */ 3965 static bool is_ASCII_name(const char *hostname) 3966 { 3967 const unsigned char *ch = (const unsigned char *)hostname; 3968 3969 while(*ch) { 3970 if(*ch++ & 0x80) 3971 return FALSE; 3972 } 3973 return TRUE; 3974 } 3975 3976 /* 3977 * Perform any necessary IDN conversion of hostname 3978 */ 3979 static void fix_hostname(struct connectdata *conn, struct hostname *host) 3980 { 3981 size_t len; 3982 struct Curl_easy *data = conn->data; 3983 3984 #ifndef USE_LIBIDN2 3985 (void)data; 3986 (void)conn; 3987 #elif defined(CURL_DISABLE_VERBOSE_STRINGS) 3988 (void)conn; 3989 #endif 3990 3991 /* set the name we use to display the host name */ 3992 host->dispname = host->name; 3993 3994 len = strlen(host->name); 3995 if(len && (host->name[len-1] == '.')) 3996 /* strip off a single trailing dot if present, primarily for SNI but 3997 there's no use for it */ 3998 host->name[len-1]=0; 3999 4000 /* Check name for non-ASCII and convert hostname to ACE form if we can */ 4001 if(!is_ASCII_name(host->name)) { 4002 #ifdef USE_LIBIDN2 4003 if(idn2_check_version(IDN2_VERSION)) { 4004 char *ace_hostname = NULL; 4005 int rc = idn2_lookup_ul((const char *)host->name, &ace_hostname, 0); 4006 if(rc == IDN2_OK) { 4007 host->encalloc = (char *)ace_hostname; 4008 /* change the name pointer to point to the encoded hostname */ 4009 host->name = host->encalloc; 4010 } 4011 else 4012 infof(data, "Failed to convert %s to ACE; %s\n", host->name, 4013 idn2_strerror(rc)); 4014 } 4015 #elif defined(USE_WIN32_IDN) 4016 char *ace_hostname = NULL; 4017 4018 if(curl_win32_idn_to_ascii(host->name, &ace_hostname)) { 4019 host->encalloc = ace_hostname; 4020 /* change the name pointer to point to the encoded hostname */ 4021 host->name = host->encalloc; 4022 } 4023 else 4024 infof(data, "Failed to convert %s to ACE;\n", host->name); 4025 #else 4026 infof(data, "IDN support not present, can't parse Unicode domains\n"); 4027 #endif 4028 } 4029 } 4030 4031 /* 4032 * Frees data allocated by fix_hostname() 4033 */ 4034 static void free_fixed_hostname(struct hostname *host) 4035 { 4036 #if defined(USE_LIBIDN2) 4037 if(host->encalloc) { 4038 idn2_free(host->encalloc); /* must be freed with idn2_free() since this was 4039 allocated by libidn */ 4040 host->encalloc = NULL; 4041 } 4042 #elif defined(USE_WIN32_IDN) 4043 free(host->encalloc); /* must be freed withidn_free() since this was 4044 allocated by curl_win32_idn_to_ascii */ 4045 host->encalloc = NULL; 4046 #else 4047 (void)host; 4048 #endif 4049 } 4050 4051 static void llist_dtor(void *user, void *element) 4052 { 4053 (void)user; 4054 (void)element; 4055 /* Do nothing */ 4056 } 4057 4058 /* 4059 * Allocate and initialize a new connectdata object. 4060 */ 4061 static struct connectdata *allocate_conn(struct Curl_easy *data) 4062 { 4063 struct connectdata *conn = calloc(1, sizeof(struct connectdata)); 4064 if(!conn) 4065 return NULL; 4066 4067 conn->handler = &Curl_handler_dummy; /* Be sure we have a handler defined 4068 already from start to avoid NULL 4069 situations and checks */ 4070 4071 /* and we setup a few fields in case we end up actually using this struct */ 4072 4073 conn->sock[FIRSTSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */ 4074 conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */ 4075 conn->tempsock[0] = CURL_SOCKET_BAD; /* no file descriptor */ 4076 conn->tempsock[1] = CURL_SOCKET_BAD; /* no file descriptor */ 4077 conn->connection_id = -1; /* no ID */ 4078 conn->port = -1; /* unknown at this point */ 4079 conn->remote_port = -1; /* unknown */ 4080 #if defined(USE_RECV_BEFORE_SEND_WORKAROUND) && defined(DEBUGBUILD) 4081 conn->postponed[0].bindsock = CURL_SOCKET_BAD; /* no file descriptor */ 4082 conn->postponed[1].bindsock = CURL_SOCKET_BAD; /* no file descriptor */ 4083 #endif /* USE_RECV_BEFORE_SEND_WORKAROUND && DEBUGBUILD */ 4084 4085 /* Default protocol-independent behavior doesn't support persistent 4086 connections, so we set this to force-close. Protocols that support 4087 this need to set this to FALSE in their "curl_do" functions. */ 4088 connclose(conn, "Default to force-close"); 4089 4090 /* Store creation time to help future close decision making */ 4091 conn->created = Curl_tvnow(); 4092 4093 conn->data = data; /* Setup the association between this connection 4094 and the Curl_easy */ 4095 4096 conn->http_proxy.proxytype = data->set.proxytype; 4097 conn->socks_proxy.proxytype = data->set.socks_proxytype; 4098 4099 #ifdef CURL_DISABLE_PROXY 4100 4101 conn->bits.proxy = FALSE; 4102 conn->bits.httpproxy = FALSE; 4103 conn->bits.socksproxy = FALSE; 4104 conn->bits.proxy_user_passwd = FALSE; 4105 conn->bits.tunnel_proxy = FALSE; 4106 4107 #else /* CURL_DISABLE_PROXY */ 4108 4109 /* note that these two proxy bits are now just on what looks to be 4110 requested, they may be altered down the road */ 4111 conn->bits.proxy = (data->set.str[STRING_PROXY] && 4112 *data->set.str[STRING_PROXY]) ? TRUE : FALSE; 4113 conn->bits.httpproxy = (conn->bits.proxy && 4114 (conn->http_proxy.proxytype == CURLPROXY_HTTP || 4115 conn->http_proxy.proxytype == CURLPROXY_HTTP_1_0 || 4116 conn->http_proxy.proxytype == CURLPROXY_HTTPS)) ? 4117 TRUE : FALSE; 4118 conn->bits.socksproxy = (conn->bits.proxy && 4119 !conn->bits.httpproxy) ? TRUE : FALSE; 4120 4121 if(data->set.str[STRING_SOCKS_PROXY] && *data->set.str[STRING_SOCKS_PROXY]) { 4122 conn->bits.proxy = TRUE; 4123 conn->bits.socksproxy = TRUE; 4124 } 4125 4126 conn->bits.proxy_user_passwd = 4127 (data->set.str[STRING_PROXYUSERNAME]) ? TRUE : FALSE; 4128 conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy; 4129 4130 #endif /* CURL_DISABLE_PROXY */ 4131 4132 conn->bits.user_passwd = (data->set.str[STRING_USERNAME]) ? TRUE : FALSE; 4133 conn->bits.ftp_use_epsv = data->set.ftp_use_epsv; 4134 conn->bits.ftp_use_eprt = data->set.ftp_use_eprt; 4135 4136 conn->ssl_config.verifypeer = data->set.ssl.primary.verifypeer; 4137 conn->ssl_config.verifyhost = data->set.ssl.primary.verifyhost; 4138 conn->proxy_ssl_config.verifypeer = data->set.proxy_ssl.primary.verifypeer; 4139 conn->proxy_ssl_config.verifyhost = data->set.proxy_ssl.primary.verifyhost; 4140 4141 conn->ip_version = data->set.ipver; 4142 4143 #if !defined(CURL_DISABLE_HTTP) && defined(USE_NTLM) && \ 4144 defined(NTLM_WB_ENABLED) 4145 conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD; 4146 conn->ntlm_auth_hlpr_pid = 0; 4147 conn->challenge_header = NULL; 4148 conn->response_header = NULL; 4149 #endif 4150 4151 if(Curl_pipeline_wanted(data->multi, CURLPIPE_HTTP1) && 4152 !conn->master_buffer) { 4153 /* Allocate master_buffer to be used for HTTP/1 pipelining */ 4154 conn->master_buffer = calloc(BUFSIZE, sizeof (char)); 4155 if(!conn->master_buffer) 4156 goto error; 4157 } 4158 4159 /* Initialize the pipeline lists */ 4160 conn->send_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor); 4161 conn->recv_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor); 4162 if(!conn->send_pipe || !conn->recv_pipe) 4163 goto error; 4164 4165 #ifdef HAVE_GSSAPI 4166 conn->data_prot = PROT_CLEAR; 4167 #endif 4168 4169 /* Store the local bind parameters that will be used for this connection */ 4170 if(data->set.str[STRING_DEVICE]) { 4171 conn->localdev = strdup(data->set.str[STRING_DEVICE]); 4172 if(!conn->localdev) 4173 goto error; 4174 } 4175 conn->localportrange = data->set.localportrange; 4176 conn->localport = data->set.localport; 4177 4178 /* the close socket stuff needs to be copied to the connection struct as 4179 it may live on without (this specific) Curl_easy */ 4180 conn->fclosesocket = data->set.fclosesocket; 4181 conn->closesocket_client = data->set.closesocket_client; 4182 4183 return conn; 4184 error: 4185 4186 Curl_llist_destroy(conn->send_pipe, NULL); 4187 Curl_llist_destroy(conn->recv_pipe, NULL); 4188 4189 conn->send_pipe = NULL; 4190 conn->recv_pipe = NULL; 4191 4192 free(conn->master_buffer); 4193 free(conn->localdev); 4194 free(conn); 4195 return NULL; 4196 } 4197 4198 static CURLcode findprotocol(struct Curl_easy *data, 4199 struct connectdata *conn, 4200 const char *protostr) 4201 { 4202 const struct Curl_handler * const *pp; 4203 const struct Curl_handler *p; 4204 4205 /* Scan protocol handler table and match against 'protostr' to set a few 4206 variables based on the URL. Now that the handler may be changed later 4207 when the protocol specific setup function is called. */ 4208 for(pp = protocols; (p = *pp) != NULL; pp++) { 4209 if(strcasecompare(p->scheme, protostr)) { 4210 /* Protocol found in table. Check if allowed */ 4211 if(!(data->set.allowed_protocols & p->protocol)) 4212 /* nope, get out */ 4213 break; 4214 4215 /* it is allowed for "normal" request, now do an extra check if this is 4216 the result of a redirect */ 4217 if(data->state.this_is_a_follow && 4218 !(data->set.redir_protocols & p->protocol)) 4219 /* nope, get out */ 4220 break; 4221 4222 /* Perform setup complement if some. */ 4223 conn->handler = conn->given = p; 4224 4225 /* 'port' and 'remote_port' are set in setup_connection_internals() */ 4226 return CURLE_OK; 4227 } 4228 } 4229 4230 4231 /* The protocol was not found in the table, but we don't have to assign it 4232 to anything since it is already assigned to a dummy-struct in the 4233 create_conn() function when the connectdata struct is allocated. */ 4234 failf(data, "Protocol \"%s\" not supported or disabled in " LIBCURL_NAME, 4235 protostr); 4236 4237 return CURLE_UNSUPPORTED_PROTOCOL; 4238 } 4239 4240 /* 4241 * Parse URL and fill in the relevant members of the connection struct. 4242 */ 4243 static CURLcode parseurlandfillconn(struct Curl_easy *data, 4244 struct connectdata *conn, 4245 bool *prot_missing, 4246 char **userp, char **passwdp, 4247 char **optionsp) 4248 { 4249 char *at; 4250 char *fragment; 4251 char *path = data->state.path; 4252 char *query; 4253 int rc; 4254 char protobuf[16] = ""; 4255 const char *protop = ""; 4256 CURLcode result; 4257 bool rebuild_url = FALSE; 4258 4259 *prot_missing = FALSE; 4260 4261 /* We might pass the entire URL into the request so we need to make sure 4262 * there are no bad characters in there.*/ 4263 if(strpbrk(data->change.url, "\r\n")) { 4264 failf(data, "Illegal characters found in URL"); 4265 return CURLE_URL_MALFORMAT; 4266 } 4267 4268 /************************************************************* 4269 * Parse the URL. 4270 * 4271 * We need to parse the url even when using the proxy, because we will need 4272 * the hostname and port in case we are trying to SSL connect through the 4273 * proxy -- and we don't know if we will need to use SSL until we parse the 4274 * url ... 4275 ************************************************************/ 4276 if((2 == sscanf(data->change.url, "%15[^:]:%[^\n]", 4277 protobuf, path)) && 4278 strcasecompare(protobuf, "file")) { 4279 if(path[0] == '/' && path[1] == '/') { 4280 /* Allow omitted hostname (e.g. file:/<path>). This is not strictly 4281 * speaking a valid file: URL by RFC 1738, but treating file:/<path> as 4282 * file://localhost/<path> is similar to how other schemes treat missing 4283 * hostnames. See RFC 1808. */ 4284 4285 /* This cannot be done with strcpy() in a portable manner, since the 4286 memory areas overlap! */ 4287 memmove(path, path + 2, strlen(path + 2)+1); 4288 } 4289 /* 4290 * we deal with file://<host>/<path> differently since it supports no 4291 * hostname other than "localhost" and "127.0.0.1", which is unique among 4292 * the URL protocols specified in RFC 1738 4293 */ 4294 if(path[0] != '/') { 4295 /* the URL includes a host name, it must match "localhost" or 4296 "127.0.0.1" to be valid */ 4297 char *ptr; 4298 if(!checkprefix("localhost/", path) && 4299 !checkprefix("127.0.0.1/", path)) { 4300 failf(data, "Valid host name with slash missing in URL"); 4301 return CURLE_URL_MALFORMAT; 4302 } 4303 ptr = &path[9]; /* now points to the slash after the host */ 4304 4305 /* there was a host name and slash present 4306 4307 RFC1738 (section 3.1, page 5) says: 4308 4309 The rest of the locator consists of data specific to the scheme, 4310 and is known as the "url-path". It supplies the details of how the 4311 specified resource can be accessed. Note that the "/" between the 4312 host (or port) and the url-path is NOT part of the url-path. 4313 4314 As most agents use file://localhost/foo to get '/foo' although the 4315 slash preceding foo is a separator and not a slash for the path, 4316 a URL as file://localhost//foo must be valid as well, to refer to 4317 the same file with an absolute path. 4318 */ 4319 4320 if('/' == ptr[1]) 4321 /* if there was two slashes, we skip the first one as that is then 4322 used truly as a separator */ 4323 ptr++; 4324 4325 /* This cannot be made with strcpy, as the memory chunks overlap! */ 4326 memmove(path, ptr, strlen(ptr)+1); 4327 } 4328 4329 protop = "file"; /* protocol string */ 4330 } 4331 else { 4332 /* clear path */ 4333 char slashbuf[4]; 4334 path[0]=0; 4335 4336 rc = sscanf(data->change.url, 4337 "%15[^\n:]:%3[/]%[^\n/?#]%[^\n]", 4338 protobuf, slashbuf, conn->host.name, path); 4339 if(2 == rc) { 4340 failf(data, "Bad URL"); 4341 return CURLE_URL_MALFORMAT; 4342 } 4343 if(3 > rc) { 4344 4345 /* 4346 * The URL was badly formatted, let's try the browser-style _without_ 4347 * protocol specified like 'http://'. 4348 */ 4349 rc = sscanf(data->change.url, "%[^\n/?#]%[^\n]", conn->host.name, path); 4350 if(1 > rc) { 4351 /* 4352 * We couldn't even get this format. 4353 * djgpp 2.04 has a sscanf() bug where 'conn->host.name' is 4354 * assigned, but the return value is EOF! 4355 */ 4356 #if defined(__DJGPP__) && (DJGPP_MINOR == 4) 4357 if(!(rc == -1 && *conn->host.name)) 4358 #endif 4359 { 4360 failf(data, "<url> malformed"); 4361 return CURLE_URL_MALFORMAT; 4362 } 4363 } 4364 4365 /* 4366 * Since there was no protocol part specified in the URL use the 4367 * user-specified default protocol. If we weren't given a default make a 4368 * guess by matching some protocols against the host's outermost 4369 * sub-domain name. Finally if there was no match use HTTP. 4370 */ 4371 4372 protop = data->set.str[STRING_DEFAULT_PROTOCOL]; 4373 if(!protop) { 4374 /* Note: if you add a new protocol, please update the list in 4375 * lib/version.c too! */ 4376 if(checkprefix("FTP.", conn->host.name)) 4377 protop = "ftp"; 4378 else if(checkprefix("DICT.", conn->host.name)) 4379 protop = "DICT"; 4380 else if(checkprefix("LDAP.", conn->host.name)) 4381 protop = "LDAP"; 4382 else if(checkprefix("IMAP.", conn->host.name)) 4383 protop = "IMAP"; 4384 else if(checkprefix("SMTP.", conn->host.name)) 4385 protop = "smtp"; 4386 else if(checkprefix("POP3.", conn->host.name)) 4387 protop = "pop3"; 4388 else 4389 protop = "http"; 4390 } 4391 4392 *prot_missing = TRUE; /* not given in URL */ 4393 } 4394 else { 4395 size_t s = strlen(slashbuf); 4396 protop = protobuf; 4397 if(s != 2) { 4398 infof(data, "Unwillingly accepted illegal URL using %d slash%s!\n", 4399 s, s>1?"es":""); 4400 4401 if(data->change.url_alloc) 4402 free(data->change.url); 4403 /* repair the URL to use two slashes */ 4404 data->change.url = aprintf("%s://%s%s", 4405 protobuf, conn->host.name, path); 4406 if(!data->change.url) 4407 return CURLE_OUT_OF_MEMORY; 4408 data->change.url_alloc = TRUE; 4409 } 4410 } 4411 } 4412 4413 /* We search for '?' in the host name (but only on the right side of a 4414 * @-letter to allow ?-letters in username and password) to handle things 4415 * like http://example.com?param= (notice the missing '/'). 4416 */ 4417 at = strchr(conn->host.name, '@'); 4418 if(at) 4419 query = strchr(at+1, '?'); 4420 else 4421 query = strchr(conn->host.name, '?'); 4422 4423 if(query) { 4424 /* We must insert a slash before the '?'-letter in the URL. If the URL had 4425 a slash after the '?', that is where the path currently begins and the 4426 '?string' is still part of the host name. 4427 4428 We must move the trailing part from the host name and put it first in 4429 the path. And have it all prefixed with a slash. 4430 */ 4431 4432 size_t hostlen = strlen(query); 4433 size_t pathlen = strlen(path); 4434 4435 /* move the existing path plus the zero byte forward, to make room for 4436 the host-name part */ 4437 memmove(path+hostlen+1, path, pathlen+1); 4438 4439 /* now copy the trailing host part in front of the existing path */ 4440 memcpy(path+1, query, hostlen); 4441 4442 path[0]='/'; /* prepend the missing slash */ 4443 rebuild_url = TRUE; 4444 4445 *query=0; /* now cut off the hostname at the ? */ 4446 } 4447 else if(!path[0]) { 4448 /* if there's no path set, use a single slash */ 4449 strcpy(path, "/"); 4450 rebuild_url = TRUE; 4451 } 4452 4453 /* If the URL is malformatted (missing a '/' after hostname before path) we 4454 * insert a slash here. The only letters except '/' that can start a path is 4455 * '?' and '#' - as controlled by the two sscanf() patterns above. 4456 */ 4457 if(path[0] != '/') { 4458 /* We need this function to deal with overlapping memory areas. We know 4459 that the memory area 'path' points to is 'urllen' bytes big and that 4460 is bigger than the path. Use +1 to move the zero byte too. */ 4461 memmove(&path[1], path, strlen(path)+1); 4462 path[0] = '/'; 4463 rebuild_url = TRUE; 4464 } 4465 else if(!data->set.path_as_is) { 4466 /* sanitise paths and remove ../ and ./ sequences according to RFC3986 */ 4467 char *newp = Curl_dedotdotify(path); 4468 if(!newp) 4469 return CURLE_OUT_OF_MEMORY; 4470 4471 if(strcmp(newp, path)) { 4472 rebuild_url = TRUE; 4473 free(data->state.pathbuffer); 4474 data->state.pathbuffer = newp; 4475 data->state.path = newp; 4476 path = newp; 4477 } 4478 else 4479 free(newp); 4480 } 4481 4482 /* 4483 * "rebuild_url" means that one or more URL components have been modified so 4484 * we need to generate an updated full version. We need the corrected URL 4485 * when communicating over HTTP proxy and we don't know at this point if 4486 * we're using a proxy or not. 4487 */ 4488 if(rebuild_url) { 4489 char *reurl; 4490 4491 size_t plen = strlen(path); /* new path, should be 1 byte longer than 4492 the original */ 4493 size_t urllen = strlen(data->change.url); /* original URL length */ 4494 4495 size_t prefixlen = strlen(conn->host.name); 4496 4497 if(!*prot_missing) 4498 prefixlen += strlen(protop) + strlen("://"); 4499 4500 reurl = malloc(urllen + 2); /* 2 for zerobyte + slash */ 4501 if(!reurl) 4502 return CURLE_OUT_OF_MEMORY; 4503 4504 /* copy the prefix */ 4505 memcpy(reurl, data->change.url, prefixlen); 4506 4507 /* append the trailing piece + zerobyte */ 4508 memcpy(&reurl[prefixlen], path, plen + 1); 4509 4510 /* possible free the old one */ 4511 if(data->change.url_alloc) { 4512 Curl_safefree(data->change.url); 4513 data->change.url_alloc = FALSE; 4514 } 4515 4516 infof(data, "Rebuilt URL to: %s\n", reurl); 4517 4518 data->change.url = reurl; 4519 data->change.url_alloc = TRUE; /* free this later */ 4520 } 4521 4522 /* 4523 * Parse the login details from the URL and strip them out of 4524 * the host name 4525 */ 4526 result = parse_url_login(data, conn, userp, passwdp, optionsp); 4527 if(result) 4528 return result; 4529 4530 if(conn->host.name[0] == '[') { 4531 /* This looks like an IPv6 address literal. See if there is an address 4532 scope if there is no location header */ 4533 char *percent = strchr(conn->host.name, '%'); 4534 if(percent) { 4535 unsigned int identifier_offset = 3; 4536 char *endp; 4537 unsigned long scope; 4538 if(strncmp("%25", percent, 3) != 0) { 4539 infof(data, 4540 "Please URL encode %% as %%25, see RFC 6874.\n"); 4541 identifier_offset = 1; 4542 } 4543 scope = strtoul(percent + identifier_offset, &endp, 10); 4544 if(*endp == ']') { 4545 /* The address scope was well formed. Knock it out of the 4546 hostname. */ 4547 memmove(percent, endp, strlen(endp)+1); 4548 conn->scope_id = (unsigned int)scope; 4549 } 4550 else { 4551 /* Zone identifier is not numeric */ 4552 #if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ) && defined(HAVE_IF_NAMETOINDEX) 4553 char ifname[IFNAMSIZ + 2]; 4554 char *square_bracket; 4555 unsigned int scopeidx = 0; 4556 strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2); 4557 /* Ensure nullbyte termination */ 4558 ifname[IFNAMSIZ + 1] = '\0'; 4559 square_bracket = strchr(ifname, ']'); 4560 if(square_bracket) { 4561 /* Remove ']' */ 4562 *square_bracket = '\0'; 4563 scopeidx = if_nametoindex(ifname); 4564 if(scopeidx == 0) { 4565 infof(data, "Invalid network interface: %s; %s\n", ifname, 4566 strerror(errno)); 4567 } 4568 } 4569 if(scopeidx > 0) { 4570 char *p = percent + identifier_offset + strlen(ifname); 4571 4572 /* Remove zone identifier from hostname */ 4573 memmove(percent, p, strlen(p) + 1); 4574 conn->scope_id = scopeidx; 4575 } 4576 else 4577 #endif /* HAVE_NET_IF_H && IFNAMSIZ */ 4578 infof(data, "Invalid IPv6 address format\n"); 4579 } 4580 } 4581 } 4582 4583 if(data->set.scope_id) 4584 /* Override any scope that was set above. */ 4585 conn->scope_id = data->set.scope_id; 4586 4587 /* Remove the fragment part of the path. Per RFC 2396, this is always the 4588 last part of the URI. We are looking for the first '#' so that we deal 4589 gracefully with non conformant URI such as http://example.com#foo#bar. */ 4590 fragment = strchr(path, '#'); 4591 if(fragment) { 4592 *fragment = 0; 4593 4594 /* we know the path part ended with a fragment, so we know the full URL 4595 string does too and we need to cut it off from there so it isn't used 4596 over proxy */ 4597 fragment = strchr(data->change.url, '#'); 4598 if(fragment) 4599 *fragment = 0; 4600 } 4601 4602 /* 4603 * So if the URL was A://B/C#D, 4604 * protop is A 4605 * conn->host.name is B 4606 * data->state.path is /C 4607 */ 4608 4609 return findprotocol(data, conn, protop); 4610 } 4611 4612 /* 4613 * If we're doing a resumed transfer, we need to setup our stuff 4614 * properly. 4615 */ 4616 static CURLcode setup_range(struct Curl_easy *data) 4617 { 4618 struct UrlState *s = &data->state; 4619 s->resume_from = data->set.set_resume_from; 4620 if(s->resume_from || data->set.str[STRING_SET_RANGE]) { 4621 if(s->rangestringalloc) 4622 free(s->range); 4623 4624 if(s->resume_from) 4625 s->range = aprintf("%" CURL_FORMAT_CURL_OFF_TU "-", s->resume_from); 4626 else 4627 s->range = strdup(data->set.str[STRING_SET_RANGE]); 4628 4629 s->rangestringalloc = (s->range) ? TRUE : FALSE; 4630 4631 if(!s->range) 4632 return CURLE_OUT_OF_MEMORY; 4633 4634 /* tell ourselves to fetch this range */ 4635 s->use_range = TRUE; /* enable range download */ 4636 } 4637 else 4638 s->use_range = FALSE; /* disable range download */ 4639 4640 return CURLE_OK; 4641 } 4642 4643 4644 /* 4645 * setup_connection_internals() - 4646 * 4647 * Setup connection internals specific to the requested protocol in the 4648 * Curl_easy. This is inited and setup before the connection is made but 4649 * is about the particular protocol that is to be used. 4650 * 4651 * This MUST get called after proxy magic has been figured out. 4652 */ 4653 static CURLcode setup_connection_internals(struct connectdata *conn) 4654 { 4655 const struct Curl_handler * p; 4656 CURLcode result; 4657 struct Curl_easy *data = conn->data; 4658 4659 /* in some case in the multi state-machine, we go back to the CONNECT state 4660 and then a second (or third or...) call to this function will be made 4661 without doing a DISCONNECT or DONE in between (since the connection is 4662 yet in place) and therefore this function needs to first make sure 4663 there's no lingering previous data allocated. */ 4664 Curl_free_request_state(data); 4665 4666 memset(&data->req, 0, sizeof(struct SingleRequest)); 4667 data->req.maxdownload = -1; 4668 4669 conn->socktype = SOCK_STREAM; /* most of them are TCP streams */ 4670 4671 /* Perform setup complement if some. */ 4672 p = conn->handler; 4673 4674 if(p->setup_connection) { 4675 result = (*p->setup_connection)(conn); 4676 4677 if(result) 4678 return result; 4679 4680 p = conn->handler; /* May have changed. */ 4681 } 4682 4683 if(conn->port < 0) 4684 /* we check for -1 here since if proxy was detected already, this 4685 was very likely already set to the proxy port */ 4686 conn->port = p->defport; 4687 4688 return CURLE_OK; 4689 } 4690 4691 /* 4692 * Curl_free_request_state() should free temp data that was allocated in the 4693 * Curl_easy for this single request. 4694 */ 4695 4696 void Curl_free_request_state(struct Curl_easy *data) 4697 { 4698 Curl_safefree(data->req.protop); 4699 Curl_safefree(data->req.newurl); 4700 } 4701 4702 4703 #ifndef CURL_DISABLE_PROXY 4704 /**************************************************************** 4705 * Checks if the host is in the noproxy list. returns true if it matches 4706 * and therefore the proxy should NOT be used. 4707 ****************************************************************/ 4708 static bool check_noproxy(const char *name, const char *no_proxy) 4709 { 4710 /* no_proxy=domain1.dom,host.domain2.dom 4711 * (a comma-separated list of hosts which should 4712 * not be proxied, or an asterisk to override 4713 * all proxy variables) 4714 */ 4715 size_t tok_start; 4716 size_t tok_end; 4717 const char *separator = ", "; 4718 size_t no_proxy_len; 4719 size_t namelen; 4720 char *endptr; 4721 4722 if(no_proxy && no_proxy[0]) { 4723 if(strcasecompare("*", no_proxy)) { 4724 return TRUE; 4725 } 4726 4727 /* NO_PROXY was specified and it wasn't just an asterisk */ 4728 4729 no_proxy_len = strlen(no_proxy); 4730 endptr = strchr(name, ':'); 4731 if(endptr) 4732 namelen = endptr - name; 4733 else 4734 namelen = strlen(name); 4735 4736 for(tok_start = 0; tok_start < no_proxy_len; tok_start = tok_end + 1) { 4737 while(tok_start < no_proxy_len && 4738 strchr(separator, no_proxy[tok_start]) != NULL) { 4739 /* Look for the beginning of the token. */ 4740 ++tok_start; 4741 } 4742 4743 if(tok_start == no_proxy_len) 4744 break; /* It was all trailing separator chars, no more tokens. */ 4745 4746 for(tok_end = tok_start; tok_end < no_proxy_len && 4747 strchr(separator, no_proxy[tok_end]) == NULL; ++tok_end) 4748 /* Look for the end of the token. */ 4749 ; 4750 4751 /* To match previous behaviour, where it was necessary to specify 4752 * ".local.com" to prevent matching "notlocal.com", we will leave 4753 * the '.' off. 4754 */ 4755 if(no_proxy[tok_start] == '.') 4756 ++tok_start; 4757 4758 if((tok_end - tok_start) <= namelen) { 4759 /* Match the last part of the name to the domain we are checking. */ 4760 const char *checkn = name + namelen - (tok_end - tok_start); 4761 if(strncasecompare(no_proxy + tok_start, checkn, 4762 tok_end - tok_start)) { 4763 if((tok_end - tok_start) == namelen || *(checkn - 1) == '.') { 4764 /* We either have an exact match, or the previous character is a . 4765 * so it is within the same domain, so no proxy for this host. 4766 */ 4767 return TRUE; 4768 } 4769 } 4770 } /* if((tok_end - tok_start) <= namelen) */ 4771 } /* for(tok_start = 0; tok_start < no_proxy_len; 4772 tok_start = tok_end + 1) */ 4773 } /* NO_PROXY was specified and it wasn't just an asterisk */ 4774 4775 return FALSE; 4776 } 4777 4778 /**************************************************************** 4779 * Detect what (if any) proxy to use. Remember that this selects a host 4780 * name and is not limited to HTTP proxies only. 4781 * The returned pointer must be freed by the caller (unless NULL) 4782 ****************************************************************/ 4783 static char *detect_proxy(struct connectdata *conn) 4784 { 4785 char *proxy = NULL; 4786 4787 #ifndef CURL_DISABLE_HTTP 4788 /* If proxy was not specified, we check for default proxy environment 4789 * variables, to enable i.e Lynx compliance: 4790 * 4791 * http_proxy=http://some.server.dom:port/ 4792 * https_proxy=http://some.server.dom:port/ 4793 * ftp_proxy=http://some.server.dom:port/ 4794 * no_proxy=domain1.dom,host.domain2.dom 4795 * (a comma-separated list of hosts which should 4796 * not be proxied, or an asterisk to override 4797 * all proxy variables) 4798 * all_proxy=http://some.server.dom:port/ 4799 * (seems to exist for the CERN www lib. Probably 4800 * the first to check for.) 4801 * 4802 * For compatibility, the all-uppercase versions of these variables are 4803 * checked if the lowercase versions don't exist. 4804 */ 4805 char *no_proxy=NULL; 4806 char proxy_env[128]; 4807 4808 no_proxy=curl_getenv("no_proxy"); 4809 if(!no_proxy) 4810 no_proxy=curl_getenv("NO_PROXY"); 4811 4812 if(!check_noproxy(conn->host.name, no_proxy)) { 4813 /* It was not listed as without proxy */ 4814 const char *protop = conn->handler->scheme; 4815 char *envp = proxy_env; 4816 char *prox; 4817 4818 /* Now, build <protocol>_proxy and check for such a one to use */ 4819 while(*protop) 4820 *envp++ = (char)tolower((int)*protop++); 4821 4822 /* append _proxy */ 4823 strcpy(envp, "_proxy"); 4824 4825 /* read the protocol proxy: */ 4826 prox=curl_getenv(proxy_env); 4827 4828 /* 4829 * We don't try the uppercase version of HTTP_PROXY because of 4830 * security reasons: 4831 * 4832 * When curl is used in a webserver application 4833 * environment (cgi or php), this environment variable can 4834 * be controlled by the web server user by setting the 4835 * http header 'Proxy:' to some value. 4836 * 4837 * This can cause 'internal' http/ftp requests to be 4838 * arbitrarily redirected by any external attacker. 4839 */ 4840 if(!prox && !strcasecompare("http_proxy", proxy_env)) { 4841 /* There was no lowercase variable, try the uppercase version: */ 4842 Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env)); 4843 prox=curl_getenv(proxy_env); 4844 } 4845 4846 if(prox) 4847 proxy = prox; /* use this */ 4848 else { 4849 proxy = curl_getenv("all_proxy"); /* default proxy to use */ 4850 if(!proxy) 4851 proxy=curl_getenv("ALL_PROXY"); 4852 } 4853 } /* if(!check_noproxy(conn->host.name, no_proxy)) - it wasn't specified 4854 non-proxy */ 4855 free(no_proxy); 4856 4857 #else /* !CURL_DISABLE_HTTP */ 4858 4859 (void)conn; 4860 #endif /* CURL_DISABLE_HTTP */ 4861 4862 return proxy; 4863 } 4864 4865 /* 4866 * If this is supposed to use a proxy, we need to figure out the proxy 4867 * host name, so that we can re-use an existing connection 4868 * that may exist registered to the same proxy host. 4869 */ 4870 static CURLcode parse_proxy(struct Curl_easy *data, 4871 struct connectdata *conn, char *proxy, 4872 curl_proxytype proxytype) 4873 { 4874 char *prox_portno; 4875 char *endofprot; 4876 4877 /* We use 'proxyptr' to point to the proxy name from now on... */ 4878 char *proxyptr; 4879 char *portptr; 4880 char *atsign; 4881 long port = -1; 4882 char *proxyuser = NULL; 4883 char *proxypasswd = NULL; 4884 bool sockstype; 4885 4886 /* We do the proxy host string parsing here. We want the host name and the 4887 * port name. Accept a protocol:// prefix 4888 */ 4889 4890 /* Parse the protocol part if present */ 4891 endofprot = strstr(proxy, "://"); 4892 if(endofprot) { 4893 proxyptr = endofprot+3; 4894 if(checkprefix("https", proxy)) 4895 proxytype = CURLPROXY_HTTPS; 4896 else if(checkprefix("socks5h", proxy)) 4897 proxytype = CURLPROXY_SOCKS5_HOSTNAME; 4898 else if(checkprefix("socks5", proxy)) 4899 proxytype = CURLPROXY_SOCKS5; 4900 else if(checkprefix("socks4a", proxy)) 4901 proxytype = CURLPROXY_SOCKS4A; 4902 else if(checkprefix("socks4", proxy) || checkprefix("socks", proxy)) 4903 proxytype = CURLPROXY_SOCKS4; 4904 else if(checkprefix("http:", proxy)) 4905 ; /* leave it as HTTP or HTTP/1.0 */ 4906 else { 4907 /* Any other xxx:// reject! */ 4908 failf(data, "Unsupported proxy scheme for \'%s\'", proxy); 4909 return CURLE_COULDNT_CONNECT; 4910 } 4911 } 4912 else 4913 proxyptr = proxy; /* No xxx:// head: It's a HTTP proxy */ 4914 4915 sockstype = proxytype == CURLPROXY_SOCKS5_HOSTNAME || 4916 proxytype == CURLPROXY_SOCKS5 || 4917 proxytype == CURLPROXY_SOCKS4A || 4918 proxytype == CURLPROXY_SOCKS4; 4919 4920 /* Is there a username and password given in this proxy url? */ 4921 atsign = strchr(proxyptr, '@'); 4922 if(atsign) { 4923 CURLcode result = 4924 parse_login_details(proxyptr, atsign - proxyptr, 4925 &proxyuser, &proxypasswd, NULL); 4926 if(result) 4927 return result; 4928 proxyptr = atsign + 1; 4929 } 4930 4931 /* start scanning for port number at this point */ 4932 portptr = proxyptr; 4933 4934 /* detect and extract RFC6874-style IPv6-addresses */ 4935 if(*proxyptr == '[') { 4936 char *ptr = ++proxyptr; /* advance beyond the initial bracket */ 4937 while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.'))) 4938 ptr++; 4939 if(*ptr == '%') { 4940 /* There might be a zone identifier */ 4941 if(strncmp("%25", ptr, 3)) 4942 infof(data, "Please URL encode %% as %%25, see RFC 6874.\n"); 4943 ptr++; 4944 /* Allow unreserved characters as defined in RFC 3986 */ 4945 while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') || 4946 (*ptr == '.') || (*ptr == '_') || (*ptr == '~'))) 4947 ptr++; 4948 } 4949 if(*ptr == ']') 4950 /* yeps, it ended nicely with a bracket as well */ 4951 *ptr++ = 0; 4952 else 4953 infof(data, "Invalid IPv6 address format\n"); 4954 portptr = ptr; 4955 /* Note that if this didn't end with a bracket, we still advanced the 4956 * proxyptr first, but I can't see anything wrong with that as no host 4957 * name nor a numeric can legally start with a bracket. 4958 */ 4959 } 4960 4961 /* Get port number off proxy.server.com:1080 */ 4962 prox_portno = strchr(portptr, ':'); 4963 if(prox_portno) { 4964 char *endp = NULL; 4965 4966 *prox_portno = 0x0; /* cut off number from host name */ 4967 prox_portno ++; 4968 /* now set the local port number */ 4969 port = strtol(prox_portno, &endp, 10); 4970 if((endp && *endp && (*endp != '/') && (*endp != ' ')) || 4971 (port < 0) || (port > 65535)) { 4972 /* meant to detect for example invalid IPv6 numerical addresses without 4973 brackets: "2a00:fac0:a000::7:13". Accept a trailing slash only 4974 because we then allow "URL style" with the number followed by a 4975 slash, used in curl test cases already. Space is also an acceptable 4976 terminating symbol. */ 4977 infof(data, "No valid port number in proxy string (%s)\n", 4978 prox_portno); 4979 } 4980 else 4981 conn->port = port; 4982 } 4983 else { 4984 if(proxyptr[0]=='/') 4985 /* If the first character in the proxy string is a slash, fail 4986 immediately. The following code will otherwise clear the string which 4987 will lead to code running as if no proxy was set! */ 4988 return CURLE_COULDNT_RESOLVE_PROXY; 4989 4990 /* without a port number after the host name, some people seem to use 4991 a slash so we strip everything from the first slash */ 4992 atsign = strchr(proxyptr, '/'); 4993 if(atsign) 4994 *atsign = '\0'; /* cut off path part from host name */ 4995 4996 if(data->set.proxyport) 4997 /* None given in the proxy string, then get the default one if it is 4998 given */ 4999 port = data->set.proxyport; 5000 } 5001 5002 if(*proxyptr) { 5003 struct proxy_info *proxyinfo = 5004 sockstype ? &conn->socks_proxy : &conn->http_proxy; 5005 proxyinfo->proxytype = proxytype; 5006 5007 if(proxyuser) { 5008 /* found user and password, rip them out. note that we are unescaping 5009 them, as there is otherwise no way to have a username or password 5010 with reserved characters like ':' in them. */ 5011 Curl_safefree(proxyinfo->user); 5012 proxyinfo->user = curl_easy_unescape(data, proxyuser, 0, NULL); 5013 5014 if(!proxyinfo->user) 5015 return CURLE_OUT_OF_MEMORY; 5016 5017 Curl_safefree(proxyinfo->passwd); 5018 if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH) 5019 proxyinfo->passwd = curl_easy_unescape(data, proxypasswd, 0, NULL); 5020 else 5021 proxyinfo->passwd = strdup(""); 5022 5023 if(!proxyinfo->passwd) 5024 return CURLE_OUT_OF_MEMORY; 5025 5026 conn->bits.proxy_user_passwd = TRUE; /* enable it */ 5027 } 5028 5029 if(port >= 0) { 5030 proxyinfo->port = port; 5031 if(conn->port < 0 || sockstype || !conn->socks_proxy.host.rawalloc) 5032 conn->port = port; 5033 } 5034 5035 /* now, clone the cleaned proxy host name */ 5036 Curl_safefree(proxyinfo->host.rawalloc); 5037 proxyinfo->host.rawalloc = strdup(proxyptr); 5038 proxyinfo->host.name = proxyinfo->host.rawalloc; 5039 5040 if(!proxyinfo->host.rawalloc) 5041 return CURLE_OUT_OF_MEMORY; 5042 } 5043 5044 Curl_safefree(proxyuser); 5045 Curl_safefree(proxypasswd); 5046 5047 return CURLE_OK; 5048 } 5049 5050 /* 5051 * Extract the user and password from the authentication string 5052 */ 5053 static CURLcode parse_proxy_auth(struct Curl_easy *data, 5054 struct connectdata *conn) 5055 { 5056 char proxyuser[MAX_CURL_USER_LENGTH]=""; 5057 char proxypasswd[MAX_CURL_PASSWORD_LENGTH]=""; 5058 CURLcode result; 5059 5060 if(data->set.str[STRING_PROXYUSERNAME] != NULL) { 5061 strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME], 5062 MAX_CURL_USER_LENGTH); 5063 proxyuser[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/ 5064 } 5065 if(data->set.str[STRING_PROXYPASSWORD] != NULL) { 5066 strncpy(proxypasswd, data->set.str[STRING_PROXYPASSWORD], 5067 MAX_CURL_PASSWORD_LENGTH); 5068 proxypasswd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/ 5069 } 5070 5071 result = Curl_urldecode(data, proxyuser, 0, &conn->http_proxy.user, NULL, 5072 FALSE); 5073 if(!result) 5074 result = Curl_urldecode(data, proxypasswd, 0, &conn->http_proxy.passwd, 5075 NULL, FALSE); 5076 return result; 5077 } 5078 #endif /* CURL_DISABLE_PROXY */ 5079 5080 /* 5081 * parse_url_login() 5082 * 5083 * Parse the login details (user name, password and options) from the URL and 5084 * strip them out of the host name 5085 * 5086 * Inputs: data->set.use_netrc (CURLOPT_NETRC) 5087 * conn->host.name 5088 * 5089 * Outputs: (almost :- all currently undefined) 5090 * conn->bits.user_passwd - non-zero if non-default passwords exist 5091 * user - non-zero length if defined 5092 * passwd - non-zero length if defined 5093 * options - non-zero length if defined 5094 * conn->host.name - remove user name and password 5095 */ 5096 static CURLcode parse_url_login(struct Curl_easy *data, 5097 struct connectdata *conn, 5098 char **user, char **passwd, char **options) 5099 { 5100 CURLcode result = CURLE_OK; 5101 char *userp = NULL; 5102 char *passwdp = NULL; 5103 char *optionsp = NULL; 5104 5105 /* At this point, we're hoping all the other special cases have 5106 * been taken care of, so conn->host.name is at most 5107 * [user[:password][;options]]@]hostname 5108 * 5109 * We need somewhere to put the embedded details, so do that first. 5110 */ 5111 5112 char *ptr = strchr(conn->host.name, '@'); 5113 char *login = conn->host.name; 5114 5115 DEBUGASSERT(!**user); 5116 DEBUGASSERT(!**passwd); 5117 DEBUGASSERT(!**options); 5118 5119 if(!ptr) 5120 goto out; 5121 5122 /* We will now try to extract the 5123 * possible login information in a string like: 5124 * ftp://user:password@ftp.my.site:8021/README */ 5125 conn->host.name = ++ptr; 5126 5127 /* So the hostname is sane. Only bother interpreting the 5128 * results if we could care. It could still be wasted 5129 * work because it might be overtaken by the programmatically 5130 * set user/passwd, but doing that first adds more cases here :-( 5131 */ 5132 5133 if(data->set.use_netrc == CURL_NETRC_REQUIRED) 5134 goto out; 5135 5136 /* We could use the login information in the URL so extract it */ 5137 result = parse_login_details(login, ptr - login - 1, 5138 &userp, &passwdp, &optionsp); 5139 if(result) 5140 goto out; 5141 5142 if(userp) { 5143 char *newname; 5144 5145 /* We have a user in the URL */ 5146 conn->bits.userpwd_in_url = TRUE; 5147 conn->bits.user_passwd = TRUE; /* enable user+password */ 5148 5149 /* Decode the user */ 5150 result = Curl_urldecode(data, userp, 0, &newname, NULL, FALSE); 5151 if(result) { 5152 goto out; 5153 } 5154 5155 free(*user); 5156 *user = newname; 5157 } 5158 5159 if(passwdp) { 5160 /* We have a password in the URL so decode it */ 5161 char *newpasswd; 5162 result = Curl_urldecode(data, passwdp, 0, &newpasswd, NULL, FALSE); 5163 if(result) { 5164 goto out; 5165 } 5166 5167 free(*passwd); 5168 *passwd = newpasswd; 5169 } 5170 5171 if(optionsp) { 5172 /* We have an options list in the URL so decode it */ 5173 char *newoptions; 5174 result = Curl_urldecode(data, optionsp, 0, &newoptions, NULL, FALSE); 5175 if(result) { 5176 goto out; 5177 } 5178 5179 free(*options); 5180 *options = newoptions; 5181 } 5182 5183 5184 out: 5185 5186 free(userp); 5187 free(passwdp); 5188 free(optionsp); 5189 5190 return result; 5191 } 5192 5193 /* 5194 * parse_login_details() 5195 * 5196 * This is used to parse a login string for user name, password and options in 5197 * the following formats: 5198 * 5199 * user 5200 * user:password 5201 * user:password;options 5202 * user;options 5203 * user;options:password 5204 * :password 5205 * :password;options 5206 * ;options 5207 * ;options:password 5208 * 5209 * Parameters: 5210 * 5211 * login [in] - The login string. 5212 * len [in] - The length of the login string. 5213 * userp [in/out] - The address where a pointer to newly allocated memory 5214 * holding the user will be stored upon completion. 5215 * passdwp [in/out] - The address where a pointer to newly allocated memory 5216 * holding the password will be stored upon completion. 5217 * optionsp [in/out] - The address where a pointer to newly allocated memory 5218 * holding the options will be stored upon completion. 5219 * 5220 * Returns CURLE_OK on success. 5221 */ 5222 static CURLcode parse_login_details(const char *login, const size_t len, 5223 char **userp, char **passwdp, 5224 char **optionsp) 5225 { 5226 CURLcode result = CURLE_OK; 5227 char *ubuf = NULL; 5228 char *pbuf = NULL; 5229 char *obuf = NULL; 5230 const char *psep = NULL; 5231 const char *osep = NULL; 5232 size_t ulen; 5233 size_t plen; 5234 size_t olen; 5235 5236 /* Attempt to find the password separator */ 5237 if(passwdp) { 5238 psep = strchr(login, ':'); 5239 5240 /* Within the constraint of the login string */ 5241 if(psep >= login + len) 5242 psep = NULL; 5243 } 5244 5245 /* Attempt to find the options separator */ 5246 if(optionsp) { 5247 osep = strchr(login, ';'); 5248 5249 /* Within the constraint of the login string */ 5250 if(osep >= login + len) 5251 osep = NULL; 5252 } 5253 5254 /* Calculate the portion lengths */ 5255 ulen = (psep ? 5256 (size_t)(osep && psep > osep ? osep - login : psep - login) : 5257 (osep ? (size_t)(osep - login) : len)); 5258 plen = (psep ? 5259 (osep && osep > psep ? (size_t)(osep - psep) : 5260 (size_t)(login + len - psep)) - 1 : 0); 5261 olen = (osep ? 5262 (psep && psep > osep ? (size_t)(psep - osep) : 5263 (size_t)(login + len - osep)) - 1 : 0); 5264 5265 /* Allocate the user portion buffer */ 5266 if(userp && ulen) { 5267 ubuf = malloc(ulen + 1); 5268 if(!ubuf) 5269 result = CURLE_OUT_OF_MEMORY; 5270 } 5271 5272 /* Allocate the password portion buffer */ 5273 if(!result && passwdp && plen) { 5274 pbuf = malloc(plen + 1); 5275 if(!pbuf) { 5276 free(ubuf); 5277 result = CURLE_OUT_OF_MEMORY; 5278 } 5279 } 5280 5281 /* Allocate the options portion buffer */ 5282 if(!result && optionsp && olen) { 5283 obuf = malloc(olen + 1); 5284 if(!obuf) { 5285 free(pbuf); 5286 free(ubuf); 5287 result = CURLE_OUT_OF_MEMORY; 5288 } 5289 } 5290 5291 if(!result) { 5292 /* Store the user portion if necessary */ 5293 if(ubuf) { 5294 memcpy(ubuf, login, ulen); 5295 ubuf[ulen] = '\0'; 5296 Curl_safefree(*userp); 5297 *userp = ubuf; 5298 } 5299 5300 /* Store the password portion if necessary */ 5301 if(pbuf) { 5302 memcpy(pbuf, psep + 1, plen); 5303 pbuf[plen] = '\0'; 5304 Curl_safefree(*passwdp); 5305 *passwdp = pbuf; 5306 } 5307 5308 /* Store the options portion if necessary */ 5309 if(obuf) { 5310 memcpy(obuf, osep + 1, olen); 5311 obuf[olen] = '\0'; 5312 Curl_safefree(*optionsp); 5313 *optionsp = obuf; 5314 } 5315 } 5316 5317 return result; 5318 } 5319 5320 /************************************************************* 5321 * Figure out the remote port number and fix it in the URL 5322 * 5323 * No matter if we use a proxy or not, we have to figure out the remote 5324 * port number of various reasons. 5325 * 5326 * To be able to detect port number flawlessly, we must not confuse them 5327 * IPv6-specified addresses in the [0::1] style. (RFC2732) 5328 * 5329 * The conn->host.name is currently [user:passwd@]host[:port] where host 5330 * could be a hostname, IPv4 address or IPv6 address. 5331 * 5332 * The port number embedded in the URL is replaced, if necessary. 5333 *************************************************************/ 5334 static CURLcode parse_remote_port(struct Curl_easy *data, 5335 struct connectdata *conn) 5336 { 5337 char *portptr; 5338 char endbracket; 5339 5340 /* Note that at this point, the IPv6 address cannot contain any scope 5341 suffix as that has already been removed in the parseurlandfillconn() 5342 function */ 5343 if((1 == sscanf(conn->host.name, "[%*45[0123456789abcdefABCDEF:.]%c", 5344 &endbracket)) && 5345 (']' == endbracket)) { 5346 /* this is a RFC2732-style specified IP-address */ 5347 conn->bits.ipv6_ip = TRUE; 5348 5349 conn->host.name++; /* skip over the starting bracket */ 5350 portptr = strchr(conn->host.name, ']'); 5351 if(portptr) { 5352 *portptr++ = '\0'; /* zero terminate, killing the bracket */ 5353 if(':' != *portptr) 5354 portptr = NULL; /* no port number available */ 5355 } 5356 } 5357 else { 5358 #ifdef ENABLE_IPV6 5359 struct in6_addr in6; 5360 if(Curl_inet_pton(AF_INET6, conn->host.name, &in6) > 0) { 5361 /* This is a numerical IPv6 address, meaning this is a wrongly formatted 5362 URL */ 5363 failf(data, "IPv6 numerical address used in URL without brackets"); 5364 return CURLE_URL_MALFORMAT; 5365 } 5366 #endif 5367 5368 portptr = strrchr(conn->host.name, ':'); 5369 } 5370 5371 if(data->set.use_port && data->state.allow_port) { 5372 /* if set, we use this and ignore the port possibly given in the URL */ 5373 conn->remote_port = (unsigned short)data->set.use_port; 5374 if(portptr) 5375 *portptr = '\0'; /* cut off the name there anyway - if there was a port 5376 number - since the port number is to be ignored! */ 5377 if(conn->bits.httpproxy) { 5378 /* we need to create new URL with the new port number */ 5379 char *url; 5380 char type[12]=""; 5381 5382 if(conn->bits.type_set) 5383 snprintf(type, sizeof(type), ";type=%c", 5384 data->set.prefer_ascii?'A': 5385 (data->set.ftp_list_only?'D':'I')); 5386 5387 /* 5388 * This synthesized URL isn't always right--suffixes like ;type=A are 5389 * stripped off. It would be better to work directly from the original 5390 * URL and simply replace the port part of it. 5391 */ 5392 url = aprintf("%s://%s%s%s:%hu%s%s%s", conn->given->scheme, 5393 conn->bits.ipv6_ip?"[":"", conn->host.name, 5394 conn->bits.ipv6_ip?"]":"", conn->remote_port, 5395 data->state.slash_removed?"/":"", data->state.path, 5396 type); 5397 if(!url) 5398 return CURLE_OUT_OF_MEMORY; 5399 5400 if(data->change.url_alloc) { 5401 Curl_safefree(data->change.url); 5402 data->change.url_alloc = FALSE; 5403 } 5404 5405 data->change.url = url; 5406 data->change.url_alloc = TRUE; 5407 } 5408 } 5409 else if(portptr) { 5410 /* no CURLOPT_PORT given, extract the one from the URL */ 5411 5412 char *rest; 5413 long port; 5414 5415 port=strtol(portptr+1, &rest, 10); /* Port number must be decimal */ 5416 5417 if((port < 0) || (port > 0xffff)) { 5418 /* Single unix standard says port numbers are 16 bits long */ 5419 failf(data, "Port number out of range"); 5420 return CURLE_URL_MALFORMAT; 5421 } 5422 5423 else if(rest != &portptr[1]) { 5424 *portptr = '\0'; /* cut off the name there */ 5425 conn->remote_port = curlx_ultous(port); 5426 } 5427 else 5428 /* Browser behavior adaptation. If there's a colon with no digits after, 5429 just cut off the name there which makes us ignore the colon and just 5430 use the default port. Firefox and Chrome both do that. */ 5431 *portptr = '\0'; 5432 } 5433 5434 /* only if remote_port was not already parsed off the URL we use the 5435 default port number */ 5436 if(conn->remote_port < 0) 5437 conn->remote_port = (unsigned short)conn->given->defport; 5438 5439 return CURLE_OK; 5440 } 5441 5442 /* 5443 * Override the login details from the URL with that in the CURLOPT_USERPWD 5444 * option or a .netrc file, if applicable. 5445 */ 5446 static CURLcode override_login(struct Curl_easy *data, 5447 struct connectdata *conn, 5448 char **userp, char **passwdp, char **optionsp) 5449 { 5450 if(data->set.str[STRING_USERNAME]) { 5451 free(*userp); 5452 *userp = strdup(data->set.str[STRING_USERNAME]); 5453 if(!*userp) 5454 return CURLE_OUT_OF_MEMORY; 5455 } 5456 5457 if(data->set.str[STRING_PASSWORD]) { 5458 free(*passwdp); 5459 *passwdp = strdup(data->set.str[STRING_PASSWORD]); 5460 if(!*passwdp) 5461 return CURLE_OUT_OF_MEMORY; 5462 } 5463 5464 if(data->set.str[STRING_OPTIONS]) { 5465 free(*optionsp); 5466 *optionsp = strdup(data->set.str[STRING_OPTIONS]); 5467 if(!*optionsp) 5468 return CURLE_OUT_OF_MEMORY; 5469 } 5470 5471 conn->bits.netrc = FALSE; 5472 if(data->set.use_netrc != CURL_NETRC_IGNORED) { 5473 int ret = Curl_parsenetrc(conn->host.name, 5474 userp, passwdp, 5475 data->set.str[STRING_NETRC_FILE]); 5476 if(ret > 0) { 5477 infof(data, "Couldn't find host %s in the " 5478 DOT_CHAR "netrc file; using defaults\n", 5479 conn->host.name); 5480 } 5481 else if(ret < 0) { 5482 return CURLE_OUT_OF_MEMORY; 5483 } 5484 else { 5485 /* set bits.netrc TRUE to remember that we got the name from a .netrc 5486 file, so that it is safe to use even if we followed a Location: to a 5487 different host or similar. */ 5488 conn->bits.netrc = TRUE; 5489 5490 conn->bits.user_passwd = TRUE; /* enable user+password */ 5491 } 5492 } 5493 5494 return CURLE_OK; 5495 } 5496 5497 /* 5498 * Set the login details so they're available in the connection 5499 */ 5500 static CURLcode set_login(struct connectdata *conn, 5501 const char *user, const char *passwd, 5502 const char *options) 5503 { 5504 CURLcode result = CURLE_OK; 5505 5506 /* If our protocol needs a password and we have none, use the defaults */ 5507 if((conn->handler->flags & PROTOPT_NEEDSPWD) && !conn->bits.user_passwd) { 5508 /* Store the default user */ 5509 conn->user = strdup(CURL_DEFAULT_USER); 5510 5511 /* Store the default password */ 5512 if(conn->user) 5513 conn->passwd = strdup(CURL_DEFAULT_PASSWORD); 5514 else 5515 conn->passwd = NULL; 5516 5517 /* This is the default password, so DON'T set conn->bits.user_passwd */ 5518 } 5519 else { 5520 /* Store the user, zero-length if not set */ 5521 conn->user = strdup(user); 5522 5523 /* Store the password (only if user is present), zero-length if not set */ 5524 if(conn->user) 5525 conn->passwd = strdup(passwd); 5526 else 5527 conn->passwd = NULL; 5528 } 5529 5530 if(!conn->user || !conn->passwd) 5531 result = CURLE_OUT_OF_MEMORY; 5532 5533 /* Store the options, null if not set */ 5534 if(!result && options[0]) { 5535 conn->options = strdup(options); 5536 5537 if(!conn->options) 5538 result = CURLE_OUT_OF_MEMORY; 5539 } 5540 5541 return result; 5542 } 5543 5544 /* 5545 * Parses a "host:port" string to connect to. 5546 * The hostname and the port may be empty; in this case, NULL is returned for 5547 * the hostname and -1 for the port. 5548 */ 5549 static CURLcode parse_connect_to_host_port(struct Curl_easy *data, 5550 const char *host, 5551 char **hostname_result, 5552 int *port_result) 5553 { 5554 char *host_dup; 5555 char *hostptr; 5556 char *host_portno; 5557 char *portptr; 5558 int port = -1; 5559 5560 *hostname_result = NULL; 5561 *port_result = -1; 5562 5563 if(!host || !*host) 5564 return CURLE_OK; 5565 5566 host_dup = strdup(host); 5567 if(!host_dup) 5568 return CURLE_OUT_OF_MEMORY; 5569 5570 hostptr = host_dup; 5571 5572 /* start scanning for port number at this point */ 5573 portptr = hostptr; 5574 5575 /* detect and extract RFC6874-style IPv6-addresses */ 5576 if(*hostptr == '[') { 5577 char *ptr = ++hostptr; /* advance beyond the initial bracket */ 5578 while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.'))) 5579 ptr++; 5580 if(*ptr == '%') { 5581 /* There might be a zone identifier */ 5582 if(strncmp("%25", ptr, 3)) 5583 infof(data, "Please URL encode %% as %%25, see RFC 6874.\n"); 5584 ptr++; 5585 /* Allow unreserved characters as defined in RFC 3986 */ 5586 while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') || 5587 (*ptr == '.') || (*ptr == '_') || (*ptr == '~'))) 5588 ptr++; 5589 } 5590 if(*ptr == ']') 5591 /* yeps, it ended nicely with a bracket as well */ 5592 *ptr++ = '\0'; 5593 else 5594 infof(data, "Invalid IPv6 address format\n"); 5595 portptr = ptr; 5596 /* Note that if this didn't end with a bracket, we still advanced the 5597 * hostptr first, but I can't see anything wrong with that as no host 5598 * name nor a numeric can legally start with a bracket. 5599 */ 5600 } 5601 5602 /* Get port number off server.com:1080 */ 5603 host_portno = strchr(portptr, ':'); 5604 if(host_portno) { 5605 char *endp = NULL; 5606 *host_portno = '\0'; /* cut off number from host name */ 5607 host_portno++; 5608 if(*host_portno) { 5609 long portparse = strtol(host_portno, &endp, 10); 5610 if((endp && *endp) || (portparse < 0) || (portparse > 65535)) { 5611 infof(data, "No valid port number in connect to host string (%s)\n", 5612 host_portno); 5613 hostptr = NULL; 5614 port = -1; 5615 } 5616 else 5617 port = (int)portparse; /* we know it will fit */ 5618 } 5619 } 5620 5621 /* now, clone the cleaned host name */ 5622 if(hostptr) { 5623 *hostname_result = strdup(hostptr); 5624 if(!*hostname_result) { 5625 free(host_dup); 5626 return CURLE_OUT_OF_MEMORY; 5627 } 5628 } 5629 5630 *port_result = port; 5631 5632 free(host_dup); 5633 return CURLE_OK; 5634 } 5635 5636 /* 5637 * Parses one "connect to" string in the form: 5638 * "HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT". 5639 */ 5640 static CURLcode parse_connect_to_string(struct Curl_easy *data, 5641 struct connectdata *conn, 5642 const char *conn_to_host, 5643 char **host_result, 5644 int *port_result) 5645 { 5646 CURLcode result = CURLE_OK; 5647 const char *ptr = conn_to_host; 5648 int host_match = FALSE; 5649 int port_match = FALSE; 5650 5651 if(*ptr == ':') { 5652 /* an empty hostname always matches */ 5653 host_match = TRUE; 5654 ptr++; 5655 } 5656 else { 5657 /* check whether the URL's hostname matches */ 5658 size_t hostname_to_match_len; 5659 char *hostname_to_match = aprintf("%s%s%s", 5660 conn->bits.ipv6_ip ? "[" : "", 5661 conn->host.name, 5662 conn->bits.ipv6_ip ? "]" : ""); 5663 if(!hostname_to_match) 5664 return CURLE_OUT_OF_MEMORY; 5665 hostname_to_match_len = strlen(hostname_to_match); 5666 host_match = strncasecompare(ptr, hostname_to_match, 5667 hostname_to_match_len); 5668 free(hostname_to_match); 5669 ptr += hostname_to_match_len; 5670 5671 host_match = host_match && *ptr == ':'; 5672 ptr++; 5673 } 5674 5675 if(host_match) { 5676 if(*ptr == ':') { 5677 /* an empty port always matches */ 5678 port_match = TRUE; 5679 ptr++; 5680 } 5681 else { 5682 /* check whether the URL's port matches */ 5683 char *ptr_next = strchr(ptr, ':'); 5684 if(ptr_next) { 5685 char *endp = NULL; 5686 long port_to_match = strtol(ptr, &endp, 10); 5687 if((endp == ptr_next) && (port_to_match == conn->remote_port)) { 5688 port_match = TRUE; 5689 ptr = ptr_next + 1; 5690 } 5691 } 5692 } 5693 } 5694 5695 if(host_match && port_match) { 5696 /* parse the hostname and port to connect to */ 5697 result = parse_connect_to_host_port(data, ptr, host_result, port_result); 5698 } 5699 5700 return result; 5701 } 5702 5703 /* 5704 * Processes all strings in the "connect to" slist, and uses the "connect 5705 * to host" and "connect to port" of the first string that matches. 5706 */ 5707 static CURLcode parse_connect_to_slist(struct Curl_easy *data, 5708 struct connectdata *conn, 5709 struct curl_slist *conn_to_host) 5710 { 5711 CURLcode result = CURLE_OK; 5712 char *host = NULL; 5713 int port = 0; 5714 5715 while(conn_to_host && !host) { 5716 result = parse_connect_to_string(data, conn, conn_to_host->data, 5717 &host, &port); 5718 if(result) 5719 return result; 5720 5721 if(host && *host) { 5722 bool ipv6host; 5723 conn->conn_to_host.rawalloc = host; 5724 conn->conn_to_host.name = host; 5725 conn->bits.conn_to_host = TRUE; 5726 5727 ipv6host = strchr(host, ':') != NULL; 5728 infof(data, "Connecting to hostname: %s%s%s\n", 5729 ipv6host ? "[" : "", host, ipv6host ? "]" : ""); 5730 } 5731 else { 5732 /* no "connect to host" */ 5733 conn->bits.conn_to_host = FALSE; 5734 free(host); 5735 } 5736 5737 if(port >= 0) { 5738 conn->conn_to_port = port; 5739 conn->bits.conn_to_port = TRUE; 5740 infof(data, "Connecting to port: %d\n", port); 5741 } 5742 else { 5743 /* no "connect to port" */ 5744 conn->bits.conn_to_port = FALSE; 5745 } 5746 5747 conn_to_host = conn_to_host->next; 5748 } 5749 5750 return result; 5751 } 5752 5753 /************************************************************* 5754 * Resolve the address of the server or proxy 5755 *************************************************************/ 5756 static CURLcode resolve_server(struct Curl_easy *data, 5757 struct connectdata *conn, 5758 bool *async) 5759 { 5760 CURLcode result=CURLE_OK; 5761 time_t timeout_ms = Curl_timeleft(data, NULL, TRUE); 5762 5763 /************************************************************* 5764 * Resolve the name of the server or proxy 5765 *************************************************************/ 5766 if(conn->bits.reuse) 5767 /* We're reusing the connection - no need to resolve anything, and 5768 fix_hostname() was called already in create_conn() for the re-use 5769 case. */ 5770 *async = FALSE; 5771 5772 else { 5773 /* this is a fresh connect */ 5774 int rc; 5775 struct Curl_dns_entry *hostaddr; 5776 5777 #ifdef USE_UNIX_SOCKETS 5778 if(conn->unix_domain_socket) { 5779 /* Unix domain sockets are local. The host gets ignored, just use the 5780 * specified domain socket address. Do not cache "DNS entries". There is 5781 * no DNS involved and we already have the filesystem path available */ 5782 const char *path = conn->unix_domain_socket; 5783 5784 hostaddr = calloc(1, sizeof(struct Curl_dns_entry)); 5785 if(!hostaddr) 5786 result = CURLE_OUT_OF_MEMORY; 5787 else if((hostaddr->addr = Curl_unix2addr(path)) != NULL) 5788 hostaddr->inuse++; 5789 else { 5790 /* Long paths are not supported for now */ 5791 if(strlen(path) >= sizeof(((struct sockaddr_un *)0)->sun_path)) { 5792 failf(data, "Unix socket path too long: '%s'", path); 5793 result = CURLE_COULDNT_RESOLVE_HOST; 5794 } 5795 else 5796 result = CURLE_OUT_OF_MEMORY; 5797 free(hostaddr); 5798 hostaddr = NULL; 5799 } 5800 } 5801 else 5802 #endif 5803 if(!conn->bits.proxy) { 5804 struct hostname *connhost; 5805 if(conn->bits.conn_to_host) 5806 connhost = &conn->conn_to_host; 5807 else 5808 connhost = &conn->host; 5809 5810 /* If not connecting via a proxy, extract the port from the URL, if it is 5811 * there, thus overriding any defaults that might have been set above. */ 5812 if(conn->bits.conn_to_port) 5813 conn->port = conn->conn_to_port; 5814 else 5815 conn->port = conn->remote_port; /* it is the same port */ 5816 5817 /* Resolve target host right on */ 5818 rc = Curl_resolv_timeout(conn, connhost->name, (int)conn->port, 5819 &hostaddr, timeout_ms); 5820 if(rc == CURLRESOLV_PENDING) 5821 *async = TRUE; 5822 5823 else if(rc == CURLRESOLV_TIMEDOUT) 5824 result = CURLE_OPERATION_TIMEDOUT; 5825 5826 else if(!hostaddr) { 5827 failf(data, "Couldn't resolve host '%s'", connhost->dispname); 5828 result = CURLE_COULDNT_RESOLVE_HOST; 5829 /* don't return yet, we need to clean up the timeout first */ 5830 } 5831 } 5832 else { 5833 /* This is a proxy that hasn't been resolved yet. */ 5834 5835 struct hostname * const host = conn->bits.socksproxy ? 5836 &conn->socks_proxy.host : &conn->http_proxy.host; 5837 5838 /* resolve proxy */ 5839 rc = Curl_resolv_timeout(conn, host->name, (int)conn->port, 5840 &hostaddr, timeout_ms); 5841 5842 if(rc == CURLRESOLV_PENDING) 5843 *async = TRUE; 5844 5845 else if(rc == CURLRESOLV_TIMEDOUT) 5846 result = CURLE_OPERATION_TIMEDOUT; 5847 5848 else if(!hostaddr) { 5849 failf(data, "Couldn't resolve proxy '%s'", host->dispname); 5850 result = CURLE_COULDNT_RESOLVE_PROXY; 5851 /* don't return yet, we need to clean up the timeout first */ 5852 } 5853 } 5854 DEBUGASSERT(conn->dns_entry == NULL); 5855 conn->dns_entry = hostaddr; 5856 } 5857 5858 return result; 5859 } 5860 5861 /* 5862 * Cleanup the connection just allocated before we can move along and use the 5863 * previously existing one. All relevant data is copied over and old_conn is 5864 * ready for freeing once this function returns. 5865 */ 5866 static void reuse_conn(struct connectdata *old_conn, 5867 struct connectdata *conn) 5868 { 5869 free_fixed_hostname(&old_conn->http_proxy.host); 5870 free_fixed_hostname(&old_conn->socks_proxy.host); 5871 free_fixed_hostname(&old_conn->proxy); 5872 5873 free(old_conn->http_proxy.host.rawalloc); 5874 free(old_conn->socks_proxy.host.rawalloc); 5875 free(old_conn->proxy.rawalloc); 5876 5877 /* free the SSL config struct from this connection struct as this was 5878 allocated in vain and is targeted for destruction */ 5879 Curl_free_primary_ssl_config(&old_conn->ssl_config); 5880 Curl_free_primary_ssl_config(&old_conn->proxy_ssl_config); 5881 5882 conn->data = old_conn->data; 5883 5884 /* get the user+password information from the old_conn struct since it may 5885 * be new for this request even when we re-use an existing connection */ 5886 conn->bits.user_passwd = old_conn->bits.user_passwd; 5887 if(conn->bits.user_passwd) { 5888 /* use the new user name and password though */ 5889 Curl_safefree(conn->user); 5890 Curl_safefree(conn->passwd); 5891 conn->user = old_conn->user; 5892 conn->passwd = old_conn->passwd; 5893 old_conn->user = NULL; 5894 old_conn->passwd = NULL; 5895 } 5896 5897 conn->bits.proxy_user_passwd = old_conn->bits.proxy_user_passwd; 5898 if(conn->bits.proxy_user_passwd) { 5899 /* use the new proxy user name and proxy password though */ 5900 Curl_safefree(conn->http_proxy.user); 5901 Curl_safefree(conn->socks_proxy.user); 5902 Curl_safefree(conn->http_proxy.passwd); 5903 Curl_safefree(conn->socks_proxy.passwd); 5904 conn->http_proxy.user = old_conn->http_proxy.user; 5905 conn->socks_proxy.user = old_conn->socks_proxy.user; 5906 conn->http_proxy.passwd = old_conn->http_proxy.passwd; 5907 conn->socks_proxy.passwd = old_conn->socks_proxy.passwd; 5908 old_conn->http_proxy.user = NULL; 5909 old_conn->socks_proxy.user = NULL; 5910 old_conn->http_proxy.passwd = NULL; 5911 old_conn->socks_proxy.passwd = NULL; 5912 } 5913 5914 /* host can change, when doing keepalive with a proxy or if the case is 5915 different this time etc */ 5916 free_fixed_hostname(&conn->host); 5917 free_fixed_hostname(&conn->conn_to_host); 5918 Curl_safefree(conn->host.rawalloc); 5919 Curl_safefree(conn->conn_to_host.rawalloc); 5920 conn->host=old_conn->host; 5921 conn->bits.conn_to_host = old_conn->bits.conn_to_host; 5922 conn->conn_to_host = old_conn->conn_to_host; 5923 conn->bits.conn_to_port = old_conn->bits.conn_to_port; 5924 conn->conn_to_port = old_conn->conn_to_port; 5925 5926 /* persist connection info in session handle */ 5927 Curl_persistconninfo(conn); 5928 5929 conn_reset_all_postponed_data(old_conn); /* free buffers */ 5930 conn_reset_all_postponed_data(conn); /* reset unprocessed data */ 5931 5932 /* re-use init */ 5933 conn->bits.reuse = TRUE; /* yes, we're re-using here */ 5934 5935 Curl_safefree(old_conn->user); 5936 Curl_safefree(old_conn->passwd); 5937 Curl_safefree(old_conn->http_proxy.user); 5938 Curl_safefree(old_conn->socks_proxy.user); 5939 Curl_safefree(old_conn->http_proxy.passwd); 5940 Curl_safefree(old_conn->socks_proxy.passwd); 5941 Curl_safefree(old_conn->localdev); 5942 5943 Curl_llist_destroy(old_conn->send_pipe, NULL); 5944 Curl_llist_destroy(old_conn->recv_pipe, NULL); 5945 5946 old_conn->send_pipe = NULL; 5947 old_conn->recv_pipe = NULL; 5948 5949 Curl_safefree(old_conn->master_buffer); 5950 5951 #ifdef USE_UNIX_SOCKETS 5952 Curl_safefree(old_conn->unix_domain_socket); 5953 #endif 5954 } 5955 5956 /** 5957 * create_conn() sets up a new connectdata struct, or re-uses an already 5958 * existing one, and resolves host name. 5959 * 5960 * if this function returns CURLE_OK and *async is set to TRUE, the resolve 5961 * response will be coming asynchronously. If *async is FALSE, the name is 5962 * already resolved. 5963 * 5964 * @param data The sessionhandle pointer 5965 * @param in_connect is set to the next connection data pointer 5966 * @param async is set TRUE when an async DNS resolution is pending 5967 * @see Curl_setup_conn() 5968 * 5969 * *NOTE* this function assigns the conn->data pointer! 5970 */ 5971 5972 static CURLcode create_conn(struct Curl_easy *data, 5973 struct connectdata **in_connect, 5974 bool *async) 5975 { 5976 CURLcode result = CURLE_OK; 5977 struct connectdata *conn; 5978 struct connectdata *conn_temp = NULL; 5979 size_t urllen; 5980 char *user = NULL; 5981 char *passwd = NULL; 5982 char *options = NULL; 5983 bool reuse; 5984 char *proxy = NULL; 5985 char *socksproxy = NULL; 5986 bool prot_missing = FALSE; 5987 bool connections_available = TRUE; 5988 bool force_reuse = FALSE; 5989 bool waitpipe = FALSE; 5990 size_t max_host_connections = Curl_multi_max_host_connections(data->multi); 5991 size_t max_total_connections = Curl_multi_max_total_connections(data->multi); 5992 5993 *async = FALSE; 5994 5995 /************************************************************* 5996 * Check input data 5997 *************************************************************/ 5998 5999 if(!data->change.url) { 6000 result = CURLE_URL_MALFORMAT; 6001 goto out; 6002 } 6003 6004 /* First, split up the current URL in parts so that we can use the 6005 parts for checking against the already present connections. In order 6006 to not have to modify everything at once, we allocate a temporary 6007 connection data struct and fill in for comparison purposes. */ 6008 conn = allocate_conn(data); 6009 6010 if(!conn) { 6011 result = CURLE_OUT_OF_MEMORY; 6012 goto out; 6013 } 6014 6015 /* We must set the return variable as soon as possible, so that our 6016 parent can cleanup any possible allocs we may have done before 6017 any failure */ 6018 *in_connect = conn; 6019 6020 /* This initing continues below, see the comment "Continue connectdata 6021 * initialization here" */ 6022 6023 /*********************************************************** 6024 * We need to allocate memory to store the path in. We get the size of the 6025 * full URL to be sure, and we need to make it at least 256 bytes since 6026 * other parts of the code will rely on this fact 6027 ***********************************************************/ 6028 #define LEAST_PATH_ALLOC 256 6029 urllen=strlen(data->change.url); 6030 if(urllen < LEAST_PATH_ALLOC) 6031 urllen=LEAST_PATH_ALLOC; 6032 6033 /* 6034 * We malloc() the buffers below urllen+2 to make room for 2 possibilities: 6035 * 1 - an extra terminating zero 6036 * 2 - an extra slash (in case a syntax like "www.host.com?moo" is used) 6037 */ 6038 6039 Curl_safefree(data->state.pathbuffer); 6040 data->state.path = NULL; 6041 6042 data->state.pathbuffer = malloc(urllen+2); 6043 if(NULL == data->state.pathbuffer) { 6044 result = CURLE_OUT_OF_MEMORY; /* really bad error */ 6045 goto out; 6046 } 6047 data->state.path = data->state.pathbuffer; 6048 6049 conn->host.rawalloc = malloc(urllen+2); 6050 if(NULL == conn->host.rawalloc) { 6051 Curl_safefree(data->state.pathbuffer); 6052 data->state.path = NULL; 6053 result = CURLE_OUT_OF_MEMORY; 6054 goto out; 6055 } 6056 6057 conn->host.name = conn->host.rawalloc; 6058 conn->host.name[0] = 0; 6059 6060 user = strdup(""); 6061 passwd = strdup(""); 6062 options = strdup(""); 6063 if(!user || !passwd || !options) { 6064 result = CURLE_OUT_OF_MEMORY; 6065 goto out; 6066 } 6067 6068 result = parseurlandfillconn(data, conn, &prot_missing, &user, &passwd, 6069 &options); 6070 if(result) 6071 goto out; 6072 6073 /************************************************************* 6074 * No protocol part in URL was used, add it! 6075 *************************************************************/ 6076 if(prot_missing) { 6077 /* We're guessing prefixes here and if we're told to use a proxy or if 6078 we're gonna follow a Location: later or... then we need the protocol 6079 part added so that we have a valid URL. */ 6080 char *reurl; 6081 char *ch_lower; 6082 6083 reurl = aprintf("%s://%s", conn->handler->scheme, data->change.url); 6084 6085 if(!reurl) { 6086 result = CURLE_OUT_OF_MEMORY; 6087 goto out; 6088 } 6089 6090 /* Change protocol prefix to lower-case */ 6091 for(ch_lower = reurl; *ch_lower != ':'; ch_lower++) 6092 *ch_lower = (char)TOLOWER(*ch_lower); 6093 6094 if(data->change.url_alloc) { 6095 Curl_safefree(data->change.url); 6096 data->change.url_alloc = FALSE; 6097 } 6098 6099 data->change.url = reurl; 6100 data->change.url_alloc = TRUE; /* free this later */ 6101 } 6102 6103 /************************************************************* 6104 * If the protocol can't handle url query strings, then cut 6105 * off the unhandable part 6106 *************************************************************/ 6107 if((conn->given->flags&PROTOPT_NOURLQUERY)) { 6108 char *path_q_sep = strchr(conn->data->state.path, '?'); 6109 if(path_q_sep) { 6110 /* according to rfc3986, allow the query (?foo=bar) 6111 also on protocols that can't handle it. 6112 6113 cut the string-part after '?' 6114 */ 6115 6116 /* terminate the string */ 6117 path_q_sep[0] = 0; 6118 } 6119 } 6120 6121 if(data->set.str[STRING_BEARER]) { 6122 conn->oauth_bearer = strdup(data->set.str[STRING_BEARER]); 6123 if(!conn->oauth_bearer) { 6124 result = CURLE_OUT_OF_MEMORY; 6125 goto out; 6126 } 6127 } 6128 6129 #ifndef CURL_DISABLE_PROXY 6130 /************************************************************* 6131 * Extract the user and password from the authentication string 6132 *************************************************************/ 6133 if(conn->bits.proxy_user_passwd) { 6134 result = parse_proxy_auth(data, conn); 6135 if(result) 6136 goto out; 6137 } 6138 6139 /************************************************************* 6140 * Detect what (if any) proxy to use 6141 *************************************************************/ 6142 if(data->set.str[STRING_PROXY]) { 6143 proxy = strdup(data->set.str[STRING_PROXY]); 6144 /* if global proxy is set, this is it */ 6145 if(NULL == proxy) { 6146 failf(data, "memory shortage"); 6147 result = CURLE_OUT_OF_MEMORY; 6148 goto out; 6149 } 6150 } 6151 6152 if(data->set.str[STRING_SOCKS_PROXY]) { 6153 socksproxy = strdup(data->set.str[STRING_SOCKS_PROXY]); 6154 /* if global socks proxy is set, this is it */ 6155 if(NULL == socksproxy) { 6156 failf(data, "memory shortage"); 6157 result = CURLE_OUT_OF_MEMORY; 6158 goto out; 6159 } 6160 } 6161 6162 if(data->set.str[STRING_NOPROXY] && 6163 check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY])) { 6164 Curl_safefree(proxy); 6165 Curl_safefree(socksproxy); 6166 } 6167 else if(!proxy && !socksproxy) 6168 proxy = detect_proxy(conn); 6169 6170 #ifdef USE_UNIX_SOCKETS 6171 if(data->set.str[STRING_UNIX_SOCKET_PATH]) { 6172 if(proxy) { 6173 free(proxy); /* Unix domain sockets cannot be proxied, so disable it */ 6174 proxy = NULL; 6175 } 6176 conn->unix_domain_socket = strdup(data->set.str[STRING_UNIX_SOCKET_PATH]); 6177 if(conn->unix_domain_socket == NULL) { 6178 result = CURLE_OUT_OF_MEMORY; 6179 goto out; 6180 } 6181 } 6182 #endif 6183 6184 if(proxy && (!*proxy || (conn->handler->flags & PROTOPT_NONETWORK))) { 6185 free(proxy); /* Don't bother with an empty proxy string or if the 6186 protocol doesn't work with network */ 6187 proxy = NULL; 6188 } 6189 if(socksproxy && (!*socksproxy || 6190 (conn->handler->flags & PROTOPT_NONETWORK))) { 6191 free(socksproxy); /* Don't bother with an empty socks proxy string or if 6192 the protocol doesn't work with network */ 6193 socksproxy = NULL; 6194 } 6195 6196 /*********************************************************************** 6197 * If this is supposed to use a proxy, we need to figure out the proxy host 6198 * name, proxy type and port number, so that we can re-use an existing 6199 * connection that may exist registered to the same proxy host. 6200 ***********************************************************************/ 6201 if(proxy || socksproxy) { 6202 if(proxy) { 6203 result = parse_proxy(data, conn, proxy, conn->http_proxy.proxytype); 6204 Curl_safefree(proxy); /* parse_proxy copies the proxy string */ 6205 if(result) 6206 goto out; 6207 } 6208 6209 if(socksproxy) { 6210 result = parse_proxy(data, conn, socksproxy, 6211 conn->socks_proxy.proxytype); 6212 /* parse_proxy copies the socks proxy string */ 6213 Curl_safefree(socksproxy); 6214 if(result) 6215 goto out; 6216 } 6217 6218 if(conn->http_proxy.host.rawalloc) { 6219 #ifdef CURL_DISABLE_HTTP 6220 /* asking for a HTTP proxy is a bit funny when HTTP is disabled... */ 6221 result = CURLE_UNSUPPORTED_PROTOCOL; 6222 goto out; 6223 #else 6224 /* force this connection's protocol to become HTTP if not already 6225 compatible - if it isn't tunneling through */ 6226 if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) && 6227 !conn->bits.tunnel_proxy) 6228 conn->handler = &Curl_handler_http; 6229 6230 conn->bits.httpproxy = TRUE; 6231 #endif 6232 } 6233 else { 6234 conn->bits.httpproxy = FALSE; /* not a HTTP proxy */ 6235 conn->bits.tunnel_proxy = FALSE; /* no tunneling if not HTTP */ 6236 } 6237 6238 if(conn->socks_proxy.host.rawalloc) { 6239 if(!conn->http_proxy.host.rawalloc) { 6240 /* once a socks proxy */ 6241 if(!conn->socks_proxy.user) { 6242 conn->socks_proxy.user = conn->http_proxy.user; 6243 conn->http_proxy.user = NULL; 6244 Curl_safefree(conn->socks_proxy.passwd); 6245 conn->socks_proxy.passwd = conn->http_proxy.passwd; 6246 conn->http_proxy.passwd = NULL; 6247 } 6248 } 6249 conn->bits.socksproxy = TRUE; 6250 } 6251 else 6252 conn->bits.socksproxy = FALSE; /* not a socks proxy */ 6253 } 6254 else { 6255 conn->bits.socksproxy = FALSE; 6256 conn->bits.httpproxy = FALSE; 6257 } 6258 conn->bits.proxy = conn->bits.httpproxy || conn->bits.socksproxy; 6259 6260 if(!conn->bits.proxy) { 6261 /* we aren't using the proxy after all... */ 6262 conn->bits.proxy = FALSE; 6263 conn->bits.httpproxy = FALSE; 6264 conn->bits.socksproxy = FALSE; 6265 conn->bits.proxy_user_passwd = FALSE; 6266 conn->bits.tunnel_proxy = FALSE; 6267 } 6268 6269 #endif /* CURL_DISABLE_PROXY */ 6270 6271 /************************************************************* 6272 * If the protocol is using SSL and HTTP proxy is used, we set 6273 * the tunnel_proxy bit. 6274 *************************************************************/ 6275 if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy) 6276 conn->bits.tunnel_proxy = TRUE; 6277 6278 /************************************************************* 6279 * Figure out the remote port number and fix it in the URL 6280 *************************************************************/ 6281 result = parse_remote_port(data, conn); 6282 if(result) 6283 goto out; 6284 6285 /* Check for overridden login details and set them accordingly so they 6286 they are known when protocol->setup_connection is called! */ 6287 result = override_login(data, conn, &user, &passwd, &options); 6288 if(result) 6289 goto out; 6290 result = set_login(conn, user, passwd, options); 6291 if(result) 6292 goto out; 6293 6294 /************************************************************* 6295 * Process the "connect to" linked list of hostname/port mappings. 6296 * Do this after the remote port number has been fixed in the URL. 6297 *************************************************************/ 6298 result = parse_connect_to_slist(data, conn, data->set.connect_to); 6299 if(result) 6300 goto out; 6301 6302 /************************************************************* 6303 * IDN-fix the hostnames 6304 *************************************************************/ 6305 fix_hostname(conn, &conn->host); 6306 if(conn->bits.conn_to_host) 6307 fix_hostname(conn, &conn->conn_to_host); 6308 if(conn->proxy.name && *conn->proxy.name) 6309 fix_hostname(conn, &conn->proxy); 6310 6311 /************************************************************* 6312 * Check whether the host and the "connect to host" are equal. 6313 * Do this after the hostnames have been IDN-fixed . 6314 *************************************************************/ 6315 if(conn->bits.conn_to_host && 6316 strcasecompare(conn->conn_to_host.name, conn->host.name)) { 6317 conn->bits.conn_to_host = FALSE; 6318 } 6319 6320 /************************************************************* 6321 * Check whether the port and the "connect to port" are equal. 6322 * Do this after the remote port number has been fixed in the URL. 6323 *************************************************************/ 6324 if(conn->bits.conn_to_port && conn->conn_to_port == conn->remote_port) { 6325 conn->bits.conn_to_port = FALSE; 6326 } 6327 6328 /************************************************************* 6329 * If the "connect to" feature is used with an HTTP proxy, 6330 * we set the tunnel_proxy bit. 6331 *************************************************************/ 6332 if((conn->bits.conn_to_host || conn->bits.conn_to_port) && 6333 conn->bits.httpproxy) 6334 conn->bits.tunnel_proxy = TRUE; 6335 6336 /************************************************************* 6337 * Setup internals depending on protocol. Needs to be done after 6338 * we figured out what/if proxy to use. 6339 *************************************************************/ 6340 result = setup_connection_internals(conn); 6341 if(result) 6342 goto out; 6343 6344 conn->recv[FIRSTSOCKET] = Curl_recv_plain; 6345 conn->send[FIRSTSOCKET] = Curl_send_plain; 6346 conn->recv[SECONDARYSOCKET] = Curl_recv_plain; 6347 conn->send[SECONDARYSOCKET] = Curl_send_plain; 6348 6349 conn->bits.tcp_fastopen = data->set.tcp_fastopen; 6350 6351 /*********************************************************************** 6352 * file: is a special case in that it doesn't need a network connection 6353 ***********************************************************************/ 6354 #ifndef CURL_DISABLE_FILE 6355 if(conn->handler->flags & PROTOPT_NONETWORK) { 6356 bool done; 6357 /* this is supposed to be the connect function so we better at least check 6358 that the file is present here! */ 6359 DEBUGASSERT(conn->handler->connect_it); 6360 result = conn->handler->connect_it(conn, &done); 6361 6362 /* Setup a "faked" transfer that'll do nothing */ 6363 if(!result) { 6364 conn->data = data; 6365 conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; /* we are "connected */ 6366 6367 Curl_conncache_add_conn(data->state.conn_cache, conn); 6368 6369 /* 6370 * Setup whatever necessary for a resumed transfer 6371 */ 6372 result = setup_range(data); 6373 if(result) { 6374 DEBUGASSERT(conn->handler->done); 6375 /* we ignore the return code for the protocol-specific DONE */ 6376 (void)conn->handler->done(conn, result, FALSE); 6377 goto out; 6378 } 6379 6380 Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */ 6381 -1, NULL); /* no upload */ 6382 } 6383 6384 /* since we skip do_init() */ 6385 Curl_init_do(data, conn); 6386 6387 goto out; 6388 } 6389 #endif 6390 6391 /* Get a cloned copy of the SSL config situation stored in the 6392 connection struct. But to get this going nicely, we must first make 6393 sure that the strings in the master copy are pointing to the correct 6394 strings in the session handle strings array! 6395 6396 Keep in mind that the pointers in the master copy are pointing to strings 6397 that will be freed as part of the Curl_easy struct, but all cloned 6398 copies will be separately allocated. 6399 */ 6400 data->set.ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_ORIG]; 6401 data->set.proxy_ssl.primary.CApath = data->set.str[STRING_SSL_CAPATH_PROXY]; 6402 data->set.ssl.primary.CAfile = data->set.str[STRING_SSL_CAFILE_ORIG]; 6403 data->set.proxy_ssl.primary.CAfile = data->set.str[STRING_SSL_CAFILE_PROXY]; 6404 data->set.ssl.primary.random_file = data->set.str[STRING_SSL_RANDOM_FILE]; 6405 data->set.proxy_ssl.primary.random_file = 6406 data->set.str[STRING_SSL_RANDOM_FILE]; 6407 data->set.ssl.primary.egdsocket = data->set.str[STRING_SSL_EGDSOCKET]; 6408 data->set.proxy_ssl.primary.egdsocket = data->set.str[STRING_SSL_EGDSOCKET]; 6409 data->set.ssl.primary.cipher_list = 6410 data->set.str[STRING_SSL_CIPHER_LIST_ORIG]; 6411 data->set.proxy_ssl.primary.cipher_list = 6412 data->set.str[STRING_SSL_CIPHER_LIST_PROXY]; 6413 6414 data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_ORIG]; 6415 data->set.proxy_ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE_PROXY]; 6416 data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_ORIG]; 6417 data->set.proxy_ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT_PROXY]; 6418 data->set.ssl.cert = data->set.str[STRING_CERT_ORIG]; 6419 data->set.proxy_ssl.cert = data->set.str[STRING_CERT_PROXY]; 6420 data->set.ssl.cert_type = data->set.str[STRING_CERT_TYPE_ORIG]; 6421 data->set.proxy_ssl.cert_type = data->set.str[STRING_CERT_TYPE_PROXY]; 6422 data->set.ssl.key = data->set.str[STRING_KEY_ORIG]; 6423 data->set.proxy_ssl.key = data->set.str[STRING_KEY_PROXY]; 6424 data->set.ssl.key_type = data->set.str[STRING_KEY_TYPE_ORIG]; 6425 data->set.proxy_ssl.key_type = data->set.str[STRING_KEY_TYPE_PROXY]; 6426 data->set.ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_ORIG]; 6427 data->set.proxy_ssl.key_passwd = data->set.str[STRING_KEY_PASSWD_PROXY]; 6428 data->set.ssl.primary.clientcert = data->set.str[STRING_CERT_ORIG]; 6429 data->set.proxy_ssl.primary.clientcert = data->set.str[STRING_CERT_PROXY]; 6430 #ifdef USE_TLS_SRP 6431 data->set.ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_ORIG]; 6432 data->set.proxy_ssl.username = data->set.str[STRING_TLSAUTH_USERNAME_PROXY]; 6433 data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD_ORIG]; 6434 data->set.proxy_ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD_PROXY]; 6435 #endif 6436 6437 if(!Curl_clone_primary_ssl_config(&data->set.ssl.primary, 6438 &conn->ssl_config)) { 6439 result = CURLE_OUT_OF_MEMORY; 6440 goto out; 6441 } 6442 6443 if(!Curl_clone_primary_ssl_config(&data->set.proxy_ssl.primary, 6444 &conn->proxy_ssl_config)) { 6445 result = CURLE_OUT_OF_MEMORY; 6446 goto out; 6447 } 6448 6449 prune_dead_connections(data); 6450 6451 /************************************************************* 6452 * Check the current list of connections to see if we can 6453 * re-use an already existing one or if we have to create a 6454 * new one. 6455 *************************************************************/ 6456 6457 /* reuse_fresh is TRUE if we are told to use a new connection by force, but 6458 we only acknowledge this option if this is not a re-used connection 6459 already (which happens due to follow-location or during a HTTP 6460 authentication phase). */ 6461 if(data->set.reuse_fresh && !data->state.this_is_a_follow) 6462 reuse = FALSE; 6463 else 6464 reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse, &waitpipe); 6465 6466 /* If we found a reusable connection, we may still want to 6467 open a new connection if we are pipelining. */ 6468 if(reuse && !force_reuse && IsPipeliningPossible(data, conn_temp)) { 6469 size_t pipelen = conn_temp->send_pipe->size + conn_temp->recv_pipe->size; 6470 if(pipelen > 0) { 6471 infof(data, "Found connection %ld, with requests in the pipe (%zu)\n", 6472 conn_temp->connection_id, pipelen); 6473 6474 if(conn_temp->bundle->num_connections < max_host_connections && 6475 data->state.conn_cache->num_connections < max_total_connections) { 6476 /* We want a new connection anyway */ 6477 reuse = FALSE; 6478 6479 infof(data, "We can reuse, but we want a new connection anyway\n"); 6480 } 6481 } 6482 } 6483 6484 if(reuse) { 6485 /* 6486 * We already have a connection for this, we got the former connection 6487 * in the conn_temp variable and thus we need to cleanup the one we 6488 * just allocated before we can move along and use the previously 6489 * existing one. 6490 */ 6491 conn_temp->inuse = TRUE; /* mark this as being in use so that no other 6492 handle in a multi stack may nick it */ 6493 reuse_conn(conn, conn_temp); 6494 free(conn); /* we don't need this anymore */ 6495 conn = conn_temp; 6496 *in_connect = conn; 6497 6498 infof(data, "Re-using existing connection! (#%ld) with %s %s\n", 6499 conn->connection_id, 6500 conn->bits.proxy?"proxy":"host", 6501 conn->socks_proxy.host.name ? conn->socks_proxy.host.dispname : 6502 conn->http_proxy.host.name ? conn->http_proxy.host.dispname : 6503 conn->host.dispname); 6504 } 6505 else { 6506 /* We have decided that we want a new connection. However, we may not 6507 be able to do that if we have reached the limit of how many 6508 connections we are allowed to open. */ 6509 struct connectbundle *bundle = NULL; 6510 6511 if(conn->handler->flags & PROTOPT_ALPN_NPN) { 6512 /* The protocol wants it, so set the bits if enabled in the easy handle 6513 (default) */ 6514 if(data->set.ssl_enable_alpn) 6515 conn->bits.tls_enable_alpn = TRUE; 6516 if(data->set.ssl_enable_npn) 6517 conn->bits.tls_enable_npn = TRUE; 6518 } 6519 6520 if(waitpipe) 6521 /* There is a connection that *might* become usable for pipelining 6522 "soon", and we wait for that */ 6523 connections_available = FALSE; 6524 else 6525 bundle = Curl_conncache_find_bundle(conn, data->state.conn_cache); 6526 6527 if(max_host_connections > 0 && bundle && 6528 (bundle->num_connections >= max_host_connections)) { 6529 struct connectdata *conn_candidate; 6530 6531 /* The bundle is full. Let's see if we can kill a connection. */ 6532 conn_candidate = find_oldest_idle_connection_in_bundle(data, bundle); 6533 6534 if(conn_candidate) { 6535 /* Set the connection's owner correctly, then kill it */ 6536 conn_candidate->data = data; 6537 (void)Curl_disconnect(conn_candidate, /* dead_connection */ FALSE); 6538 } 6539 else { 6540 infof(data, "No more connections allowed to host: %d\n", 6541 max_host_connections); 6542 connections_available = FALSE; 6543 } 6544 } 6545 6546 if(connections_available && 6547 (max_total_connections > 0) && 6548 (data->state.conn_cache->num_connections >= max_total_connections)) { 6549 struct connectdata *conn_candidate; 6550 6551 /* The cache is full. Let's see if we can kill a connection. */ 6552 conn_candidate = Curl_oldest_idle_connection(data); 6553 6554 if(conn_candidate) { 6555 /* Set the connection's owner correctly, then kill it */ 6556 conn_candidate->data = data; 6557 (void)Curl_disconnect(conn_candidate, /* dead_connection */ FALSE); 6558 } 6559 else { 6560 infof(data, "No connections available in cache\n"); 6561 connections_available = FALSE; 6562 } 6563 } 6564 6565 if(!connections_available) { 6566 infof(data, "No connections available.\n"); 6567 6568 conn_free(conn); 6569 *in_connect = NULL; 6570 6571 result = CURLE_NO_CONNECTION_AVAILABLE; 6572 goto out; 6573 } 6574 else { 6575 /* 6576 * This is a brand new connection, so let's store it in the connection 6577 * cache of ours! 6578 */ 6579 Curl_conncache_add_conn(data->state.conn_cache, conn); 6580 } 6581 6582 #if defined(USE_NTLM) 6583 /* If NTLM is requested in a part of this connection, make sure we don't 6584 assume the state is fine as this is a fresh connection and NTLM is 6585 connection based. */ 6586 if((data->state.authhost.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && 6587 data->state.authhost.done) { 6588 infof(data, "NTLM picked AND auth done set, clear picked!\n"); 6589 data->state.authhost.picked = CURLAUTH_NONE; 6590 data->state.authhost.done = FALSE; 6591 } 6592 6593 if((data->state.authproxy.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) && 6594 data->state.authproxy.done) { 6595 infof(data, "NTLM-proxy picked AND auth done set, clear picked!\n"); 6596 data->state.authproxy.picked = CURLAUTH_NONE; 6597 data->state.authproxy.done = FALSE; 6598 } 6599 #endif 6600 } 6601 6602 /* Mark the connection as used */ 6603 conn->inuse = TRUE; 6604 6605 /* Setup and init stuff before DO starts, in preparing for the transfer. */ 6606 Curl_init_do(data, conn); 6607 6608 /* 6609 * Setup whatever necessary for a resumed transfer 6610 */ 6611 result = setup_range(data); 6612 if(result) 6613 goto out; 6614 6615 /* Continue connectdata initialization here. */ 6616 6617 /* 6618 * Inherit the proper values from the urldata struct AFTER we have arranged 6619 * the persistent connection stuff 6620 */ 6621 conn->seek_func = data->set.seek_func; 6622 conn->seek_client = data->set.seek_client; 6623 6624 /************************************************************* 6625 * Resolve the address of the server or proxy 6626 *************************************************************/ 6627 result = resolve_server(data, conn, async); 6628 6629 out: 6630 6631 free(options); 6632 free(passwd); 6633 free(user); 6634 free(socksproxy); 6635 free(proxy); 6636 return result; 6637 } 6638 6639 /* Curl_setup_conn() is called after the name resolve initiated in 6640 * create_conn() is all done. 6641 * 6642 * Curl_setup_conn() also handles reused connections 6643 * 6644 * conn->data MUST already have been setup fine (in create_conn) 6645 */ 6646 6647 CURLcode Curl_setup_conn(struct connectdata *conn, 6648 bool *protocol_done) 6649 { 6650 CURLcode result = CURLE_OK; 6651 struct Curl_easy *data = conn->data; 6652 6653 Curl_pgrsTime(data, TIMER_NAMELOOKUP); 6654 6655 if(conn->handler->flags & PROTOPT_NONETWORK) { 6656 /* nothing to setup when not using a network */ 6657 *protocol_done = TRUE; 6658 return result; 6659 } 6660 *protocol_done = FALSE; /* default to not done */ 6661 6662 /* set proxy_connect_closed to false unconditionally already here since it 6663 is used strictly to provide extra information to a parent function in the 6664 case of proxy CONNECT failures and we must make sure we don't have it 6665 lingering set from a previous invoke */ 6666 conn->bits.proxy_connect_closed = FALSE; 6667 6668 /* 6669 * Set user-agent. Used for HTTP, but since we can attempt to tunnel 6670 * basically anything through a http proxy we can't limit this based on 6671 * protocol. 6672 */ 6673 if(data->set.str[STRING_USERAGENT]) { 6674 Curl_safefree(conn->allocptr.uagent); 6675 conn->allocptr.uagent = 6676 aprintf("User-Agent: %s\r\n", data->set.str[STRING_USERAGENT]); 6677 if(!conn->allocptr.uagent) 6678 return CURLE_OUT_OF_MEMORY; 6679 } 6680 6681 data->req.headerbytecount = 0; 6682 6683 #ifdef CURL_DO_LINEEND_CONV 6684 data->state.crlf_conversions = 0; /* reset CRLF conversion counter */ 6685 #endif /* CURL_DO_LINEEND_CONV */ 6686 6687 /* set start time here for timeout purposes in the connect procedure, it 6688 is later set again for the progress meter purpose */ 6689 conn->now = Curl_tvnow(); 6690 6691 if(CURL_SOCKET_BAD == conn->sock[FIRSTSOCKET]) { 6692 conn->bits.tcpconnect[FIRSTSOCKET] = FALSE; 6693 result = Curl_connecthost(conn, conn->dns_entry); 6694 if(result) 6695 return result; 6696 } 6697 else { 6698 Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */ 6699 Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */ 6700 conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; 6701 *protocol_done = TRUE; 6702 Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]); 6703 Curl_verboseconnect(conn); 6704 } 6705 6706 conn->now = Curl_tvnow(); /* time this *after* the connect is done, we 6707 set this here perhaps a second time */ 6708 6709 #ifdef __EMX__ 6710 /* 6711 * This check is quite a hack. We're calling _fsetmode to fix the problem 6712 * with fwrite converting newline characters (you get mangled text files, 6713 * and corrupted binary files when you download to stdout and redirect it to 6714 * a file). 6715 */ 6716 6717 if((data->set.out)->_handle == NULL) { 6718 _fsetmode(stdout, "b"); 6719 } 6720 #endif 6721 6722 return result; 6723 } 6724 6725 CURLcode Curl_connect(struct Curl_easy *data, 6726 struct connectdata **in_connect, 6727 bool *asyncp, 6728 bool *protocol_done) 6729 { 6730 CURLcode result; 6731 6732 *asyncp = FALSE; /* assume synchronous resolves by default */ 6733 6734 /* call the stuff that needs to be called */ 6735 result = create_conn(data, in_connect, asyncp); 6736 6737 if(!result) { 6738 /* no error */ 6739 if((*in_connect)->send_pipe->size || (*in_connect)->recv_pipe->size) 6740 /* pipelining */ 6741 *protocol_done = TRUE; 6742 else if(!*asyncp) { 6743 /* DNS resolution is done: that's either because this is a reused 6744 connection, in which case DNS was unnecessary, or because DNS 6745 really did finish already (synch resolver/fast async resolve) */ 6746 result = Curl_setup_conn(*in_connect, protocol_done); 6747 } 6748 } 6749 6750 if(result == CURLE_NO_CONNECTION_AVAILABLE) { 6751 *in_connect = NULL; 6752 return result; 6753 } 6754 6755 if(result && *in_connect) { 6756 /* We're not allowed to return failure with memory left allocated 6757 in the connectdata struct, free those here */ 6758 Curl_disconnect(*in_connect, FALSE); /* close the connection */ 6759 *in_connect = NULL; /* return a NULL */ 6760 } 6761 6762 return result; 6763 } 6764 6765 /* 6766 * Curl_init_do() inits the readwrite session. This is inited each time (in 6767 * the DO function before the protocol-specific DO functions are invoked) for 6768 * a transfer, sometimes multiple times on the same Curl_easy. Make sure 6769 * nothing in here depends on stuff that are setup dynamically for the 6770 * transfer. 6771 * 6772 * Allow this function to get called with 'conn' set to NULL. 6773 */ 6774 6775 CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn) 6776 { 6777 struct SingleRequest *k = &data->req; 6778 6779 if(conn) 6780 conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to 6781 * use */ 6782 6783 data->state.done = FALSE; /* *_done() is not called yet */ 6784 data->state.expect100header = FALSE; 6785 6786 if(data->set.opt_no_body) 6787 /* in HTTP lingo, no body means using the HEAD request... */ 6788 data->set.httpreq = HTTPREQ_HEAD; 6789 else if(HTTPREQ_HEAD == data->set.httpreq) 6790 /* ... but if unset there really is no perfect method that is the 6791 "opposite" of HEAD but in reality most people probably think GET 6792 then. The important thing is that we can't let it remain HEAD if the 6793 opt_no_body is set FALSE since then we'll behave wrong when getting 6794 HTTP. */ 6795 data->set.httpreq = HTTPREQ_GET; 6796 6797 k->start = Curl_tvnow(); /* start time */ 6798 k->now = k->start; /* current time is now */ 6799 k->header = TRUE; /* assume header */ 6800 6801 k->bytecount = 0; 6802 6803 k->buf = data->state.buffer; 6804 k->uploadbuf = data->state.uploadbuffer; 6805 k->hbufp = data->state.headerbuff; 6806 k->ignorebody=FALSE; 6807 6808 Curl_speedinit(data); 6809 6810 Curl_pgrsSetUploadCounter(data, 0); 6811 Curl_pgrsSetDownloadCounter(data, 0); 6812 6813 return CURLE_OK; 6814 } 6815 6816 /* 6817 * get_protocol_family() 6818 * 6819 * This is used to return the protocol family for a given protocol. 6820 * 6821 * Parameters: 6822 * 6823 * protocol [in] - A single bit protocol identifier such as HTTP or HTTPS. 6824 * 6825 * Returns the family as a single bit protocol identifier. 6826 */ 6827 6828 unsigned int get_protocol_family(unsigned int protocol) 6829 { 6830 unsigned int family; 6831 6832 switch(protocol) { 6833 case CURLPROTO_HTTP: 6834 case CURLPROTO_HTTPS: 6835 family = CURLPROTO_HTTP; 6836 break; 6837 6838 case CURLPROTO_FTP: 6839 case CURLPROTO_FTPS: 6840 family = CURLPROTO_FTP; 6841 break; 6842 6843 case CURLPROTO_SCP: 6844 family = CURLPROTO_SCP; 6845 break; 6846 6847 case CURLPROTO_SFTP: 6848 family = CURLPROTO_SFTP; 6849 break; 6850 6851 case CURLPROTO_TELNET: 6852 family = CURLPROTO_TELNET; 6853 break; 6854 6855 case CURLPROTO_LDAP: 6856 case CURLPROTO_LDAPS: 6857 family = CURLPROTO_LDAP; 6858 break; 6859 6860 case CURLPROTO_DICT: 6861 family = CURLPROTO_DICT; 6862 break; 6863 6864 case CURLPROTO_FILE: 6865 family = CURLPROTO_FILE; 6866 break; 6867 6868 case CURLPROTO_TFTP: 6869 family = CURLPROTO_TFTP; 6870 break; 6871 6872 case CURLPROTO_IMAP: 6873 case CURLPROTO_IMAPS: 6874 family = CURLPROTO_IMAP; 6875 break; 6876 6877 case CURLPROTO_POP3: 6878 case CURLPROTO_POP3S: 6879 family = CURLPROTO_POP3; 6880 break; 6881 6882 case CURLPROTO_SMTP: 6883 case CURLPROTO_SMTPS: 6884 family = CURLPROTO_SMTP; 6885 break; 6886 6887 case CURLPROTO_RTSP: 6888 family = CURLPROTO_RTSP; 6889 break; 6890 6891 case CURLPROTO_RTMP: 6892 case CURLPROTO_RTMPS: 6893 family = CURLPROTO_RTMP; 6894 break; 6895 6896 case CURLPROTO_RTMPT: 6897 case CURLPROTO_RTMPTS: 6898 family = CURLPROTO_RTMPT; 6899 break; 6900 6901 case CURLPROTO_RTMPE: 6902 family = CURLPROTO_RTMPE; 6903 break; 6904 6905 case CURLPROTO_RTMPTE: 6906 family = CURLPROTO_RTMPTE; 6907 break; 6908 6909 case CURLPROTO_GOPHER: 6910 family = CURLPROTO_GOPHER; 6911 break; 6912 6913 case CURLPROTO_SMB: 6914 case CURLPROTO_SMBS: 6915 family = CURLPROTO_SMB; 6916 break; 6917 6918 default: 6919 family = 0; 6920 break; 6921 } 6922 6923 return family; 6924 } 6925