1
/***************************************************************************
3
* Project ___| | | | _ \| |
5
* | (__| |_| | _ <| |___
6
* \___|\___/|_| \_\_____|
8
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
10
* This software is licensed as described in the file COPYING, which
11
* you should have received as part of this distribution. The terms
12
* are also available at http://curl.haxx.se/docs/copyright.html.
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.
18
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19
* KIND, either express or implied.
21
***************************************************************************/
23
#include "curl_setup.h"
25
#ifdef HAVE_NETINET_IN_H
26
#include <netinet/in.h>
31
#ifdef HAVE_ARPA_INET_H
32
#include <arpa/inet.h>
37
#ifdef HAVE_SYS_IOCTL_H
38
#include <sys/ioctl.h>
41
#ifdef HAVE_SYS_PARAM_H
42
#include <sys/param.h>
51
#error "We can't compile without socket() support!"
61
#include <stringprep.h>
62
#ifdef HAVE_IDN_FREE_H
65
/* prototype from idn-free.h, not provided by libidn 0.4.5's make install! */
66
void idn_free (void *ptr);
69
/* if idn_free() was not found in this version of libidn use free() instead */
70
#define idn_free(x) (free)(x)
72
#elif defined(USE_WIN32_IDN)
73
/* prototype for curl_win32_idn_to_ascii() */
74
int curl_win32_idn_to_ascii(const char *in, char **out);
75
#endif /* USE_LIBIDN */
81
#include "vtls/vtls.h"
92
#include "content_encoding.h"
93
#include "http_digest.h"
94
#include "http_negotiate.h"
98
#include "speedcheck.h"
100
#include "warnless.h"
101
#include "non-ascii.h"
102
#include "inet_pton.h"
104
/* And now for the protocols */
111
#include "curl_ldap.h"
116
#include "inet_ntop.h"
117
#include "curl_ntlm.h"
118
#include "curl_ntlm_wb.h"
120
#include "curl_rtmp.h"
122
#include "http_proxy.h"
124
#include "conncache.h"
125
#include "multihandle.h"
126
#include "pipeline.h"
130
#define _MPRINTF_REPLACE /* use our functions only */
131
#include <curl/mprintf.h>
133
#include "curl_memory.h"
134
/* The last #include file should be: */
135
#include "memdebug.h"
137
/* Local static prototypes */
138
static struct connectdata *
139
find_oldest_idle_connection(struct SessionHandle *data);
140
static struct connectdata *
141
find_oldest_idle_connection_in_bundle(struct SessionHandle *data,
142
struct connectbundle *bundle);
143
static void conn_free(struct connectdata *conn);
144
static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke);
145
static CURLcode do_init(struct connectdata *conn);
146
static CURLcode parse_url_login(struct SessionHandle *data,
147
struct connectdata *conn,
148
char **userptr, char **passwdptr,
150
static CURLcode parse_login_details(const char *login, const size_t len,
151
char **userptr, char **passwdptr,
157
static const struct Curl_handler * const protocols[] = {
159
#ifndef CURL_DISABLE_HTTP
163
#if defined(USE_SSL) && !defined(CURL_DISABLE_HTTP)
167
#ifndef CURL_DISABLE_FTP
171
#if defined(USE_SSL) && !defined(CURL_DISABLE_FTP)
175
#ifndef CURL_DISABLE_TELNET
176
&Curl_handler_telnet,
179
#ifndef CURL_DISABLE_DICT
183
#ifndef CURL_DISABLE_LDAP
185
#if !defined(CURL_DISABLE_LDAPS) && \
186
((defined(USE_OPENLDAP) && defined(USE_SSL)) || \
187
(!defined(USE_OPENLDAP) && defined(HAVE_LDAP_SSL)))
192
#ifndef CURL_DISABLE_FILE
196
#ifndef CURL_DISABLE_TFTP
205
#ifndef CURL_DISABLE_IMAP
212
#ifndef CURL_DISABLE_POP3
219
#ifndef CURL_DISABLE_SMTP
226
#ifndef CURL_DISABLE_RTSP
230
#ifndef CURL_DISABLE_GOPHER
231
&Curl_handler_gopher,
238
&Curl_handler_rtmpte,
240
&Curl_handler_rtmpts,
243
(struct Curl_handler *) NULL
247
* Dummy handler for undefined protocol schemes.
250
static const struct Curl_handler Curl_handler_dummy = {
251
"<no protocol>", /* scheme */
252
ZERO_NULL, /* setup_connection */
253
ZERO_NULL, /* do_it */
254
ZERO_NULL, /* done */
255
ZERO_NULL, /* do_more */
256
ZERO_NULL, /* connect_it */
257
ZERO_NULL, /* connecting */
258
ZERO_NULL, /* doing */
259
ZERO_NULL, /* proto_getsock */
260
ZERO_NULL, /* doing_getsock */
261
ZERO_NULL, /* domore_getsock */
262
ZERO_NULL, /* perform_getsock */
263
ZERO_NULL, /* disconnect */
264
ZERO_NULL, /* readwrite */
267
PROTOPT_NONE /* flags */
270
void Curl_freeset(struct SessionHandle *data)
272
/* Free all dynamic strings stored in the data->set substructure. */
274
for(i=(enum dupstring)0; i < STRING_LAST; i++) {
275
Curl_safefree(data->set.str[i]);
278
if(data->change.referer_alloc) {
279
Curl_safefree(data->change.referer);
280
data->change.referer_alloc = FALSE;
282
data->change.referer = NULL;
283
if(data->change.url_alloc) {
284
Curl_safefree(data->change.url);
285
data->change.url_alloc = FALSE;
287
data->change.url = NULL;
290
static CURLcode setstropt(char **charp, char *s)
292
/* Release the previous storage at `charp' and replace by a dynamic storage
293
copy of `s'. Return CURLE_OK or CURLE_OUT_OF_MEMORY. */
295
Curl_safefree(*charp);
301
return CURLE_OUT_OF_MEMORY;
309
static CURLcode setstropt_userpwd(char *option, char **userp, char **passwdp)
311
CURLcode result = CURLE_OK;
315
/* Parse the login details if specified. It not then we treat NULL as a hint
316
to clear the existing data */
318
result = parse_login_details(option, strlen(option),
319
(userp ? &user : NULL),
320
(passwdp ? &passwd : NULL),
325
/* Store the username part of option if required */
327
if(!user && option && option[0] == ':') {
328
/* Allocate an empty string instead of returning NULL as user name */
331
result = CURLE_OUT_OF_MEMORY;
334
Curl_safefree(*userp);
338
/* Store the password part of option if required */
340
Curl_safefree(*passwdp);
348
CURLcode Curl_dupset(struct SessionHandle *dst, struct SessionHandle *src)
350
CURLcode r = CURLE_OK;
353
/* Copy src->set into dst->set first, then deal with the strings
357
/* clear all string pointers first */
358
memset(dst->set.str, 0, STRING_LAST * sizeof(char *));
360
/* duplicate all strings */
361
for(i=(enum dupstring)0; i< STRING_LASTZEROTERMINATED; i++) {
362
r = setstropt(&dst->set.str[i], src->set.str[i]);
367
/* duplicate memory areas pointed to */
368
i = STRING_COPYPOSTFIELDS;
369
if(src->set.postfieldsize && src->set.str[i]) {
370
/* postfieldsize is curl_off_t, Curl_memdup() takes a size_t ... */
371
dst->set.str[i] = Curl_memdup(src->set.str[i], src->set.postfieldsize);
373
return CURLE_OUT_OF_MEMORY;
374
/* point to the new copy */
375
dst->set.postfields = dst->set.str[i];
382
* This is the internal function curl_easy_cleanup() calls. This should
383
* cleanup and free all resources associated with this sessionhandle.
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.
390
CURLcode Curl_close(struct SessionHandle *data)
392
struct Curl_multi *m;
397
Curl_expire(data, 0); /* shut off timers */
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);
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);
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
414
if(data->state.timeoutlist) {
415
Curl_llist_destroy(data->state.timeoutlist, NULL);
416
data->state.timeoutlist = NULL;
419
data->magic = 0; /* force a clear AFTER the possibly enforced removal from
420
the multi handle, since that function uses the magic
423
if(data->state.rangestringalloc)
424
free(data->state.range);
426
/* Free the pathbuffer */
427
Curl_safefree(data->state.pathbuffer);
428
data->state.path = NULL;
430
/* freed here just in case DONE wasn't called */
431
Curl_free_request_state(data);
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);
439
/* Cleanup possible redirect junk */
440
if(data->req.newurl) {
441
free(data->req.newurl);
442
data->req.newurl = NULL;
445
if(data->change.referer_alloc) {
446
Curl_safefree(data->change.referer);
447
data->change.referer_alloc = FALSE;
449
data->change.referer = NULL;
451
if(data->change.url_alloc) {
452
Curl_safefree(data->change.url);
453
data->change.url_alloc = FALSE;
455
data->change.url = NULL;
457
Curl_safefree(data->state.headerbuff);
459
Curl_flush_cookies(data, 1);
461
Curl_digest_cleanup(data);
463
Curl_safefree(data->info.contenttype);
464
Curl_safefree(data->info.wouldredirect);
466
/* this destroys the channel and we cannot use it anymore after this */
467
Curl_resolver_cleanup(data->state.resolver);
469
Curl_convert_close(data);
471
/* No longer a dirty share, if it exists */
473
Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
474
data->share->dirty--;
475
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
484
* Initialize the UserDefined fields within a SessionHandle.
485
* This may be safely called on a new or existing SessionHandle.
487
CURLcode Curl_init_userdefined(struct UserDefined *set)
489
CURLcode res = CURLE_OK;
491
set->out = stdout; /* default output to stdout */
492
set->in = stdin; /* default input from stdin */
493
set->err = stderr; /* default stderr to stderr */
495
/* use fwrite as default function to store output */
496
set->fwrite_func = (curl_write_callback)fwrite;
498
/* use fread as default function to read input */
499
set->fread_func = (curl_read_callback)fread;
500
set->is_fread_set = 0;
501
set->is_fwrite_set = 0;
503
set->seek_func = ZERO_NULL;
504
set->seek_client = ZERO_NULL;
506
/* conversion callbacks for non-ASCII hosts */
507
set->convfromnetwork = ZERO_NULL;
508
set->convtonetwork = ZERO_NULL;
509
set->convfromutf8 = ZERO_NULL;
511
set->filesize = -1; /* we don't know the size */
512
set->postfieldsize = -1; /* unknown size */
513
set->maxredirs = -1; /* allow any amount by default */
515
set->httpreq = HTTPREQ_GET; /* Default HTTP request */
516
set->rtspreq = RTSPREQ_OPTIONS; /* Default RTSP request */
517
set->ftp_use_epsv = TRUE; /* FTP defaults to EPSV operations */
518
set->ftp_use_eprt = TRUE; /* FTP defaults to EPRT operations */
519
set->ftp_use_pret = FALSE; /* mainly useful for drftpd servers */
520
set->ftp_filemethod = FTPFILE_MULTICWD;
522
set->dns_cache_timeout = 60; /* Timeout every 60 seconds by default */
524
/* Set the default size of the SSL session ID cache */
525
set->ssl.max_ssl_sessions = 5;
527
set->proxyport = CURL_DEFAULT_PROXY_PORT; /* from url.h */
528
set->proxytype = CURLPROXY_HTTP; /* defaults to HTTP proxy */
529
set->httpauth = CURLAUTH_BASIC; /* defaults to basic */
530
set->proxyauth = CURLAUTH_BASIC; /* defaults to basic */
532
/* make libcurl quiet by default: */
533
set->hide_progress = TRUE; /* CURLOPT_NOPROGRESS changes these */
536
* libcurl 7.10 introduced SSL verification *by default*! This needs to be
537
* switched off unless wanted.
539
set->ssl.verifypeer = TRUE;
540
set->ssl.verifyhost = TRUE;
542
set->ssl.authtype = CURL_TLSAUTH_NONE;
544
set->ssh_auth_types = CURLSSH_AUTH_DEFAULT; /* defaults to any auth
546
set->ssl.sessionid = TRUE; /* session ID caching enabled by default */
548
set->new_file_perms = 0644; /* Default permissions */
549
set->new_directory_perms = 0755; /* Default permissions */
551
/* for the *protocols fields we don't use the CURLPROTO_ALL convenience
552
define since we internally only use the lower 16 bits for the passed
553
in bitmask to not conflict with the private bits */
554
set->allowed_protocols = CURLPROTO_ALL;
555
set->redir_protocols =
556
CURLPROTO_ALL & ~(CURLPROTO_FILE|CURLPROTO_SCP); /* not FILE or SCP */
558
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
560
* disallow unprotected protection negotiation NEC reference implementation
561
* seem not to follow rfc1961 section 4.3/4.4
563
set->socks5_gssapi_nec = FALSE;
564
/* set default GSS-API service name */
565
res = setstropt(&set->str[STRING_SOCKS5_GSSAPI_SERVICE],
566
(char *) CURL_DEFAULT_SOCKS5_GSSAPI_SERVICE);
571
/* This is our preferred CA cert bundle/path since install time */
572
#if defined(CURL_CA_BUNDLE)
573
res = setstropt(&set->str[STRING_SSL_CAFILE], (char *) CURL_CA_BUNDLE);
574
#elif defined(CURL_CA_PATH)
575
res = setstropt(&set->str[STRING_SSL_CAPATH], (char *) CURL_CA_PATH);
578
set->wildcardmatch = FALSE;
579
set->chunk_bgn = ZERO_NULL;
580
set->chunk_end = ZERO_NULL;
582
/* tcp keepalives are disabled by default, but provide reasonable values for
583
* the interval and idle times.
585
set->tcp_keepalive = FALSE;
586
set->tcp_keepintvl = 60;
587
set->tcp_keepidle = 60;
589
set->ssl_enable_npn = TRUE;
590
set->ssl_enable_alpn = TRUE;
592
set->expect_100_timeout = 1000L; /* Wait for a second by default. */
599
* @param curl is a pointer to a sessionhandle pointer that gets set by this
604
CURLcode Curl_open(struct SessionHandle **curl)
606
CURLcode res = CURLE_OK;
607
struct SessionHandle *data;
610
/* Very simple start-up: alloc the struct, init it with zeroes and return */
611
data = calloc(1, sizeof(struct SessionHandle));
613
/* this is a very serious error */
614
DEBUGF(fprintf(stderr, "Error: calloc of SessionHandle failed\n"));
615
return CURLE_OUT_OF_MEMORY;
618
data->magic = CURLEASY_MAGIC_NUMBER;
620
status = Curl_resolver_init(&data->state.resolver);
622
DEBUGF(fprintf(stderr, "Error: resolver_init failed\n"));
627
/* We do some initial setup here, all those fields that can't be just 0 */
629
data->state.headerbuff = malloc(HEADERSIZE);
630
if(!data->state.headerbuff) {
631
DEBUGF(fprintf(stderr, "Error: malloc of headerbuff failed\n"));
632
res = CURLE_OUT_OF_MEMORY;
635
res = Curl_init_userdefined(&data->set);
637
data->state.headersize=HEADERSIZE;
639
Curl_convert_init(data);
641
/* most recent connection is not yet defined */
642
data->state.lastconnect = NULL;
644
data->progress.flags |= PGRS_HIDE;
645
data->state.current_speed = -1; /* init to negative == impossible */
647
data->wildcard.state = CURLWC_INIT;
648
data->wildcard.filelist = NULL;
649
data->set.fnmatch = ZERO_NULL;
650
data->set.maxconnects = DEFAULT_CONNCACHE_SIZE; /* for easy handles */
654
Curl_resolver_cleanup(data->state.resolver);
655
if(data->state.headerbuff)
656
free(data->state.headerbuff);
667
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,
671
CURLcode result = CURLE_OK;
673
#ifndef CURL_DISABLE_HTTP
678
case CURLOPT_DNS_CACHE_TIMEOUT:
679
data->set.dns_cache_timeout = va_arg(param, long);
681
case CURLOPT_DNS_USE_GLOBAL_CACHE:
682
/* remember we want this enabled */
683
arg = va_arg(param, long);
684
data->set.global_dns_cache = (0 != arg)?TRUE:FALSE;
686
case CURLOPT_SSL_CIPHER_LIST:
687
/* set a list of cipher we want to use in the SSL connection */
688
result = setstropt(&data->set.str[STRING_SSL_CIPHER_LIST],
689
va_arg(param, char *));
692
case CURLOPT_RANDOM_FILE:
694
* This is the path name to a file that contains random data to seed
695
* the random SSL stuff with. The file is only used for reading.
697
result = setstropt(&data->set.str[STRING_SSL_RANDOM_FILE],
698
va_arg(param, char *));
700
case CURLOPT_EGDSOCKET:
702
* The Entropy Gathering Daemon socket pathname
704
result = setstropt(&data->set.str[STRING_SSL_EGDSOCKET],
705
va_arg(param, char *));
707
case CURLOPT_MAXCONNECTS:
709
* Set the absolute number of maximum simultaneous alive connection that
710
* libcurl is allowed to have.
712
data->set.maxconnects = va_arg(param, long);
714
case CURLOPT_FORBID_REUSE:
716
* When this transfer is done, it must not be left to be reused by a
717
* subsequent transfer but shall be closed immediately.
719
data->set.reuse_forbid = (0 != va_arg(param, long))?TRUE:FALSE;
721
case CURLOPT_FRESH_CONNECT:
723
* This transfer shall not use a previously cached connection but
724
* should be made with a fresh new connect!
726
data->set.reuse_fresh = (0 != va_arg(param, long))?TRUE:FALSE;
728
case CURLOPT_VERBOSE:
730
* Verbose means infof() calls that give a lot of information about
731
* the connection and transfer procedures as well as internal choices.
733
data->set.verbose = (0 != va_arg(param, long))?TRUE:FALSE;
737
* Set to include the header in the general data output stream.
739
data->set.include_header = (0 != va_arg(param, long))?TRUE:FALSE;
741
case CURLOPT_NOPROGRESS:
743
* Shut off the internal supported progress meter
745
data->set.hide_progress = (0 != va_arg(param, long))?TRUE:FALSE;
746
if(data->set.hide_progress)
747
data->progress.flags |= PGRS_HIDE;
749
data->progress.flags &= ~PGRS_HIDE;
753
* Do not include the body part in the output data stream.
755
data->set.opt_no_body = (0 != va_arg(param, long))?TRUE:FALSE;
757
case CURLOPT_FAILONERROR:
759
* Don't output the >=300 error code HTML-page, but instead only
762
data->set.http_fail_on_error = (0 != va_arg(param, long))?TRUE:FALSE;
767
* We want to sent data to the remote host. If this is HTTP, that equals
768
* using the PUT request.
770
data->set.upload = (0 != va_arg(param, long))?TRUE:FALSE;
771
if(data->set.upload) {
772
/* If this is HTTP, PUT is what's needed to "upload" */
773
data->set.httpreq = HTTPREQ_PUT;
774
data->set.opt_no_body = FALSE; /* this is implied */
777
/* In HTTP, the opposite of upload is GET (unless NOBODY is true as
778
then this can be changed to HEAD later on) */
779
data->set.httpreq = HTTPREQ_GET;
781
case CURLOPT_FILETIME:
783
* Try to get the file time of the remote document. The time will
784
* later (possibly) become available using curl_easy_getinfo().
786
data->set.get_filetime = (0 != va_arg(param, long))?TRUE:FALSE;
788
case CURLOPT_FTP_CREATE_MISSING_DIRS:
790
* An FTP option that modifies an upload to create missing directories on
793
switch(va_arg(param, long)) {
795
data->set.ftp_create_missing_dirs = 0;
798
data->set.ftp_create_missing_dirs = 1;
801
data->set.ftp_create_missing_dirs = 2;
804
/* reserve other values for future use */
805
result = CURLE_UNKNOWN_OPTION;
809
case CURLOPT_SERVER_RESPONSE_TIMEOUT:
811
* Option that specifies how quickly an server response must be obtained
812
* before it is considered failure. For pingpong protocols.
814
data->set.server_response_timeout = va_arg( param , long ) * 1000;
816
case CURLOPT_TFTP_BLKSIZE:
818
* TFTP option that specifies the block size to use for data transmission
820
data->set.tftp_blksize = va_arg(param, long);
822
case CURLOPT_DIRLISTONLY:
824
* An option that changes the command to one that asks for a list
825
* only, no file info details.
827
data->set.ftp_list_only = (0 != va_arg(param, long))?TRUE:FALSE;
831
* We want to upload and append to an existing file.
833
data->set.ftp_append = (0 != va_arg(param, long))?TRUE:FALSE;
835
case CURLOPT_FTP_FILEMETHOD:
837
* How do access files over FTP.
839
data->set.ftp_filemethod = (curl_ftpfile)va_arg(param, long);
843
* Parse the $HOME/.netrc file
845
data->set.use_netrc = (enum CURL_NETRC_OPTION)va_arg(param, long);
847
case CURLOPT_NETRC_FILE:
849
* Use this file instead of the $HOME/.netrc file
851
result = setstropt(&data->set.str[STRING_NETRC_FILE],
852
va_arg(param, char *));
854
case CURLOPT_TRANSFERTEXT:
856
* This option was previously named 'FTPASCII'. Renamed to work with
857
* more protocols than merely FTP.
859
* Transfer using ASCII (instead of BINARY).
861
data->set.prefer_ascii = (0 != va_arg(param, long))?TRUE:FALSE;
863
case CURLOPT_TIMECONDITION:
865
* Set HTTP time condition. This must be one of the defines in the
866
* curl/curl.h header file.
868
data->set.timecondition = (curl_TimeCond)va_arg(param, long);
870
case CURLOPT_TIMEVALUE:
872
* This is the value to compare with the remote document with the
873
* method set with CURLOPT_TIMECONDITION
875
data->set.timevalue = (time_t)va_arg(param, long);
877
case CURLOPT_SSLVERSION:
879
* Set explicit SSL version to try to connect with, as some SSL
880
* implementations are lame.
882
data->set.ssl.version = va_arg(param, long);
885
#ifndef CURL_DISABLE_HTTP
886
case CURLOPT_AUTOREFERER:
888
* Switch on automatic referer that gets set if curl follows locations.
890
data->set.http_auto_referer = (0 != va_arg(param, long))?TRUE:FALSE;
893
case CURLOPT_ACCEPT_ENCODING:
895
* String to use at the value of Accept-Encoding header.
897
* If the encoding is set to "" we use an Accept-Encoding header that
898
* encompasses all the encodings we support.
899
* If the encoding is set to NULL we don't send an Accept-Encoding header
900
* and ignore an received Content-Encoding header.
903
argptr = va_arg(param, char *);
904
result = setstropt(&data->set.str[STRING_ENCODING],
905
(argptr && !*argptr)?
906
(char *) ALL_CONTENT_ENCODINGS: argptr);
909
case CURLOPT_TRANSFER_ENCODING:
910
data->set.http_transfer_encoding = (0 != va_arg(param, long))?TRUE:FALSE;
913
case CURLOPT_FOLLOWLOCATION:
915
* Follow Location: header hints on a HTTP-server.
917
data->set.http_follow_location = (0 != va_arg(param, long))?TRUE:FALSE;
920
case CURLOPT_UNRESTRICTED_AUTH:
922
* Send authentication (user+password) when following locations, even when
925
data->set.http_disable_hostname_check_before_authentication =
926
(0 != va_arg(param, long))?TRUE:FALSE;
929
case CURLOPT_MAXREDIRS:
931
* The maximum amount of hops you allow curl to follow Location:
932
* headers. This should mostly be used to detect never-ending loops.
934
data->set.maxredirs = va_arg(param, long);
937
case CURLOPT_POSTREDIR:
940
* Set the behaviour of POST when redirecting
941
* CURL_REDIR_GET_ALL - POST is changed to GET after 301 and 302
942
* CURL_REDIR_POST_301 - POST is kept as POST after 301
943
* CURL_REDIR_POST_302 - POST is kept as POST after 302
944
* CURL_REDIR_POST_303 - POST is kept as POST after 303
945
* CURL_REDIR_POST_ALL - POST is kept as POST after 301, 302 and 303
946
* other - POST is kept as POST after 301 and 302
948
int postRedir = curlx_sltosi(va_arg(param, long));
949
data->set.keep_post = postRedir & CURL_REDIR_POST_ALL;
954
/* Does this option serve a purpose anymore? Yes it does, when
955
CURLOPT_POSTFIELDS isn't used and the POST data is read off the
957
if(va_arg(param, long)) {
958
data->set.httpreq = HTTPREQ_POST;
959
data->set.opt_no_body = FALSE; /* this is implied */
962
data->set.httpreq = HTTPREQ_GET;
965
case CURLOPT_COPYPOSTFIELDS:
967
* A string with POST data. Makes curl HTTP POST. Even if it is NULL.
968
* If needed, CURLOPT_POSTFIELDSIZE must have been set prior to
969
* CURLOPT_COPYPOSTFIELDS and not altered later.
971
argptr = va_arg(param, char *);
973
if(!argptr || data->set.postfieldsize == -1)
974
result = setstropt(&data->set.str[STRING_COPYPOSTFIELDS], argptr);
977
* Check that requested length does not overflow the size_t type.
980
if((data->set.postfieldsize < 0) ||
981
((sizeof(curl_off_t) != sizeof(size_t)) &&
982
(data->set.postfieldsize > (curl_off_t)((size_t)-1))))
983
result = CURLE_OUT_OF_MEMORY;
987
(void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
989
/* Allocate even when size == 0. This satisfies the need of possible
990
later address compare to detect the COPYPOSTFIELDS mode, and
991
to mark that postfields is used rather than read function or
994
p = malloc((size_t)(data->set.postfieldsize?
995
data->set.postfieldsize:1));
998
result = CURLE_OUT_OF_MEMORY;
1000
if(data->set.postfieldsize)
1001
memcpy(p, argptr, (size_t)data->set.postfieldsize);
1003
data->set.str[STRING_COPYPOSTFIELDS] = p;
1008
data->set.postfields = data->set.str[STRING_COPYPOSTFIELDS];
1009
data->set.httpreq = HTTPREQ_POST;
1012
case CURLOPT_POSTFIELDS:
1014
* Like above, but use static data instead of copying it.
1016
data->set.postfields = va_arg(param, void *);
1017
/* Release old copied data. */
1018
(void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
1019
data->set.httpreq = HTTPREQ_POST;
1022
case CURLOPT_POSTFIELDSIZE:
1024
* The size of the POSTFIELD data to prevent libcurl to do strlen() to
1025
* figure it out. Enables binary posts.
1027
bigsize = va_arg(param, long);
1029
if(data->set.postfieldsize < bigsize &&
1030
data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
1031
/* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
1032
(void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
1033
data->set.postfields = NULL;
1036
data->set.postfieldsize = bigsize;
1039
case CURLOPT_POSTFIELDSIZE_LARGE:
1041
* The size of the POSTFIELD data to prevent libcurl to do strlen() to
1042
* figure it out. Enables binary posts.
1044
bigsize = va_arg(param, curl_off_t);
1046
if(data->set.postfieldsize < bigsize &&
1047
data->set.postfields == data->set.str[STRING_COPYPOSTFIELDS]) {
1048
/* Previous CURLOPT_COPYPOSTFIELDS is no longer valid. */
1049
(void) setstropt(&data->set.str[STRING_COPYPOSTFIELDS], NULL);
1050
data->set.postfields = NULL;
1053
data->set.postfieldsize = bigsize;
1056
case CURLOPT_HTTPPOST:
1058
* Set to make us do HTTP POST
1060
data->set.httppost = va_arg(param, struct curl_httppost *);
1061
data->set.httpreq = HTTPREQ_POST_FORM;
1062
data->set.opt_no_body = FALSE; /* this is implied */
1065
case CURLOPT_REFERER:
1067
* String to set in the HTTP Referer: field.
1069
if(data->change.referer_alloc) {
1070
Curl_safefree(data->change.referer);
1071
data->change.referer_alloc = FALSE;
1073
result = setstropt(&data->set.str[STRING_SET_REFERER],
1074
va_arg(param, char *));
1075
data->change.referer = data->set.str[STRING_SET_REFERER];
1078
case CURLOPT_USERAGENT:
1080
* String to use in the HTTP User-Agent field
1082
result = setstropt(&data->set.str[STRING_USERAGENT],
1083
va_arg(param, char *));
1086
case CURLOPT_HTTPHEADER:
1088
* Set a list with HTTP headers to use (or replace internals with)
1090
data->set.headers = va_arg(param, struct curl_slist *);
1093
case CURLOPT_PROXYHEADER:
1095
* Set a list with proxy headers to use (or replace internals with)
1097
* Since CURLOPT_HTTPHEADER was the only way to set HTTP headers for a
1098
* long time we remain doing it this way until CURLOPT_PROXYHEADER is
1099
* used. As soon as this option has been used, if set to anything but
1100
* NULL, custom headers for proxies are only picked from this list.
1102
* Set this option to NULL to restore the previous behavior.
1104
data->set.proxyheaders = va_arg(param, struct curl_slist *);
1107
case CURLOPT_HEADEROPT:
1109
* Set header option.
1111
arg = va_arg(param, long);
1112
data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
1115
case CURLOPT_HTTP200ALIASES:
1117
* Set a list of aliases for HTTP 200 in response header
1119
data->set.http200aliases = va_arg(param, struct curl_slist *);
1122
#if !defined(CURL_DISABLE_COOKIES)
1123
case CURLOPT_COOKIE:
1125
* Cookie string to send to the remote server in the request.
1127
result = setstropt(&data->set.str[STRING_COOKIE],
1128
va_arg(param, char *));
1131
case CURLOPT_COOKIEFILE:
1133
* Set cookie file to read and parse. Can be used multiple times.
1135
argptr = (char *)va_arg(param, void *);
1137
struct curl_slist *cl;
1138
/* append the cookie file name to the list of file names, and deal with
1140
cl = curl_slist_append(data->change.cookielist, argptr);
1142
curl_slist_free_all(data->change.cookielist);
1143
data->change.cookielist = NULL;
1144
return CURLE_OUT_OF_MEMORY;
1146
data->change.cookielist = cl; /* store the list for later use */
1150
case CURLOPT_COOKIEJAR:
1152
* Set cookie file name to dump all cookies to when we're done.
1154
result = setstropt(&data->set.str[STRING_COOKIEJAR],
1155
va_arg(param, char *));
1158
* Activate the cookie parser. This may or may not already
1161
data->cookies = Curl_cookie_init(data, NULL, data->cookies,
1162
data->set.cookiesession);
1165
case CURLOPT_COOKIESESSION:
1167
* Set this option to TRUE to start a new "cookie session". It will
1168
* prevent the forthcoming read-cookies-from-file actions to accept
1169
* cookies that are marked as being session cookies, as they belong to a
1172
* In the original Netscape cookie spec, "session cookies" are cookies
1173
* with no expire date set. RFC2109 describes the same action if no
1174
* 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds
1175
* a 'Discard' action that can enforce the discard even for cookies that
1178
* We run mostly with the original cookie spec, as hardly anyone implements
1181
data->set.cookiesession = (0 != va_arg(param, long))?TRUE:FALSE;
1184
case CURLOPT_COOKIELIST:
1185
argptr = va_arg(param, char *);
1190
if(Curl_raw_equal(argptr, "ALL")) {
1191
/* clear all cookies */
1192
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
1193
Curl_cookie_clearall(data->cookies);
1194
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
1196
else if(Curl_raw_equal(argptr, "SESS")) {
1197
/* clear session cookies */
1198
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
1199
Curl_cookie_clearsess(data->cookies);
1200
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
1202
else if(Curl_raw_equal(argptr, "FLUSH")) {
1203
/* flush cookies to file, takes care of the locking */
1204
Curl_flush_cookies(data, 0);
1208
/* if cookie engine was not running, activate it */
1209
data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
1211
argptr = strdup(argptr);
1213
result = CURLE_OUT_OF_MEMORY;
1216
Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
1218
if(checkprefix("Set-Cookie:", argptr))
1219
/* HTTP Header format line */
1220
Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
1223
/* Netscape format line */
1224
Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
1226
Curl_share_unlock(data, CURL_LOCK_DATA_COOKIE);
1232
#endif /* CURL_DISABLE_COOKIES */
1234
case CURLOPT_HTTPGET:
1236
* Set to force us do HTTP GET
1238
if(va_arg(param, long)) {
1239
data->set.httpreq = HTTPREQ_GET;
1240
data->set.upload = FALSE; /* switch off upload */
1241
data->set.opt_no_body = FALSE; /* this is implied */
1245
case CURLOPT_HTTP_VERSION:
1247
* This sets a requested HTTP version to be used. The value is one of
1248
* the listed enums in curl/curl.h.
1250
arg = va_arg(param, long);
1252
if(arg == CURL_HTTP_VERSION_2_0)
1253
return CURLE_UNSUPPORTED_PROTOCOL;
1255
data->set.httpversion = arg;
1258
case CURLOPT_HTTPAUTH:
1260
* Set HTTP Authentication type BITMASK.
1265
unsigned long auth = va_arg(param, unsigned long);
1267
if(auth == CURLAUTH_NONE) {
1268
data->set.httpauth = auth;
1272
/* the DIGEST_IE bit is only used to set a special marker, for all the
1273
rest we need to handle it as normal DIGEST */
1274
data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE)?TRUE:FALSE;
1276
if(auth & CURLAUTH_DIGEST_IE) {
1277
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
1278
auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
1281
/* switch off bits we can't support */
1283
auth &= ~CURLAUTH_NTLM; /* no NTLM support */
1284
auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
1285
#elif !defined(NTLM_WB_ENABLED)
1286
auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
1289
auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
1293
/* check if any auth bit lower than CURLAUTH_ONLY is still set */
1296
while(bitcheck < 31) {
1297
if(auth & (1UL << bitcheck++)) {
1303
return CURLE_NOT_BUILT_IN; /* no supported types left! */
1305
data->set.httpauth = auth;
1309
case CURLOPT_EXPECT_100_TIMEOUT_MS:
1311
* Time to wait for a response to a HTTP request containing an
1312
* Expect: 100-continue header before sending the data anyway.
1314
data->set.expect_100_timeout = va_arg(param, long);
1317
#endif /* CURL_DISABLE_HTTP */
1319
case CURLOPT_CUSTOMREQUEST:
1321
* Set a custom string to use as request
1323
result = setstropt(&data->set.str[STRING_CUSTOMREQUEST],
1324
va_arg(param, char *));
1327
data->set.httpreq = HTTPREQ_CUSTOM;
1328
here, we continue as if we were using the already set type
1329
and this just changes the actual request keyword */
1332
#ifndef CURL_DISABLE_PROXY
1333
case CURLOPT_HTTPPROXYTUNNEL:
1335
* Tunnel operations through the proxy instead of normal proxy use
1337
data->set.tunnel_thru_httpproxy = (0 != va_arg(param, long))?TRUE:FALSE;
1340
case CURLOPT_PROXYPORT:
1342
* Explicitly set HTTP proxy port number.
1344
data->set.proxyport = va_arg(param, long);
1347
case CURLOPT_PROXYAUTH:
1349
* Set HTTP Authentication type BITMASK.
1354
unsigned long auth = va_arg(param, unsigned long);
1356
if(auth == CURLAUTH_NONE) {
1357
data->set.proxyauth = auth;
1361
/* the DIGEST_IE bit is only used to set a special marker, for all the
1362
rest we need to handle it as normal DIGEST */
1363
data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE)?TRUE:FALSE;
1365
if(auth & CURLAUTH_DIGEST_IE) {
1366
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
1367
auth &= ~CURLAUTH_DIGEST_IE; /* unset ie digest bit */
1369
/* switch off bits we can't support */
1371
auth &= ~CURLAUTH_NTLM; /* no NTLM support */
1372
auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
1373
#elif !defined(NTLM_WB_ENABLED)
1374
auth &= ~CURLAUTH_NTLM_WB; /* no NTLM_WB support */
1377
auth &= ~CURLAUTH_NEGOTIATE; /* no Negotiate (SPNEGO) auth without
1381
/* check if any auth bit lower than CURLAUTH_ONLY is still set */
1384
while(bitcheck < 31) {
1385
if(auth & (1UL << bitcheck++)) {
1391
return CURLE_NOT_BUILT_IN; /* no supported types left! */
1393
data->set.proxyauth = auth;
1399
* Set proxy server:port to use as HTTP proxy.
1401
* If the proxy is set to "" we explicitly say that we don't want to use a
1402
* proxy (even though there might be environment variables saying so).
1404
* Setting it to NULL, means no proxy but allows the environment variables
1407
result = setstropt(&data->set.str[STRING_PROXY],
1408
va_arg(param, char *));
1411
case CURLOPT_PROXYTYPE:
1413
* Set proxy type. HTTP/HTTP_1_0/SOCKS4/SOCKS4a/SOCKS5/SOCKS5_HOSTNAME
1415
data->set.proxytype = (curl_proxytype)va_arg(param, long);
1418
case CURLOPT_PROXY_TRANSFER_MODE:
1420
* set transfer mode (;type=<a|i>) when doing FTP via an HTTP proxy
1422
switch (va_arg(param, long)) {
1424
data->set.proxy_transfer_mode = FALSE;
1427
data->set.proxy_transfer_mode = TRUE;
1430
/* reserve other values for future use */
1431
result = CURLE_UNKNOWN_OPTION;
1435
#endif /* CURL_DISABLE_PROXY */
1437
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
1438
case CURLOPT_SOCKS5_GSSAPI_SERVICE:
1440
* Set GSS-API service name
1442
result = setstropt(&data->set.str[STRING_SOCKS5_GSSAPI_SERVICE],
1443
va_arg(param, char *));
1446
case CURLOPT_SOCKS5_GSSAPI_NEC:
1448
* set flag for nec socks5 support
1450
data->set.socks5_gssapi_nec = (0 != va_arg(param, long))?TRUE:FALSE;
1454
case CURLOPT_HEADERDATA:
1456
* Custom pointer to pass the header write callback function
1458
data->set.writeheader = (void *)va_arg(param, void *);
1460
case CURLOPT_ERRORBUFFER:
1462
* Error buffer provided by the caller to get the human readable
1465
data->set.errorbuffer = va_arg(param, char *);
1467
case CURLOPT_WRITEDATA:
1469
* FILE pointer to write to. Or possibly
1470
* used as argument to the write callback.
1472
data->set.out = va_arg(param, void *);
1474
case CURLOPT_FTPPORT:
1476
* Use FTP PORT, this also specifies which IP address to use
1478
result = setstropt(&data->set.str[STRING_FTPPORT],
1479
va_arg(param, char *));
1480
data->set.ftp_use_port = (NULL != data->set.str[STRING_FTPPORT]) ?
1484
case CURLOPT_FTP_USE_EPRT:
1485
data->set.ftp_use_eprt = (0 != va_arg(param, long))?TRUE:FALSE;
1488
case CURLOPT_FTP_USE_EPSV:
1489
data->set.ftp_use_epsv = (0 != va_arg(param, long))?TRUE:FALSE;
1492
case CURLOPT_FTP_USE_PRET:
1493
data->set.ftp_use_pret = (0 != va_arg(param, long))?TRUE:FALSE;
1496
case CURLOPT_FTP_SSL_CCC:
1497
data->set.ftp_ccc = (curl_ftpccc)va_arg(param, long);
1500
case CURLOPT_FTP_SKIP_PASV_IP:
1502
* Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the
1503
* bypass of the IP address in PASV responses.
1505
data->set.ftp_skip_ip = (0 != va_arg(param, long))?TRUE:FALSE;
1508
case CURLOPT_READDATA:
1510
* FILE pointer to read the file to be uploaded from. Or possibly
1511
* used as argument to the read callback.
1513
data->set.in = va_arg(param, void *);
1515
case CURLOPT_INFILESIZE:
1517
* If known, this should inform curl about the file size of the
1518
* to-be-uploaded file.
1520
data->set.filesize = va_arg(param, long);
1522
case CURLOPT_INFILESIZE_LARGE:
1524
* If known, this should inform curl about the file size of the
1525
* to-be-uploaded file.
1527
data->set.filesize = va_arg(param, curl_off_t);
1529
case CURLOPT_LOW_SPEED_LIMIT:
1531
* The low speed limit that if transfers are below this for
1532
* CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
1534
data->set.low_speed_limit=va_arg(param, long);
1536
case CURLOPT_MAX_SEND_SPEED_LARGE:
1538
* When transfer uploads are faster then CURLOPT_MAX_SEND_SPEED_LARGE
1539
* bytes per second the transfer is throttled..
1541
data->set.max_send_speed=va_arg(param, curl_off_t);
1543
case CURLOPT_MAX_RECV_SPEED_LARGE:
1545
* When receiving data faster than CURLOPT_MAX_RECV_SPEED_LARGE bytes per
1546
* second the transfer is throttled..
1548
data->set.max_recv_speed=va_arg(param, curl_off_t);
1550
case CURLOPT_LOW_SPEED_TIME:
1552
* The low speed time that if transfers are below the set
1553
* CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted.
1555
data->set.low_speed_time=va_arg(param, long);
1561
if(data->change.url_alloc) {
1562
/* the already set URL is allocated, free it first! */
1563
Curl_safefree(data->change.url);
1564
data->change.url_alloc = FALSE;
1566
result = setstropt(&data->set.str[STRING_SET_URL],
1567
va_arg(param, char *));
1568
data->change.url = data->set.str[STRING_SET_URL];
1572
* The port number to use when getting the URL
1574
data->set.use_port = va_arg(param, long);
1576
case CURLOPT_TIMEOUT:
1578
* The maximum time you allow curl to use for a single transfer
1581
data->set.timeout = va_arg(param, long) * 1000L;
1584
case CURLOPT_TIMEOUT_MS:
1585
data->set.timeout = va_arg(param, long);
1588
case CURLOPT_CONNECTTIMEOUT:
1590
* The maximum time you allow curl to use to connect.
1592
data->set.connecttimeout = va_arg(param, long) * 1000L;
1595
case CURLOPT_CONNECTTIMEOUT_MS:
1596
data->set.connecttimeout = va_arg(param, long);
1599
case CURLOPT_ACCEPTTIMEOUT_MS:
1601
* The maximum time you allow curl to wait for server connect
1603
data->set.accepttimeout = va_arg(param, long);
1606
case CURLOPT_USERPWD:
1608
* user:password to use in the operation
1610
result = setstropt_userpwd(va_arg(param, char *),
1611
&data->set.str[STRING_USERNAME],
1612
&data->set.str[STRING_PASSWORD]);
1615
case CURLOPT_USERNAME:
1617
* authentication user name to use in the operation
1619
result = setstropt(&data->set.str[STRING_USERNAME],
1620
va_arg(param, char *));
1623
case CURLOPT_PASSWORD:
1625
* authentication password to use in the operation
1627
result = setstropt(&data->set.str[STRING_PASSWORD],
1628
va_arg(param, char *));
1631
case CURLOPT_LOGIN_OPTIONS:
1633
* authentication options to use in the operation
1635
result = setstropt(&data->set.str[STRING_OPTIONS],
1636
va_arg(param, char *));
1639
case CURLOPT_XOAUTH2_BEARER:
1641
* XOAUTH2 bearer token to use in the operation
1643
result = setstropt(&data->set.str[STRING_BEARER],
1644
va_arg(param, char *));
1647
case CURLOPT_POSTQUOTE:
1649
* List of RAW FTP commands to use after a transfer
1651
data->set.postquote = va_arg(param, struct curl_slist *);
1653
case CURLOPT_PREQUOTE:
1655
* List of RAW FTP commands to use prior to RETR (Wesley Laxton)
1657
data->set.prequote = va_arg(param, struct curl_slist *);
1661
* List of RAW FTP commands to use before a transfer
1663
data->set.quote = va_arg(param, struct curl_slist *);
1665
case CURLOPT_RESOLVE:
1667
* List of NAME:[address] names to populate the DNS cache with
1668
* Prefix the NAME with dash (-) to _remove_ the name from the cache.
1670
* Names added with this API will remain in the cache until explicitly
1671
* removed or the handle is cleaned up.
1673
* This API can remove any name from the DNS cache, but only entries
1674
* that aren't actually in use right now will be pruned immediately.
1676
data->set.resolve = va_arg(param, struct curl_slist *);
1677
data->change.resolve = data->set.resolve;
1679
case CURLOPT_PROGRESSFUNCTION:
1681
* Progress callback function
1683
data->set.fprogress = va_arg(param, curl_progress_callback);
1684
if(data->set.fprogress)
1685
data->progress.callback = TRUE; /* no longer internal */
1687
data->progress.callback = FALSE; /* NULL enforces internal */
1690
case CURLOPT_XFERINFOFUNCTION:
1692
* Transfer info callback function
1694
data->set.fxferinfo = va_arg(param, curl_xferinfo_callback);
1695
if(data->set.fxferinfo)
1696
data->progress.callback = TRUE; /* no longer internal */
1698
data->progress.callback = FALSE; /* NULL enforces internal */
1702
case CURLOPT_PROGRESSDATA:
1704
* Custom client data to pass to the progress callback
1706
data->set.progress_client = va_arg(param, void *);
1709
#ifndef CURL_DISABLE_PROXY
1710
case CURLOPT_PROXYUSERPWD:
1712
* user:password needed to use the proxy
1714
result = setstropt_userpwd(va_arg(param, char *),
1715
&data->set.str[STRING_PROXYUSERNAME],
1716
&data->set.str[STRING_PROXYPASSWORD]);
1718
case CURLOPT_PROXYUSERNAME:
1720
* authentication user name to use in the operation
1722
result = setstropt(&data->set.str[STRING_PROXYUSERNAME],
1723
va_arg(param, char *));
1725
case CURLOPT_PROXYPASSWORD:
1727
* authentication password to use in the operation
1729
result = setstropt(&data->set.str[STRING_PROXYPASSWORD],
1730
va_arg(param, char *));
1732
case CURLOPT_NOPROXY:
1734
* proxy exception list
1736
result = setstropt(&data->set.str[STRING_NOPROXY],
1737
va_arg(param, char *));
1743
* What range of the file you want to transfer
1745
result = setstropt(&data->set.str[STRING_SET_RANGE],
1746
va_arg(param, char *));
1748
case CURLOPT_RESUME_FROM:
1750
* Resume transfer at the give file position
1752
data->set.set_resume_from = va_arg(param, long);
1754
case CURLOPT_RESUME_FROM_LARGE:
1756
* Resume transfer at the give file position
1758
data->set.set_resume_from = va_arg(param, curl_off_t);
1760
case CURLOPT_DEBUGFUNCTION:
1762
* stderr write callback.
1764
data->set.fdebug = va_arg(param, curl_debug_callback);
1766
* if the callback provided is NULL, it'll use the default callback
1769
case CURLOPT_DEBUGDATA:
1771
* Set to a void * that should receive all error writes. This
1772
* defaults to CURLOPT_STDERR for normal operations.
1774
data->set.debugdata = va_arg(param, void *);
1776
case CURLOPT_STDERR:
1778
* Set to a FILE * that should receive all error writes. This
1779
* defaults to stderr for normal operations.
1781
data->set.err = va_arg(param, FILE *);
1783
data->set.err = stderr;
1785
case CURLOPT_HEADERFUNCTION:
1787
* Set header write callback
1789
data->set.fwrite_header = va_arg(param, curl_write_callback);
1791
case CURLOPT_WRITEFUNCTION:
1793
* Set data write callback
1795
data->set.fwrite_func = va_arg(param, curl_write_callback);
1796
if(!data->set.fwrite_func) {
1797
data->set.is_fwrite_set = 0;
1798
/* When set to NULL, reset to our internal default function */
1799
data->set.fwrite_func = (curl_write_callback)fwrite;
1802
data->set.is_fwrite_set = 1;
1804
case CURLOPT_READFUNCTION:
1806
* Read data callback
1808
data->set.fread_func = va_arg(param, curl_read_callback);
1809
if(!data->set.fread_func) {
1810
data->set.is_fread_set = 0;
1811
/* When set to NULL, reset to our internal default function */
1812
data->set.fread_func = (curl_read_callback)fread;
1815
data->set.is_fread_set = 1;
1817
case CURLOPT_SEEKFUNCTION:
1819
* Seek callback. Might be NULL.
1821
data->set.seek_func = va_arg(param, curl_seek_callback);
1823
case CURLOPT_SEEKDATA:
1825
* Seek control callback. Might be NULL.
1827
data->set.seek_client = va_arg(param, void *);
1829
case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
1831
* "Convert from network encoding" callback
1833
data->set.convfromnetwork = va_arg(param, curl_conv_callback);
1835
case CURLOPT_CONV_TO_NETWORK_FUNCTION:
1837
* "Convert to network encoding" callback
1839
data->set.convtonetwork = va_arg(param, curl_conv_callback);
1841
case CURLOPT_CONV_FROM_UTF8_FUNCTION:
1843
* "Convert from UTF-8 encoding" callback
1845
data->set.convfromutf8 = va_arg(param, curl_conv_callback);
1847
case CURLOPT_IOCTLFUNCTION:
1849
* I/O control callback. Might be NULL.
1851
data->set.ioctl_func = va_arg(param, curl_ioctl_callback);
1853
case CURLOPT_IOCTLDATA:
1855
* I/O control data pointer. Might be NULL.
1857
data->set.ioctl_client = va_arg(param, void *);
1859
case CURLOPT_SSLCERT:
1861
* String that holds file name of the SSL certificate to use
1863
result = setstropt(&data->set.str[STRING_CERT],
1864
va_arg(param, char *));
1866
case CURLOPT_SSLCERTTYPE:
1868
* String that holds file type of the SSL certificate to use
1870
result = setstropt(&data->set.str[STRING_CERT_TYPE],
1871
va_arg(param, char *));
1873
case CURLOPT_SSLKEY:
1875
* String that holds file name of the SSL key to use
1877
result = setstropt(&data->set.str[STRING_KEY],
1878
va_arg(param, char *));
1880
case CURLOPT_SSLKEYTYPE:
1882
* String that holds file type of the SSL key to use
1884
result = setstropt(&data->set.str[STRING_KEY_TYPE],
1885
va_arg(param, char *));
1887
case CURLOPT_KEYPASSWD:
1889
* String that holds the SSL or SSH private key password.
1891
result = setstropt(&data->set.str[STRING_KEY_PASSWD],
1892
va_arg(param, char *));
1894
case CURLOPT_SSLENGINE:
1896
* String that holds the SSL crypto engine.
1898
argptr = va_arg(param, char *);
1899
if(argptr && argptr[0])
1900
result = Curl_ssl_set_engine(data, argptr);
1903
case CURLOPT_SSLENGINE_DEFAULT:
1905
* flag to set engine as default.
1907
result = Curl_ssl_set_engine_default(data);
1911
* Kludgy option to enable CRLF conversions. Subject for removal.
1913
data->set.crlf = (0 != va_arg(param, long))?TRUE:FALSE;
1916
case CURLOPT_INTERFACE:
1918
* Set what interface or address/hostname to bind the socket to when
1919
* performing an operation and thus what from-IP your connection will use.
1921
result = setstropt(&data->set.str[STRING_DEVICE],
1922
va_arg(param, char *));
1924
case CURLOPT_LOCALPORT:
1926
* Set what local port to bind the socket to when performing an operation.
1928
data->set.localport = curlx_sltous(va_arg(param, long));
1930
case CURLOPT_LOCALPORTRANGE:
1932
* Set number of local ports to try, starting with CURLOPT_LOCALPORT.
1934
data->set.localportrange = curlx_sltosi(va_arg(param, long));
1936
case CURLOPT_KRBLEVEL:
1938
* A string that defines the kerberos security level.
1940
result = setstropt(&data->set.str[STRING_KRB_LEVEL],
1941
va_arg(param, char *));
1942
data->set.krb = (NULL != data->set.str[STRING_KRB_LEVEL])?TRUE:FALSE;
1944
case CURLOPT_GSSAPI_DELEGATION:
1946
* GSS-API credential delegation
1948
data->set.gssapi_delegation = va_arg(param, long);
1950
case CURLOPT_SSL_VERIFYPEER:
1952
* Enable peer SSL verifying.
1954
data->set.ssl.verifypeer = (0 != va_arg(param, long))?TRUE:FALSE;
1956
case CURLOPT_SSL_VERIFYHOST:
1958
* Enable verification of the host name in the peer certificate
1960
arg = va_arg(param, long);
1962
/* Obviously people are not reading documentation and too many thought
1963
this argument took a boolean when it wasn't and misused it. We thus ban
1964
1 as a sensible input and we warn about its use. Then we only have the
1965
2 action internally stored as TRUE. */
1968
failf(data, "CURLOPT_SSL_VERIFYHOST no longer supports 1 as value!");
1969
return CURLE_BAD_FUNCTION_ARGUMENT;
1972
data->set.ssl.verifyhost = (0 != arg)?TRUE:FALSE;
1975
/* since these two options are only possible to use on an OpenSSL-
1976
powered libcurl we #ifdef them on this condition so that libcurls
1977
built against other SSL libs will return a proper error when trying
1978
to set this option! */
1979
case CURLOPT_SSL_CTX_FUNCTION:
1981
* Set a SSL_CTX callback
1983
data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback);
1985
case CURLOPT_SSL_CTX_DATA:
1987
* Set a SSL_CTX callback parameter pointer
1989
data->set.ssl.fsslctxp = va_arg(param, void *);
1992
#if defined(USE_SSLEAY) || defined(USE_QSOSSL) || defined(USE_GSKIT) || \
1994
case CURLOPT_CERTINFO:
1995
data->set.ssl.certinfo = (0 != va_arg(param, long))?TRUE:FALSE;
1998
case CURLOPT_CAINFO:
2000
* Set CA info for SSL connection. Specify file name of the CA certificate
2002
result = setstropt(&data->set.str[STRING_SSL_CAFILE],
2003
va_arg(param, char *));
2005
case CURLOPT_CAPATH:
2007
* Set CA path info for SSL connection. Specify directory name of the CA
2008
* certificates which have been prepared using openssl c_rehash utility.
2010
/* This does not work on windows. */
2011
result = setstropt(&data->set.str[STRING_SSL_CAPATH],
2012
va_arg(param, char *));
2014
case CURLOPT_CRLFILE:
2016
* Set CRL file info for SSL connection. Specify file name of the CRL
2017
* to check certificates revocation
2019
result = setstropt(&data->set.str[STRING_SSL_CRLFILE],
2020
va_arg(param, char *));
2022
case CURLOPT_ISSUERCERT:
2024
* Set Issuer certificate file
2025
* to check certificates issuer
2027
result = setstropt(&data->set.str[STRING_SSL_ISSUERCERT],
2028
va_arg(param, char *));
2030
case CURLOPT_TELNETOPTIONS:
2032
* Set a linked list of telnet options
2034
data->set.telnet_options = va_arg(param, struct curl_slist *);
2037
case CURLOPT_BUFFERSIZE:
2039
* The application kindly asks for a differently sized receive buffer.
2040
* If it seems reasonable, we'll use it.
2042
data->set.buffer_size = va_arg(param, long);
2044
if((data->set.buffer_size> (BUFSIZE -1 )) ||
2045
(data->set.buffer_size < 1))
2046
data->set.buffer_size = 0; /* huge internal default */
2050
case CURLOPT_NOSIGNAL:
2052
* The application asks not to set any signal() or alarm() handlers,
2053
* even when using a timeout.
2055
data->set.no_signal = (0 != va_arg(param, long))?TRUE:FALSE;
2060
struct Curl_share *set;
2061
set = va_arg(param, struct Curl_share *);
2063
/* disconnect from old share, if any */
2065
Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
2067
if(data->dns.hostcachetype == HCACHE_SHARED) {
2068
data->dns.hostcache = NULL;
2069
data->dns.hostcachetype = HCACHE_NONE;
2072
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
2073
if(data->share->cookies == data->cookies)
2074
data->cookies = NULL;
2077
if(data->share->sslsession == data->state.session)
2078
data->state.session = NULL;
2080
data->share->dirty--;
2082
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
2086
/* use new share if it set */
2090
Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
2092
data->share->dirty++;
2094
if(data->share->hostcache) {
2095
/* use shared host cache */
2096
data->dns.hostcache = data->share->hostcache;
2097
data->dns.hostcachetype = HCACHE_SHARED;
2099
#if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
2100
if(data->share->cookies) {
2101
/* use shared cookie list, first free own one if any */
2103
Curl_cookie_cleanup(data->cookies);
2104
/* enable cookies since we now use a share that uses cookies! */
2105
data->cookies = data->share->cookies;
2107
#endif /* CURL_DISABLE_HTTP */
2108
if(data->share->sslsession) {
2109
data->set.ssl.max_ssl_sessions = data->share->max_ssl_sessions;
2110
data->state.session = data->share->sslsession;
2112
Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
2115
/* check for host cache not needed,
2116
* it will be done by curl_easy_perform */
2120
case CURLOPT_PRIVATE:
2122
* Set private data pointer.
2124
data->set.private_data = va_arg(param, void *);
2127
case CURLOPT_MAXFILESIZE:
2129
* Set the maximum size of a file to download.
2131
data->set.max_filesize = va_arg(param, long);
2135
case CURLOPT_USE_SSL:
2137
* Make transfers attempt to use SSL/TLS.
2139
data->set.use_ssl = (curl_usessl)va_arg(param, long);
2142
case CURLOPT_SSL_OPTIONS:
2143
arg = va_arg(param, long);
2144
data->set.ssl_enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
2148
case CURLOPT_FTPSSLAUTH:
2150
* Set a specific auth for FTP-SSL transfers.
2152
data->set.ftpsslauth = (curl_ftpauth)va_arg(param, long);
2155
case CURLOPT_IPRESOLVE:
2156
data->set.ipver = va_arg(param, long);
2159
case CURLOPT_MAXFILESIZE_LARGE:
2161
* Set the maximum size of a file to download.
2163
data->set.max_filesize = va_arg(param, curl_off_t);
2166
case CURLOPT_TCP_NODELAY:
2168
* Enable or disable TCP_NODELAY, which will disable/enable the Nagle
2171
data->set.tcp_nodelay = (0 != va_arg(param, long))?TRUE:FALSE;
2174
case CURLOPT_FTP_ACCOUNT:
2175
result = setstropt(&data->set.str[STRING_FTP_ACCOUNT],
2176
va_arg(param, char *));
2179
case CURLOPT_IGNORE_CONTENT_LENGTH:
2180
data->set.ignorecl = (0 != va_arg(param, long))?TRUE:FALSE;
2183
case CURLOPT_CONNECT_ONLY:
2185
* No data transfer, set up connection and let application use the socket
2187
data->set.connect_only = (0 != va_arg(param, long))?TRUE:FALSE;
2190
case CURLOPT_FTP_ALTERNATIVE_TO_USER:
2191
result = setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
2192
va_arg(param, char *));
2195
case CURLOPT_SOCKOPTFUNCTION:
2197
* socket callback function: called after socket() but before connect()
2199
data->set.fsockopt = va_arg(param, curl_sockopt_callback);
2202
case CURLOPT_SOCKOPTDATA:
2204
* socket callback data pointer. Might be NULL.
2206
data->set.sockopt_client = va_arg(param, void *);
2209
case CURLOPT_OPENSOCKETFUNCTION:
2211
* open/create socket callback function: called instead of socket(),
2214
data->set.fopensocket = va_arg(param, curl_opensocket_callback);
2217
case CURLOPT_OPENSOCKETDATA:
2219
* socket callback data pointer. Might be NULL.
2221
data->set.opensocket_client = va_arg(param, void *);
2224
case CURLOPT_CLOSESOCKETFUNCTION:
2226
* close socket callback function: called instead of close()
2227
* when shutting down a connection
2229
data->set.fclosesocket = va_arg(param, curl_closesocket_callback);
2232
case CURLOPT_CLOSESOCKETDATA:
2234
* socket callback data pointer. Might be NULL.
2236
data->set.closesocket_client = va_arg(param, void *);
2239
case CURLOPT_SSL_SESSIONID_CACHE:
2240
data->set.ssl.sessionid = (0 != va_arg(param, long))?TRUE:FALSE;
2244
/* we only include SSH options if explicitly built to support SSH */
2245
case CURLOPT_SSH_AUTH_TYPES:
2246
data->set.ssh_auth_types = va_arg(param, long);
2249
case CURLOPT_SSH_PUBLIC_KEYFILE:
2251
* Use this file instead of the $HOME/.ssh/id_dsa.pub file
2253
result = setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY],
2254
va_arg(param, char *));
2257
case CURLOPT_SSH_PRIVATE_KEYFILE:
2259
* Use this file instead of the $HOME/.ssh/id_dsa file
2261
result = setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY],
2262
va_arg(param, char *));
2264
case CURLOPT_SSH_HOST_PUBLIC_KEY_MD5:
2266
* Option to allow for the MD5 of the host public key to be checked
2267
* for validation purposes.
2269
result = setstropt(&data->set.str[STRING_SSH_HOST_PUBLIC_KEY_MD5],
2270
va_arg(param, char *));
2272
#ifdef HAVE_LIBSSH2_KNOWNHOST_API
2273
case CURLOPT_SSH_KNOWNHOSTS:
2275
* Store the file name to read known hosts from.
2277
result = setstropt(&data->set.str[STRING_SSH_KNOWNHOSTS],
2278
va_arg(param, char *));
2281
case CURLOPT_SSH_KEYFUNCTION:
2282
/* setting to NULL is fine since the ssh.c functions themselves will
2283
then rever to use the internal default */
2284
data->set.ssh_keyfunc = va_arg(param, curl_sshkeycallback);
2287
case CURLOPT_SSH_KEYDATA:
2289
* Custom client data to pass to the SSH keyfunc callback
2291
data->set.ssh_keyfunc_userp = va_arg(param, void *);
2293
#endif /* HAVE_LIBSSH2_KNOWNHOST_API */
2295
#endif /* USE_LIBSSH2 */
2297
case CURLOPT_HTTP_TRANSFER_DECODING:
2299
* disable libcurl transfer encoding is used
2301
data->set.http_te_skip = (0 == va_arg(param, long))?TRUE:FALSE;
2304
case CURLOPT_HTTP_CONTENT_DECODING:
2306
* raw data passed to the application when content encoding is used
2308
data->set.http_ce_skip = (0 == va_arg(param, long))?TRUE:FALSE;
2311
case CURLOPT_NEW_FILE_PERMS:
2313
* Uses these permissions instead of 0644
2315
data->set.new_file_perms = va_arg(param, long);
2318
case CURLOPT_NEW_DIRECTORY_PERMS:
2320
* Uses these permissions instead of 0755
2322
data->set.new_directory_perms = va_arg(param, long);
2325
case CURLOPT_ADDRESS_SCOPE:
2327
* We always get longs when passed plain numericals, but for this value we
2328
* know that an unsigned int will always hold the value so we blindly
2329
* typecast to this type
2331
data->set.scope = curlx_sltoui(va_arg(param, long));
2334
case CURLOPT_PROTOCOLS:
2335
/* set the bitmask for the protocols that are allowed to be used for the
2336
transfer, which thus helps the app which takes URLs from users or other
2337
external inputs and want to restrict what protocol(s) to deal
2338
with. Defaults to CURLPROTO_ALL. */
2339
data->set.allowed_protocols = va_arg(param, long);
2342
case CURLOPT_REDIR_PROTOCOLS:
2343
/* set the bitmask for the protocols that libcurl is allowed to follow to,
2344
as a subset of the CURLOPT_PROTOCOLS ones. That means the protocol needs
2345
to be set in both bitmasks to be allowed to get redirected to. Defaults
2346
to all protocols except FILE and SCP. */
2347
data->set.redir_protocols = va_arg(param, long);
2350
case CURLOPT_MAIL_FROM:
2351
/* Set the SMTP mail originator */
2352
result = setstropt(&data->set.str[STRING_MAIL_FROM],
2353
va_arg(param, char *));
2356
case CURLOPT_MAIL_AUTH:
2357
/* Set the SMTP auth originator */
2358
result = setstropt(&data->set.str[STRING_MAIL_AUTH],
2359
va_arg(param, char *));
2362
case CURLOPT_MAIL_RCPT:
2363
/* Set the list of mail recipients */
2364
data->set.mail_rcpt = va_arg(param, struct curl_slist *);
2367
case CURLOPT_SASL_IR:
2368
/* Enable/disable SASL initial response */
2369
data->set.sasl_ir = (0 != va_arg(param, long)) ? TRUE : FALSE;
2372
case CURLOPT_RTSP_REQUEST:
2375
* Set the RTSP request method (OPTIONS, SETUP, PLAY, etc...)
2376
* Would this be better if the RTSPREQ_* were just moved into here?
2378
long curl_rtspreq = va_arg(param, long);
2379
Curl_RtspReq rtspreq = RTSPREQ_NONE;
2380
switch(curl_rtspreq) {
2381
case CURL_RTSPREQ_OPTIONS:
2382
rtspreq = RTSPREQ_OPTIONS;
2385
case CURL_RTSPREQ_DESCRIBE:
2386
rtspreq = RTSPREQ_DESCRIBE;
2389
case CURL_RTSPREQ_ANNOUNCE:
2390
rtspreq = RTSPREQ_ANNOUNCE;
2393
case CURL_RTSPREQ_SETUP:
2394
rtspreq = RTSPREQ_SETUP;
2397
case CURL_RTSPREQ_PLAY:
2398
rtspreq = RTSPREQ_PLAY;
2401
case CURL_RTSPREQ_PAUSE:
2402
rtspreq = RTSPREQ_PAUSE;
2405
case CURL_RTSPREQ_TEARDOWN:
2406
rtspreq = RTSPREQ_TEARDOWN;
2409
case CURL_RTSPREQ_GET_PARAMETER:
2410
rtspreq = RTSPREQ_GET_PARAMETER;
2413
case CURL_RTSPREQ_SET_PARAMETER:
2414
rtspreq = RTSPREQ_SET_PARAMETER;
2417
case CURL_RTSPREQ_RECORD:
2418
rtspreq = RTSPREQ_RECORD;
2421
case CURL_RTSPREQ_RECEIVE:
2422
rtspreq = RTSPREQ_RECEIVE;
2425
rtspreq = RTSPREQ_NONE;
2428
data->set.rtspreq = rtspreq;
2433
case CURLOPT_RTSP_SESSION_ID:
2435
* Set the RTSP Session ID manually. Useful if the application is
2436
* resuming a previously established RTSP session
2438
result = setstropt(&data->set.str[STRING_RTSP_SESSION_ID],
2439
va_arg(param, char *));
2442
case CURLOPT_RTSP_STREAM_URI:
2444
* Set the Stream URI for the RTSP request. Unless the request is
2445
* for generic server options, the application will need to set this.
2447
result = setstropt(&data->set.str[STRING_RTSP_STREAM_URI],
2448
va_arg(param, char *));
2451
case CURLOPT_RTSP_TRANSPORT:
2453
* The content of the Transport: header for the RTSP request
2455
result = setstropt(&data->set.str[STRING_RTSP_TRANSPORT],
2456
va_arg(param, char *));
2459
case CURLOPT_RTSP_CLIENT_CSEQ:
2461
* Set the CSEQ number to issue for the next RTSP request. Useful if the
2462
* application is resuming a previously broken connection. The CSEQ
2463
* will increment from this new number henceforth.
2465
data->state.rtsp_next_client_CSeq = va_arg(param, long);
2468
case CURLOPT_RTSP_SERVER_CSEQ:
2469
/* Same as the above, but for server-initiated requests */
2470
data->state.rtsp_next_client_CSeq = va_arg(param, long);
2473
case CURLOPT_INTERLEAVEDATA:
2474
data->set.rtp_out = va_arg(param, void *);
2476
case CURLOPT_INTERLEAVEFUNCTION:
2477
/* Set the user defined RTP write function */
2478
data->set.fwrite_rtp = va_arg(param, curl_write_callback);
2481
case CURLOPT_WILDCARDMATCH:
2482
data->set.wildcardmatch = (0 != va_arg(param, long))?TRUE:FALSE;
2484
case CURLOPT_CHUNK_BGN_FUNCTION:
2485
data->set.chunk_bgn = va_arg(param, curl_chunk_bgn_callback);
2487
case CURLOPT_CHUNK_END_FUNCTION:
2488
data->set.chunk_end = va_arg(param, curl_chunk_end_callback);
2490
case CURLOPT_FNMATCH_FUNCTION:
2491
data->set.fnmatch = va_arg(param, curl_fnmatch_callback);
2493
case CURLOPT_CHUNK_DATA:
2494
data->wildcard.customptr = va_arg(param, void *);
2496
case CURLOPT_FNMATCH_DATA:
2497
data->set.fnmatch_data = va_arg(param, void *);
2500
case CURLOPT_TLSAUTH_USERNAME:
2501
result = setstropt(&data->set.str[STRING_TLSAUTH_USERNAME],
2502
va_arg(param, char *));
2503
if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
2504
data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
2506
case CURLOPT_TLSAUTH_PASSWORD:
2507
result = setstropt(&data->set.str[STRING_TLSAUTH_PASSWORD],
2508
va_arg(param, char *));
2509
if(data->set.str[STRING_TLSAUTH_USERNAME] && !data->set.ssl.authtype)
2510
data->set.ssl.authtype = CURL_TLSAUTH_SRP; /* default to SRP */
2512
case CURLOPT_TLSAUTH_TYPE:
2513
if(strnequal((char *)va_arg(param, char *), "SRP", strlen("SRP")))
2514
data->set.ssl.authtype = CURL_TLSAUTH_SRP;
2516
data->set.ssl.authtype = CURL_TLSAUTH_NONE;
2519
case CURLOPT_DNS_SERVERS:
2520
result = Curl_set_dns_servers(data, va_arg(param, char *));
2522
case CURLOPT_DNS_INTERFACE:
2523
result = Curl_set_dns_interface(data, va_arg(param, char *));
2525
case CURLOPT_DNS_LOCAL_IP4:
2526
result = Curl_set_dns_local_ip4(data, va_arg(param, char *));
2528
case CURLOPT_DNS_LOCAL_IP6:
2529
result = Curl_set_dns_local_ip6(data, va_arg(param, char *));
2532
case CURLOPT_TCP_KEEPALIVE:
2533
data->set.tcp_keepalive = (0 != va_arg(param, long))?TRUE:FALSE;
2535
case CURLOPT_TCP_KEEPIDLE:
2536
data->set.tcp_keepidle = va_arg(param, long);
2538
case CURLOPT_TCP_KEEPINTVL:
2539
data->set.tcp_keepintvl = va_arg(param, long);
2541
case CURLOPT_SSL_ENABLE_NPN:
2542
data->set.ssl_enable_npn = (0 != va_arg(param, long))?TRUE:FALSE;
2544
case CURLOPT_SSL_ENABLE_ALPN:
2545
data->set.ssl_enable_alpn = (0 != va_arg(param, long))?TRUE:FALSE;
2549
/* unknown tag and its companion, just ignore: */
2550
result = CURLE_UNKNOWN_OPTION;
2557
static void conn_free(struct connectdata *conn)
2562
/* possible left-overs from the async name resolvers */
2563
Curl_resolver_cancel(conn);
2565
/* close the SSL stuff before we close any sockets since they will/may
2566
write to the sockets */
2567
Curl_ssl_close(conn, FIRSTSOCKET);
2568
Curl_ssl_close(conn, SECONDARYSOCKET);
2570
/* close possibly still open sockets */
2571
if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET])
2572
Curl_closesocket(conn, conn->sock[SECONDARYSOCKET]);
2573
if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET])
2574
Curl_closesocket(conn, conn->sock[FIRSTSOCKET]);
2575
if(CURL_SOCKET_BAD != conn->tempsock[0])
2576
Curl_closesocket(conn, conn->tempsock[0]);
2577
if(CURL_SOCKET_BAD != conn->tempsock[1])
2578
Curl_closesocket(conn, conn->tempsock[1]);
2580
#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED)
2581
Curl_ntlm_wb_cleanup(conn);
2584
Curl_safefree(conn->user);
2585
Curl_safefree(conn->passwd);
2586
Curl_safefree(conn->xoauth2_bearer);
2587
Curl_safefree(conn->options);
2588
Curl_safefree(conn->proxyuser);
2589
Curl_safefree(conn->proxypasswd);
2590
Curl_safefree(conn->allocptr.proxyuserpwd);
2591
Curl_safefree(conn->allocptr.uagent);
2592
Curl_safefree(conn->allocptr.userpwd);
2593
Curl_safefree(conn->allocptr.accept_encoding);
2594
Curl_safefree(conn->allocptr.te);
2595
Curl_safefree(conn->allocptr.rangeline);
2596
Curl_safefree(conn->allocptr.ref);
2597
Curl_safefree(conn->allocptr.host);
2598
Curl_safefree(conn->allocptr.cookiehost);
2599
Curl_safefree(conn->allocptr.rtsp_transport);
2600
Curl_safefree(conn->trailer);
2601
Curl_safefree(conn->host.rawalloc); /* host name buffer */
2602
Curl_safefree(conn->proxy.rawalloc); /* proxy name buffer */
2603
Curl_safefree(conn->master_buffer);
2605
Curl_llist_destroy(conn->send_pipe, NULL);
2606
Curl_llist_destroy(conn->recv_pipe, NULL);
2608
conn->send_pipe = NULL;
2609
conn->recv_pipe = NULL;
2611
Curl_safefree(conn->localdev);
2612
Curl_free_ssl_config(&conn->ssl_config);
2614
free(conn); /* free all the connection oriented data */
2618
* Disconnects the given connection. Note the connection may not be the
2619
* primary connection, like when freeing room in the connection cache or
2620
* killing of a dead old connection.
2622
* This function MUST NOT reset state in the SessionHandle struct if that
2623
* isn't strictly bound to the life-time of *this* particular connection.
2627
CURLcode Curl_disconnect(struct connectdata *conn, bool dead_connection)
2629
struct SessionHandle *data;
2631
return CURLE_OK; /* this is closed and fine already */
2635
DEBUGF(fprintf(stderr, "DISCONNECT without easy handle, ignoring\n"));
2639
if(conn->dns_entry != NULL) {
2640
Curl_resolv_unlock(data, conn->dns_entry);
2641
conn->dns_entry = NULL;
2644
Curl_hostcache_prune(data); /* kill old DNS cache entries */
2646
/* Cleanup NTLM connection-related data */
2647
Curl_http_ntlm_cleanup(conn);
2649
if(conn->handler->disconnect)
2650
/* This is set if protocol-specific cleanups should be made */
2651
conn->handler->disconnect(conn, dead_connection);
2653
/* unlink ourselves! */
2654
infof(data, "Closing connection %ld\n", conn->connection_id);
2655
Curl_conncache_remove_conn(data->state.conn_cache, conn);
2657
#if defined(USE_LIBIDN)
2658
if(conn->host.encalloc)
2659
idn_free(conn->host.encalloc); /* encoded host name buffer, must be freed
2660
with idn_free() since this was allocated
2662
if(conn->proxy.encalloc)
2663
idn_free(conn->proxy.encalloc); /* encoded proxy name buffer, must be
2664
freed with idn_free() since this was
2665
allocated by libidn */
2666
#elif defined(USE_WIN32_IDN)
2667
free(conn->host.encalloc); /* encoded host name buffer, must be freed with
2668
idn_free() since this was allocated by
2669
curl_win32_idn_to_ascii */
2670
if(conn->proxy.encalloc)
2671
free(conn->proxy.encalloc); /* encoded proxy name buffer, must be freed
2672
with idn_free() since this was allocated by
2673
curl_win32_idn_to_ascii */
2676
Curl_ssl_close(conn, FIRSTSOCKET);
2678
/* Indicate to all handles on the pipe that we're dead */
2679
if(Curl_multi_pipeline_enabled(data->multi)) {
2680
signalPipeClose(conn->send_pipe, TRUE);
2681
signalPipeClose(conn->recv_pipe, TRUE);
2690
* This function should return TRUE if the socket is to be assumed to
2691
* be dead. Most commonly this happens when the server has closed the
2692
* connection due to inactivity.
2694
static bool SocketIsDead(curl_socket_t sock)
2697
bool ret_val = TRUE;
2699
sval = Curl_socket_ready(sock, CURL_SOCKET_BAD, 0);
2707
static bool IsPipeliningPossible(const struct SessionHandle *handle,
2708
const struct connectdata *conn)
2710
if((conn->handler->protocol & PROTO_FAMILY_HTTP) &&
2711
Curl_multi_pipeline_enabled(handle->multi) &&
2712
(handle->set.httpreq == HTTPREQ_GET ||
2713
handle->set.httpreq == HTTPREQ_HEAD) &&
2714
handle->set.httpversion != CURL_HTTP_VERSION_1_0)
2720
bool Curl_isPipeliningEnabled(const struct SessionHandle *handle)
2722
return Curl_multi_pipeline_enabled(handle->multi);
2725
CURLcode Curl_addHandleToPipeline(struct SessionHandle *data,
2726
struct curl_llist *pipeline)
2728
if(!Curl_llist_insert_next(pipeline, pipeline->tail, data))
2729
return CURLE_OUT_OF_MEMORY;
2733
int Curl_removeHandleFromPipeline(struct SessionHandle *handle,
2734
struct curl_llist *pipeline)
2736
struct curl_llist_element *curr;
2738
curr = pipeline->head;
2740
if(curr->ptr == handle) {
2741
Curl_llist_remove(pipeline, curr, NULL);
2742
return 1; /* we removed a handle */
2750
#if 0 /* this code is saved here as it is useful for debugging purposes */
2751
static void Curl_printPipeline(struct curl_llist *pipeline)
2753
struct curl_llist_element *curr;
2755
curr = pipeline->head;
2757
struct SessionHandle *data = (struct SessionHandle *) curr->ptr;
2758
infof(data, "Handle in pipeline: %s\n", data->state.path);
2764
static struct SessionHandle* gethandleathead(struct curl_llist *pipeline)
2766
struct curl_llist_element *curr = pipeline->head;
2768
return (struct SessionHandle *) curr->ptr;
2774
/* remove the specified connection from all (possible) pipelines and related
2776
void Curl_getoff_all_pipelines(struct SessionHandle *data,
2777
struct connectdata *conn)
2779
bool recv_head = (conn->readchannel_inuse &&
2780
(gethandleathead(conn->recv_pipe) == data)) ? TRUE : FALSE;
2782
bool send_head = (conn->writechannel_inuse &&
2783
(gethandleathead(conn->send_pipe) == data)) ? TRUE : FALSE;
2785
if(Curl_removeHandleFromPipeline(data, conn->recv_pipe) && recv_head)
2786
conn->readchannel_inuse = FALSE;
2787
if(Curl_removeHandleFromPipeline(data, conn->send_pipe) && send_head)
2788
conn->writechannel_inuse = FALSE;
2791
static void signalPipeClose(struct curl_llist *pipeline, bool pipe_broke)
2793
struct curl_llist_element *curr;
2798
curr = pipeline->head;
2800
struct curl_llist_element *next = curr->next;
2801
struct SessionHandle *data = (struct SessionHandle *) curr->ptr;
2803
#ifdef DEBUGBUILD /* debug-only code */
2804
if(data->magic != CURLEASY_MAGIC_NUMBER) {
2806
infof(data, "signalPipeClose() found BAAD easy handle\n");
2811
data->state.pipe_broke = TRUE;
2812
Curl_multi_handlePipeBreak(data);
2813
Curl_llist_remove(pipeline, curr, NULL);
2819
* This function finds the connection in the connection
2820
* cache that has been unused for the longest time.
2822
* Returns the pointer to the oldest idle connection, or NULL if none was
2825
static struct connectdata *
2826
find_oldest_idle_connection(struct SessionHandle *data)
2828
struct conncache *bc = data->state.conn_cache;
2829
struct curl_hash_iterator iter;
2830
struct curl_llist_element *curr;
2831
struct curl_hash_element *he;
2835
struct connectdata *conn_candidate = NULL;
2836
struct connectbundle *bundle;
2840
Curl_hash_start_iterate(bc->hash, &iter);
2842
he = Curl_hash_next_element(&iter);
2844
struct connectdata *conn;
2848
curr = bundle->conn_list->head;
2853
/* Set higher score for the age passed since the connection was used */
2854
score = Curl_tvdiff(now, conn->now);
2856
if(score > highscore) {
2858
conn_candidate = conn;
2864
he = Curl_hash_next_element(&iter);
2867
return conn_candidate;
2871
* This function finds the connection in the connection
2872
* bundle that has been unused for the longest time.
2874
* Returns the pointer to the oldest idle connection, or NULL if none was
2877
static struct connectdata *
2878
find_oldest_idle_connection_in_bundle(struct SessionHandle *data,
2879
struct connectbundle *bundle)
2881
struct curl_llist_element *curr;
2885
struct connectdata *conn_candidate = NULL;
2886
struct connectdata *conn;
2892
curr = bundle->conn_list->head;
2897
/* Set higher score for the age passed since the connection was used */
2898
score = Curl_tvdiff(now, conn->now);
2900
if(score > highscore) {
2902
conn_candidate = conn;
2908
return conn_candidate;
2912
* This function checks if given connection is dead and disconnects if so.
2913
* (That also removes it from the connection cache.)
2915
* Returns TRUE if the connection actually was dead and disconnected.
2917
static bool disconnect_if_dead(struct connectdata *conn,
2918
struct SessionHandle *data)
2920
size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size;
2921
if(!pipeLen && !conn->inuse) {
2922
/* The check for a dead socket makes sense only if there are no
2923
handles in pipeline and the connection isn't already marked in
2926
if(conn->handler->protocol & CURLPROTO_RTSP)
2927
/* RTSP is a special case due to RTP interleaving */
2928
dead = Curl_rtsp_connisdead(conn);
2930
dead = SocketIsDead(conn->sock[FIRSTSOCKET]);
2934
infof(data, "Connection %ld seems to be dead!\n", conn->connection_id);
2936
/* disconnect resources */
2937
Curl_disconnect(conn, /* dead_connection */TRUE);
2945
* Wrapper to use disconnect_if_dead() function in Curl_conncache_foreach()
2949
static int call_disconnect_if_dead(struct connectdata *conn,
2952
struct SessionHandle* data = (struct SessionHandle*)param;
2953
disconnect_if_dead(conn, data);
2954
return 0; /* continue iteration */
2958
* This function scans the connection cache for half-open/dead connections,
2959
* closes and removes them.
2960
* The cleanup is done at most once per second.
2962
static void prune_dead_connections(struct SessionHandle *data)
2964
struct timeval now = Curl_tvnow();
2965
long elapsed = Curl_tvdiff(now, data->state.conn_cache->last_cleanup);
2967
if(elapsed >= 1000L) {
2968
Curl_conncache_foreach(data->state.conn_cache, data,
2969
call_disconnect_if_dead);
2970
data->state.conn_cache->last_cleanup = now;
2975
* Given one filled in connection struct (named needle), this function should
2976
* detect if there already is one that has all the significant details
2977
* exactly the same and thus should be used instead.
2979
* If there is a match, this function returns TRUE - and has marked the
2980
* connection as 'in-use'. It must later be called with ConnectionDone() to
2981
* return back to 'idle' (unused) state.
2983
* The force_reuse flag is set if the connection must be used, even if
2984
* the pipelining strategy wants to open a new connection instead of reusing.
2987
ConnectionExists(struct SessionHandle *data,
2988
struct connectdata *needle,
2989
struct connectdata **usethis,
2992
struct connectdata *check;
2993
struct connectdata *chosen = 0;
2994
bool canPipeline = IsPipeliningPossible(data, needle);
2995
bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) ||
2996
(data->state.authhost.want & CURLAUTH_NTLM_WB)) &&
2997
(needle->handler->protocol & PROTO_FAMILY_HTTP) ? TRUE : FALSE;
2998
struct connectbundle *bundle;
3000
*force_reuse = FALSE;
3002
/* We can't pipe if the site is blacklisted */
3003
if(canPipeline && Curl_pipeline_site_blacklisted(data, needle)) {
3004
canPipeline = FALSE;
3007
/* Look up the bundle with all the connections to this
3009
bundle = Curl_conncache_find_bundle(data->state.conn_cache,
3012
size_t max_pipe_len = Curl_multi_max_pipeline_length(data->multi);
3013
size_t best_pipe_len = max_pipe_len;
3014
struct curl_llist_element *curr;
3016
infof(data, "Found bundle for host %s: %p\n",
3017
needle->host.name, (void *)bundle);
3019
/* We can't pipe if we don't know anything about the server */
3020
if(canPipeline && !bundle->server_supports_pipelining) {
3021
infof(data, "Server doesn't support pipelining\n");
3022
canPipeline = FALSE;
3025
curr = bundle->conn_list->head;
3028
bool credentialsMatch = FALSE;
3032
* Note that if we use a HTTP proxy, we check connections to that
3033
* proxy and not to the actual remote server.
3038
if(disconnect_if_dead(check, data))
3041
pipeLen = check->send_pipe->size + check->recv_pipe->size;
3044
/* Make sure the pipe has only GET requests */
3045
struct SessionHandle* sh = gethandleathead(check->send_pipe);
3046
struct SessionHandle* rh = gethandleathead(check->recv_pipe);
3048
if(!IsPipeliningPossible(sh, check))
3052
if(!IsPipeliningPossible(rh, check))
3058
/* can only happen within multi handles, and means that another easy
3059
handle is using this connection */
3063
if(Curl_resolver_asynch()) {
3064
/* ip_addr_str[0] is NUL only if the resolving of the name hasn't
3065
completed yet and until then we don't re-use this connection */
3066
if(!check->ip_addr_str[0]) {
3068
"Connection #%ld is still name resolving, can't reuse\n",
3069
check->connection_id);
3074
if((check->sock[FIRSTSOCKET] == CURL_SOCKET_BAD) ||
3075
check->bits.close) {
3076
/* Don't pick a connection that hasn't connected yet or that is going
3078
infof(data, "Connection #%ld isn't open enough, can't reuse\n",
3079
check->connection_id);
3081
if(check->recv_pipe->size > 0) {
3083
"BAD! Unconnected #%ld has a non-empty recv pipeline!\n",
3084
check->connection_id);
3091
if((needle->handler->flags&PROTOPT_SSL) !=
3092
(check->handler->flags&PROTOPT_SSL))
3093
/* don't do mixed SSL and non-SSL connections */
3094
if(!(needle->handler->protocol & check->handler->protocol))
3095
/* except protocols that have been upgraded via TLS */
3098
if(needle->handler->flags&PROTOPT_SSL) {
3099
if((data->set.ssl.verifypeer != check->verifypeer) ||
3100
(data->set.ssl.verifyhost != check->verifyhost))
3104
if(needle->bits.proxy != check->bits.proxy)
3105
/* don't do mixed proxy and non-proxy connections */
3108
if(!canPipeline && check->inuse)
3109
/* this request can't be pipelined but the checked connection is
3110
already in use so we skip it */
3113
if(needle->localdev || needle->localport) {
3114
/* If we are bound to a specific local end (IP+port), we must not
3115
re-use a random other one, although if we didn't ask for a
3116
particular one we can reuse one that was bound.
3118
This comparison is a bit rough and too strict. Since the input
3119
parameters can be specified in numerous ways and still end up the
3120
same it would take a lot of processing to make it really accurate.
3121
Instead, this matching will assume that re-uses of bound connections
3122
will most likely also re-use the exact same binding parameters and
3123
missing out a few edge cases shouldn't hurt anyone very much.
3125
if((check->localport != needle->localport) ||
3126
(check->localportrange != needle->localportrange) ||
3128
!needle->localdev ||
3129
strcmp(check->localdev, needle->localdev))
3133
if((!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) ||
3134
(wantNTLMhttp || check->ntlm.state != NTLMSTATE_NONE)) {
3135
/* This protocol requires credentials per connection or is HTTP+NTLM,
3136
so verify that we're using the same name and password as well */
3137
if(!strequal(needle->user, check->user) ||
3138
!strequal(needle->passwd, check->passwd)) {
3139
/* one of them was different */
3142
credentialsMatch = TRUE;
3145
if(!needle->bits.httpproxy || needle->handler->flags&PROTOPT_SSL ||
3146
(needle->bits.httpproxy && check->bits.httpproxy &&
3147
needle->bits.tunnel_proxy && check->bits.tunnel_proxy &&
3148
Curl_raw_equal(needle->proxy.name, check->proxy.name) &&
3149
(needle->port == check->port))) {
3150
/* The requested connection does not use a HTTP proxy or it uses SSL or
3151
it is a non-SSL protocol tunneled over the same http proxy name and
3152
port number or it is a non-SSL protocol which is allowed to be
3155
if((Curl_raw_equal(needle->handler->scheme, check->handler->scheme) ||
3156
needle->handler->protocol & check->handler->protocol) &&
3157
Curl_raw_equal(needle->host.name, check->host.name) &&
3158
needle->remote_port == check->remote_port) {
3159
if(needle->handler->flags & PROTOPT_SSL) {
3160
/* This is a SSL connection so verify that we're using the same
3161
SSL options as well */
3162
if(!Curl_ssl_config_matches(&needle->ssl_config,
3163
&check->ssl_config)) {
3165
"Connection #%ld has different SSL parameters, "
3167
check->connection_id));
3170
else if(check->ssl[FIRSTSOCKET].state != ssl_connection_complete) {
3172
"Connection #%ld has not started SSL connect, "
3174
check->connection_id));
3181
else { /* The requested needle connection is using a proxy,
3182
is the checked one using the same host, port and type? */
3183
if(check->bits.proxy &&
3184
(needle->proxytype == check->proxytype) &&
3185
(needle->bits.tunnel_proxy == check->bits.tunnel_proxy) &&
3186
Curl_raw_equal(needle->proxy.name, check->proxy.name) &&
3187
needle->port == check->port) {
3188
/* This is the same proxy connection, use it! */
3194
/* If we are looking for an HTTP+NTLM connection, check if this is
3195
already authenticating with the right credentials. If not, keep
3196
looking so that we can reuse NTLM connections if
3197
possible. (Especially we must not reuse the same connection if
3198
partway through a handshake!) */
3200
if(credentialsMatch && check->ntlm.state != NTLMSTATE_NONE) {
3203
/* We must use this connection, no other */
3204
*force_reuse = TRUE;
3207
else if(credentialsMatch)
3208
/* this is a backup choice */
3214
/* We can pipeline if we want to. Let's continue looking for
3215
the optimal connection to use, i.e the shortest pipe that is not
3219
/* We have the optimal connection. Let's stop looking. */
3224
/* We can't use the connection if the pipe is full */
3225
if(pipeLen >= max_pipe_len)
3228
/* We can't use the connection if the pipe is penalized */
3229
if(Curl_pipeline_penalized(data, check))
3232
if(pipeLen < best_pipe_len) {
3233
/* This connection has a shorter pipe so far. We'll pick this
3234
and continue searching */
3236
best_pipe_len = pipeLen;
3241
/* We have found a connection. Let's stop searching. */
3251
return TRUE; /* yes, we found one to use! */
3254
return FALSE; /* no matching connecting exists */
3257
/* Mark the connection as 'idle', or close it if the cache is full.
3258
Returns TRUE if the connection is kept, or FALSE if it was closed. */
3260
ConnectionDone(struct SessionHandle *data, struct connectdata *conn)
3262
/* data->multi->maxconnects can be negative, deal with it. */
3263
size_t maxconnects =
3264
(data->multi->maxconnects < 0) ? data->multi->num_easy * 4:
3265
data->multi->maxconnects;
3266
struct connectdata *conn_candidate = NULL;
3268
/* Mark the current connection as 'unused' */
3269
conn->inuse = FALSE;
3271
if(maxconnects > 0 &&
3272
data->state.conn_cache->num_connections > maxconnects) {
3273
infof(data, "Connection cache is full, closing the oldest one.\n");
3275
conn_candidate = find_oldest_idle_connection(data);
3277
if(conn_candidate) {
3278
/* Set the connection's owner correctly */
3279
conn_candidate->data = data;
3281
/* the winner gets the honour of being disconnected */
3282
(void)Curl_disconnect(conn_candidate, /* dead_connection */ FALSE);
3286
return (conn_candidate == conn) ? FALSE : TRUE;
3290
* The given input connection struct pointer is to be stored in the connection
3291
* cache. If the cache is already full, least interesting existing connection
3292
* (if any) gets closed.
3294
* The given connection should be unique. That must've been checked prior to
3297
static CURLcode ConnectionStore(struct SessionHandle *data,
3298
struct connectdata *conn)
3300
return Curl_conncache_add_conn(data->state.conn_cache, conn);
3303
/* after a TCP connection to the proxy has been verified, this function does
3304
the next magic step.
3306
Note: this function's sub-functions call failf()
3309
CURLcode Curl_connected_proxy(struct connectdata *conn,
3312
if(!conn->bits.proxy || sockindex)
3313
/* this magic only works for the primary socket as the secondary is used
3314
for FTP only and it has FTP specific magic in ftp.c */
3317
switch(conn->proxytype) {
3318
#ifndef CURL_DISABLE_PROXY
3319
case CURLPROXY_SOCKS5:
3320
case CURLPROXY_SOCKS5_HOSTNAME:
3321
return Curl_SOCKS5(conn->proxyuser, conn->proxypasswd,
3322
conn->host.name, conn->remote_port,
3325
case CURLPROXY_SOCKS4:
3326
return Curl_SOCKS4(conn->proxyuser, conn->host.name,
3327
conn->remote_port, FIRSTSOCKET, conn, FALSE);
3329
case CURLPROXY_SOCKS4A:
3330
return Curl_SOCKS4(conn->proxyuser, conn->host.name,
3331
conn->remote_port, FIRSTSOCKET, conn, TRUE);
3333
#endif /* CURL_DISABLE_PROXY */
3334
case CURLPROXY_HTTP:
3335
case CURLPROXY_HTTP_1_0:
3336
/* do nothing here. handled later. */
3340
} /* switch proxytype */
3346
* verboseconnect() displays verbose information after a connect
3348
#ifndef CURL_DISABLE_VERBOSE_STRINGS
3349
void Curl_verboseconnect(struct connectdata *conn)
3351
if(conn->data->set.verbose)
3352
infof(conn->data, "Connected to %s (%s) port %ld (#%ld)\n",
3353
conn->bits.proxy ? conn->proxy.dispname : conn->host.dispname,
3354
conn->ip_addr_str, conn->port, conn->connection_id);
3358
int Curl_protocol_getsock(struct connectdata *conn,
3359
curl_socket_t *socks,
3362
if(conn->handler->proto_getsock)
3363
return conn->handler->proto_getsock(conn, socks, numsocks);
3364
return GETSOCK_BLANK;
3367
int Curl_doing_getsock(struct connectdata *conn,
3368
curl_socket_t *socks,
3371
if(conn && conn->handler->doing_getsock)
3372
return conn->handler->doing_getsock(conn, socks, numsocks);
3373
return GETSOCK_BLANK;
3377
* We are doing protocol-specific connecting and this is being called over and
3378
* over from the multi interface until the connection phase is done on
3382
CURLcode Curl_protocol_connecting(struct connectdata *conn,
3385
CURLcode result=CURLE_OK;
3387
if(conn && conn->handler->connecting) {
3389
result = conn->handler->connecting(conn, done);
3398
* We are DOING this is being called over and over from the multi interface
3399
* until the DOING phase is done on protocol layer.
3402
CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done)
3404
CURLcode result=CURLE_OK;
3406
if(conn && conn->handler->doing) {
3408
result = conn->handler->doing(conn, done);
3417
* We have discovered that the TCP connection has been successful, we can now
3418
* proceed with some action.
3421
CURLcode Curl_protocol_connect(struct connectdata *conn,
3422
bool *protocol_done)
3424
CURLcode result=CURLE_OK;
3426
*protocol_done = FALSE;
3428
if(conn->bits.tcpconnect[FIRSTSOCKET] && conn->bits.protoconnstart) {
3429
/* We already are connected, get back. This may happen when the connect
3430
worked fine in the first call, like when we connect to a local server
3431
or proxy. Note that we don't know if the protocol is actually done.
3433
Unless this protocol doesn't have any protocol-connect callback, as
3434
then we know we're done. */
3435
if(!conn->handler->connecting)
3436
*protocol_done = TRUE;
3441
if(!conn->bits.protoconnstart) {
3443
result = Curl_proxy_connect(conn);
3447
if(conn->bits.tunnel_proxy && conn->bits.httpproxy &&
3448
(conn->tunnel_state[FIRSTSOCKET] != TUNNEL_COMPLETE))
3449
/* when using an HTTP tunnel proxy, await complete tunnel establishment
3450
before proceeding further. Return CURLE_OK so we'll be called again */
3453
if(conn->handler->connect_it) {
3454
/* is there a protocol-specific connect() procedure? */
3456
/* Call the protocol-specific connect function */
3457
result = conn->handler->connect_it(conn, protocol_done);
3460
*protocol_done = TRUE;
3462
/* it has started, possibly even completed but that knowledge isn't stored
3465
conn->bits.protoconnstart = TRUE;
3468
return result; /* pass back status */
3472
* Helpers for IDNA convertions.
3474
static bool is_ASCII_name(const char *hostname)
3476
const unsigned char *ch = (const unsigned char*)hostname;
3487
* Check if characters in hostname is allowed in Top Level Domain.
3489
static bool tld_check_name(struct SessionHandle *data,
3490
const char *ace_hostname)
3493
char *uc_name = NULL;
3495
#ifndef CURL_DISABLE_VERBOSE_STRINGS
3496
const char *tld_errmsg = "<no msg>";
3501
/* Convert (and downcase) ACE-name back into locale's character set */
3502
rc = idna_to_unicode_lzlz(ace_hostname, &uc_name, 0);
3503
if(rc != IDNA_SUCCESS)
3506
rc = tld_check_lz(uc_name, &err_pos, NULL);
3507
#ifndef CURL_DISABLE_VERBOSE_STRINGS
3508
#ifdef HAVE_TLD_STRERROR
3509
if(rc != TLD_SUCCESS)
3510
tld_errmsg = tld_strerror((Tld_rc)rc);
3512
if(rc == TLD_INVALID)
3513
infof(data, "WARNING: %s; pos %u = `%c'/0x%02X\n",
3514
tld_errmsg, err_pos, uc_name[err_pos],
3515
uc_name[err_pos] & 255);
3516
else if(rc != TLD_SUCCESS)
3517
infof(data, "WARNING: TLD check for %s failed; %s\n",
3518
uc_name, tld_errmsg);
3519
#endif /* CURL_DISABLE_VERBOSE_STRINGS */
3522
if(rc != TLD_SUCCESS)
3530
* Perform any necessary IDN conversion of hostname
3532
static void fix_hostname(struct SessionHandle *data,
3533
struct connectdata *conn, struct hostname *host)
3540
#elif defined(CURL_DISABLE_VERBOSE_STRINGS)
3544
/* set the name we use to display the host name */
3545
host->dispname = host->name;
3547
len = strlen(host->name);
3548
if(host->name[len-1] == '.')
3549
/* strip off a single trailing dot if present, primarily for SNI but
3550
there's no use for it */
3551
host->name[len-1]=0;
3553
if(!is_ASCII_name(host->name)) {
3555
/*************************************************************
3556
* Check name for non-ASCII and convert hostname to ACE form.
3557
*************************************************************/
3558
if(stringprep_check_version(LIBIDN_REQUIRED_VERSION)) {
3559
char *ace_hostname = NULL;
3560
int rc = idna_to_ascii_lz(host->name, &ace_hostname, 0);
3561
infof (data, "Input domain encoded as `%s'\n",
3562
stringprep_locale_charset ());
3563
if(rc != IDNA_SUCCESS)
3564
infof(data, "Failed to convert %s to ACE; %s\n",
3565
host->name, Curl_idn_strerror(conn,rc));
3567
/* tld_check_name() displays a warning if the host name contains
3568
"illegal" characters for this TLD */
3569
(void)tld_check_name(data, ace_hostname);
3571
host->encalloc = ace_hostname;
3572
/* change the name pointer to point to the encoded hostname */
3573
host->name = host->encalloc;
3576
#elif defined(USE_WIN32_IDN)
3577
/*************************************************************
3578
* Check name for non-ASCII and convert hostname to ACE form.
3579
*************************************************************/
3580
char *ace_hostname = NULL;
3581
int rc = curl_win32_idn_to_ascii(host->name, &ace_hostname);
3583
infof(data, "Failed to convert %s to ACE;\n",
3586
host->encalloc = ace_hostname;
3587
/* change the name pointer to point to the encoded hostname */
3588
host->name = host->encalloc;
3591
infof(data, "IDN support not present, can't parse Unicode domains\n");
3596
static void llist_dtor(void *user, void *element)
3604
* Allocate and initialize a new connectdata object.
3606
static struct connectdata *allocate_conn(struct SessionHandle *data)
3608
struct connectdata *conn = calloc(1, sizeof(struct connectdata));
3612
conn->handler = &Curl_handler_dummy; /* Be sure we have a handler defined
3613
already from start to avoid NULL
3614
situations and checks */
3616
/* and we setup a few fields in case we end up actually using this struct */
3618
conn->sock[FIRSTSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */
3619
conn->sock[SECONDARYSOCKET] = CURL_SOCKET_BAD; /* no file descriptor */
3620
conn->tempsock[0] = CURL_SOCKET_BAD; /* no file descriptor */
3621
conn->tempsock[1] = CURL_SOCKET_BAD; /* no file descriptor */
3622
conn->connection_id = -1; /* no ID */
3623
conn->port = -1; /* unknown at this point */
3624
conn->remote_port = -1; /* unknown */
3626
/* Default protocol-independent behavior doesn't support persistent
3627
connections, so we set this to force-close. Protocols that support
3628
this need to set this to FALSE in their "curl_do" functions. */
3629
connclose(conn, "Default to force-close");
3631
/* Store creation time to help future close decision making */
3632
conn->created = Curl_tvnow();
3634
conn->data = data; /* Setup the association between this connection
3635
and the SessionHandle */
3637
conn->proxytype = data->set.proxytype; /* type */
3639
#ifdef CURL_DISABLE_PROXY
3641
conn->bits.proxy = FALSE;
3642
conn->bits.httpproxy = FALSE;
3643
conn->bits.proxy_user_passwd = FALSE;
3644
conn->bits.tunnel_proxy = FALSE;
3646
#else /* CURL_DISABLE_PROXY */
3648
/* note that these two proxy bits are now just on what looks to be
3649
requested, they may be altered down the road */
3650
conn->bits.proxy = (data->set.str[STRING_PROXY] &&
3651
*data->set.str[STRING_PROXY])?TRUE:FALSE;
3652
conn->bits.httpproxy = (conn->bits.proxy &&
3653
(conn->proxytype == CURLPROXY_HTTP ||
3654
conn->proxytype == CURLPROXY_HTTP_1_0))?TRUE:FALSE;
3655
conn->bits.proxy_user_passwd =
3656
(NULL != data->set.str[STRING_PROXYUSERNAME])?TRUE:FALSE;
3657
conn->bits.tunnel_proxy = data->set.tunnel_thru_httpproxy;
3659
#endif /* CURL_DISABLE_PROXY */
3661
conn->bits.user_passwd = (NULL != data->set.str[STRING_USERNAME])?TRUE:FALSE;
3662
conn->bits.ftp_use_epsv = data->set.ftp_use_epsv;
3663
conn->bits.ftp_use_eprt = data->set.ftp_use_eprt;
3665
conn->verifypeer = data->set.ssl.verifypeer;
3666
conn->verifyhost = data->set.ssl.verifyhost;
3668
conn->ip_version = data->set.ipver;
3670
#if defined(USE_NTLM) && defined(NTLM_WB_ENABLED)
3671
conn->ntlm_auth_hlpr_socket = CURL_SOCKET_BAD;
3672
conn->ntlm_auth_hlpr_pid = 0;
3673
conn->challenge_header = NULL;
3674
conn->response_header = NULL;
3677
if(Curl_multi_pipeline_enabled(data->multi) &&
3678
!conn->master_buffer) {
3679
/* Allocate master_buffer to be used for pipelining */
3680
conn->master_buffer = calloc(BUFSIZE, sizeof (char));
3681
if(!conn->master_buffer)
3685
/* Initialize the pipeline lists */
3686
conn->send_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
3687
conn->recv_pipe = Curl_llist_alloc((curl_llist_dtor) llist_dtor);
3688
if(!conn->send_pipe || !conn->recv_pipe)
3692
conn->data_prot = PROT_CLEAR;
3695
/* Store the local bind parameters that will be used for this connection */
3696
if(data->set.str[STRING_DEVICE]) {
3697
conn->localdev = strdup(data->set.str[STRING_DEVICE]);
3701
conn->localportrange = data->set.localportrange;
3702
conn->localport = data->set.localport;
3704
/* the close socket stuff needs to be copied to the connection struct as
3705
it may live on without (this specific) SessionHandle */
3706
conn->fclosesocket = data->set.fclosesocket;
3707
conn->closesocket_client = data->set.closesocket_client;
3712
Curl_llist_destroy(conn->send_pipe, NULL);
3713
Curl_llist_destroy(conn->recv_pipe, NULL);
3715
conn->send_pipe = NULL;
3716
conn->recv_pipe = NULL;
3718
Curl_safefree(conn->master_buffer);
3719
Curl_safefree(conn->localdev);
3720
Curl_safefree(conn);
3724
static CURLcode findprotocol(struct SessionHandle *data,
3725
struct connectdata *conn,
3726
const char *protostr)
3728
const struct Curl_handler * const *pp;
3729
const struct Curl_handler *p;
3731
/* Scan protocol handler table and match against 'protostr' to set a few
3732
variables based on the URL. Now that the handler may be changed later
3733
when the protocol specific setup function is called. */
3734
for(pp = protocols; (p = *pp) != NULL; pp++) {
3735
if(Curl_raw_equal(p->scheme, protostr)) {
3736
/* Protocol found in table. Check if allowed */
3737
if(!(data->set.allowed_protocols & p->protocol))
3741
/* it is allowed for "normal" request, now do an extra check if this is
3742
the result of a redirect */
3743
if(data->state.this_is_a_follow &&
3744
!(data->set.redir_protocols & p->protocol))
3748
/* Perform setup complement if some. */
3749
conn->handler = conn->given = p;
3751
/* 'port' and 'remote_port' are set in setup_connection_internals() */
3757
/* The protocol was not found in the table, but we don't have to assign it
3758
to anything since it is already assigned to a dummy-struct in the
3759
create_conn() function when the connectdata struct is allocated. */
3760
failf(data, "Protocol \"%s\" not supported or disabled in " LIBCURL_NAME,
3763
return CURLE_UNSUPPORTED_PROTOCOL;
3767
* Parse URL and fill in the relevant members of the connection struct.
3769
static CURLcode parseurlandfillconn(struct SessionHandle *data,
3770
struct connectdata *conn,
3772
char **userp, char **passwdp,
3777
char *path = data->state.path;
3780
char protobuf[16] = "";
3781
const char *protop = "";
3783
bool rebuild_url = FALSE;
3785
*prot_missing = FALSE;
3787
/* We might pass the entire URL into the request so we need to make sure
3788
* there are no bad characters in there.*/
3789
if(strpbrk(data->change.url, "\r\n")) {
3790
failf(data, "Illegal characters found in URL");
3791
return CURLE_URL_MALFORMAT;
3794
/*************************************************************
3797
* We need to parse the url even when using the proxy, because we will need
3798
* the hostname and port in case we are trying to SSL connect through the
3799
* proxy -- and we don't know if we will need to use SSL until we parse the
3801
************************************************************/
3802
if((2 == sscanf(data->change.url, "%15[^:]:%[^\n]",
3804
Curl_raw_equal(protobuf, "file")) {
3805
if(path[0] == '/' && path[1] == '/') {
3806
/* Allow omitted hostname (e.g. file:/<path>). This is not strictly
3807
* speaking a valid file: URL by RFC 1738, but treating file:/<path> as
3808
* file://localhost/<path> is similar to how other schemes treat missing
3809
* hostnames. See RFC 1808. */
3811
/* This cannot be done with strcpy() in a portable manner, since the
3812
memory areas overlap! */
3813
memmove(path, path + 2, strlen(path + 2)+1);
3816
* we deal with file://<host>/<path> differently since it supports no
3817
* hostname other than "localhost" and "127.0.0.1", which is unique among
3818
* the URL protocols specified in RFC 1738
3820
if(path[0] != '/') {
3821
/* the URL included a host name, we ignore host names in file:// URLs
3822
as the standards don't define what to do with them */
3823
char *ptr=strchr(path, '/');
3825
/* there was a slash present
3827
RFC1738 (section 3.1, page 5) says:
3829
The rest of the locator consists of data specific to the scheme,
3830
and is known as the "url-path". It supplies the details of how the
3831
specified resource can be accessed. Note that the "/" between the
3832
host (or port) and the url-path is NOT part of the url-path.
3834
As most agents use file://localhost/foo to get '/foo' although the
3835
slash preceding foo is a separator and not a slash for the path,
3836
a URL as file://localhost//foo must be valid as well, to refer to
3837
the same file with an absolute path.
3840
if(ptr[1] && ('/' == ptr[1]))
3841
/* if there was two slashes, we skip the first one as that is then
3842
used truly as a separator */
3845
/* This cannot be made with strcpy, as the memory chunks overlap! */
3846
memmove(path, ptr, strlen(ptr)+1);
3850
protop = "file"; /* protocol string */
3856
if(2 > sscanf(data->change.url,
3857
"%15[^\n:]://%[^\n/?]%[^\n]",
3859
conn->host.name, path)) {
3862
* The URL was badly formatted, let's try the browser-style _without_
3863
* protocol specified like 'http://'.
3865
rc = sscanf(data->change.url, "%[^\n/?]%[^\n]", conn->host.name, path);
3868
* We couldn't even get this format.
3869
* djgpp 2.04 has a sscanf() bug where 'conn->host.name' is
3870
* assigned, but the return value is EOF!
3872
#if defined(__DJGPP__) && (DJGPP_MINOR == 4)
3873
if(!(rc == -1 && *conn->host.name))
3876
failf(data, "<url> malformed");
3877
return CURLE_URL_MALFORMAT;
3882
* Since there was no protocol part specified, we guess what protocol it
3883
* is based on the first letters of the server name.
3886
/* Note: if you add a new protocol, please update the list in
3887
* lib/version.c too! */
3889
if(checkprefix("FTP.", conn->host.name))
3891
else if(checkprefix("DICT.", conn->host.name))
3893
else if(checkprefix("LDAP.", conn->host.name))
3895
else if(checkprefix("IMAP.", conn->host.name))
3897
else if(checkprefix("SMTP.", conn->host.name))
3899
else if(checkprefix("POP3.", conn->host.name))
3905
*prot_missing = TRUE; /* not given in URL */
3911
/* We search for '?' in the host name (but only on the right side of a
3912
* @-letter to allow ?-letters in username and password) to handle things
3913
* like http://example.com?param= (notice the missing '/').
3915
at = strchr(conn->host.name, '@');
3917
query = strchr(at+1, '?');
3919
query = strchr(conn->host.name, '?');
3922
/* We must insert a slash before the '?'-letter in the URL. If the URL had
3923
a slash after the '?', that is where the path currently begins and the
3924
'?string' is still part of the host name.
3926
We must move the trailing part from the host name and put it first in
3927
the path. And have it all prefixed with a slash.
3930
size_t hostlen = strlen(query);
3931
size_t pathlen = strlen(path);
3933
/* move the existing path plus the zero byte forward, to make room for
3934
the host-name part */
3935
memmove(path+hostlen+1, path, pathlen+1);
3937
/* now copy the trailing host part in front of the existing path */
3938
memcpy(path+1, query, hostlen);
3940
path[0]='/'; /* prepend the missing slash */
3943
*query=0; /* now cut off the hostname at the ? */
3946
/* if there's no path set, use a single slash */
3951
/* If the URL is malformatted (missing a '/' after hostname before path) we
3952
* insert a slash here. The only letter except '/' we accept to start a path
3955
if(path[0] == '?') {
3956
/* We need this function to deal with overlapping memory areas. We know
3957
that the memory area 'path' points to is 'urllen' bytes big and that
3958
is bigger than the path. Use +1 to move the zero byte too. */
3959
memmove(&path[1], path, strlen(path)+1);
3964
/* sanitise paths and remove ../ and ./ sequences according to RFC3986 */
3965
char *newp = Curl_dedotdotify(path);
3967
return CURLE_OUT_OF_MEMORY;
3969
if(strcmp(newp, path)) {
3971
free(data->state.pathbuffer);
3972
data->state.pathbuffer = newp;
3973
data->state.path = newp;
3981
* "rebuild_url" means that one or more URL components have been modified so
3982
* we need to generate an updated full version. We need the corrected URL
3983
* when communicating over HTTP proxy and we don't know at this point if
3984
* we're using a proxy or not.
3989
size_t plen = strlen(path); /* new path, should be 1 byte longer than
3991
size_t urllen = strlen(data->change.url); /* original URL length */
3993
size_t prefixlen = strlen(conn->host.name);
3996
prefixlen += strlen(protop) + strlen("://");
3998
reurl = malloc(urllen + 2); /* 2 for zerobyte + slash */
4000
return CURLE_OUT_OF_MEMORY;
4002
/* copy the prefix */
4003
memcpy(reurl, data->change.url, prefixlen);
4005
/* append the trailing piece + zerobyte */
4006
memcpy(&reurl[prefixlen], path, plen + 1);
4008
/* possible free the old one */
4009
if(data->change.url_alloc) {
4010
Curl_safefree(data->change.url);
4011
data->change.url_alloc = FALSE;
4014
infof(data, "Rebuilt URL to: %s\n", reurl);
4016
data->change.url = reurl;
4017
data->change.url_alloc = TRUE; /* free this later */
4021
* Parse the login details from the URL and strip them out of
4024
result = parse_url_login(data, conn, userp, passwdp, optionsp);
4025
if(result != CURLE_OK)
4028
if(conn->host.name[0] == '[') {
4029
/* This looks like an IPv6 address literal. See if there is an address
4030
scope if there is no location header */
4031
char *percent = strchr(conn->host.name, '%');
4033
unsigned int identifier_offset = 3;
4035
unsigned long scope;
4036
if(strncmp("%25", percent, 3) != 0) {
4038
"Please URL encode %% as %%25, see RFC 6874.\n");
4039
identifier_offset = 1;
4041
scope = strtoul(percent + identifier_offset, &endp, 10);
4043
/* The address scope was well formed. Knock it out of the
4045
memmove(percent, endp, strlen(endp)+1);
4046
conn->scope = (unsigned int)scope;
4049
/* Zone identifier is not numeric */
4050
#if defined(HAVE_NET_IF_H) && defined(IFNAMSIZ) && defined(HAVE_IF_NAMETOINDEX)
4051
char ifname[IFNAMSIZ + 2];
4052
char *square_bracket;
4053
unsigned int scopeidx = 0;
4054
strncpy(ifname, percent + identifier_offset, IFNAMSIZ + 2);
4055
/* Ensure nullbyte termination */
4056
ifname[IFNAMSIZ + 1] = '\0';
4057
square_bracket = strchr(ifname, ']');
4058
if(square_bracket) {
4060
*square_bracket = '\0';
4061
scopeidx = if_nametoindex(ifname);
4063
infof(data, "Invalid network interface: %s; %s\n", ifname,
4068
/* Remove zone identifier from hostname */
4070
percent + identifier_offset + strlen(ifname),
4071
identifier_offset + strlen(ifname));
4072
conn->scope = scopeidx;
4075
#endif /* HAVE_NET_IF_H && IFNAMSIZ */
4076
infof(data, "Invalid IPv6 address format\n");
4082
/* Override any scope that was set above. */
4083
conn->scope = data->set.scope;
4085
/* Remove the fragment part of the path. Per RFC 2396, this is always the
4086
last part of the URI. We are looking for the first '#' so that we deal
4087
gracefully with non conformant URI such as http://example.com#foo#bar. */
4088
fragment = strchr(path, '#');
4092
/* we know the path part ended with a fragment, so we know the full URL
4093
string does too and we need to cut it off from there so it isn't used
4095
fragment = strchr(data->change.url, '#');
4101
* So if the URL was A://B/C#D,
4103
* conn->host.name is B
4104
* data->state.path is /C
4107
return findprotocol(data, conn, protop);
4111
* If we're doing a resumed transfer, we need to setup our stuff
4114
static CURLcode setup_range(struct SessionHandle *data)
4116
struct UrlState *s = &data->state;
4117
s->resume_from = data->set.set_resume_from;
4118
if(s->resume_from || data->set.str[STRING_SET_RANGE]) {
4119
if(s->rangestringalloc)
4123
s->range = aprintf("%" CURL_FORMAT_CURL_OFF_TU "-", s->resume_from);
4125
s->range = strdup(data->set.str[STRING_SET_RANGE]);
4127
s->rangestringalloc = (s->range)?TRUE:FALSE;
4130
return CURLE_OUT_OF_MEMORY;
4132
/* tell ourselves to fetch this range */
4133
s->use_range = TRUE; /* enable range download */
4136
s->use_range = FALSE; /* disable range download */
4143
* setup_connection_internals() -
4145
* Setup connection internals specific to the requested protocol in the
4146
* SessionHandle. This is inited and setup before the connection is made but
4147
* is about the particular protocol that is to be used.
4149
* This MUST get called after proxy magic has been figured out.
4151
static CURLcode setup_connection_internals(struct connectdata *conn)
4153
const struct Curl_handler * p;
4155
struct SessionHandle *data = conn->data;
4157
/* in some case in the multi state-machine, we go back to the CONNECT state
4158
and then a second (or third or...) call to this function will be made
4159
without doing a DISCONNECT or DONE in between (since the connection is
4160
yet in place) and therefore this function needs to first make sure
4161
there's no lingering previous data allocated. */
4162
Curl_free_request_state(data);
4164
memset(&data->req, 0, sizeof(struct SingleRequest));
4165
data->req.maxdownload = -1;
4167
conn->socktype = SOCK_STREAM; /* most of them are TCP streams */
4169
/* Perform setup complement if some. */
4172
if(p->setup_connection) {
4173
result = (*p->setup_connection)(conn);
4175
if(result != CURLE_OK)
4178
p = conn->handler; /* May have changed. */
4182
/* we check for -1 here since if proxy was detected already, this
4183
was very likely already set to the proxy port */
4184
conn->port = p->defport;
4186
/* only if remote_port was not already parsed off the URL we use the
4187
default port number */
4188
if(conn->remote_port < 0)
4189
conn->remote_port = (unsigned short)conn->given->defport;
4195
* Curl_free_request_state() should free temp data that was allocated in the
4196
* SessionHandle for this single request.
4199
void Curl_free_request_state(struct SessionHandle *data)
4201
Curl_safefree(data->req.protop);
4202
Curl_safefree(data->req.newurl);
4206
#ifndef CURL_DISABLE_PROXY
4207
/****************************************************************
4208
* Checks if the host is in the noproxy list. returns true if it matches
4209
* and therefore the proxy should NOT be used.
4210
****************************************************************/
4211
static bool check_noproxy(const char* name, const char* no_proxy)
4213
/* no_proxy=domain1.dom,host.domain2.dom
4214
* (a comma-separated list of hosts which should
4215
* not be proxied, or an asterisk to override
4216
* all proxy variables)
4220
const char* separator = ", ";
4221
size_t no_proxy_len;
4225
if(no_proxy && no_proxy[0]) {
4226
if(Curl_raw_equal("*", no_proxy)) {
4230
/* NO_PROXY was specified and it wasn't just an asterisk */
4232
no_proxy_len = strlen(no_proxy);
4233
endptr = strchr(name, ':');
4235
namelen = endptr - name;
4237
namelen = strlen(name);
4239
for(tok_start = 0; tok_start < no_proxy_len; tok_start = tok_end + 1) {
4240
while(tok_start < no_proxy_len &&
4241
strchr(separator, no_proxy[tok_start]) != NULL) {
4242
/* Look for the beginning of the token. */
4246
if(tok_start == no_proxy_len)
4247
break; /* It was all trailing separator chars, no more tokens. */
4249
for(tok_end = tok_start; tok_end < no_proxy_len &&
4250
strchr(separator, no_proxy[tok_end]) == NULL; ++tok_end)
4251
/* Look for the end of the token. */
4254
/* To match previous behaviour, where it was necessary to specify
4255
* ".local.com" to prevent matching "notlocal.com", we will leave
4258
if(no_proxy[tok_start] == '.')
4261
if((tok_end - tok_start) <= namelen) {
4262
/* Match the last part of the name to the domain we are checking. */
4263
const char *checkn = name + namelen - (tok_end - tok_start);
4264
if(Curl_raw_nequal(no_proxy + tok_start, checkn,
4265
tok_end - tok_start)) {
4266
if((tok_end - tok_start) == namelen || *(checkn - 1) == '.') {
4267
/* We either have an exact match, or the previous character is a .
4268
* so it is within the same domain, so no proxy for this host.
4273
} /* if((tok_end - tok_start) <= namelen) */
4274
} /* for(tok_start = 0; tok_start < no_proxy_len;
4275
tok_start = tok_end + 1) */
4276
} /* NO_PROXY was specified and it wasn't just an asterisk */
4281
/****************************************************************
4282
* Detect what (if any) proxy to use. Remember that this selects a host
4283
* name and is not limited to HTTP proxies only.
4284
* The returned pointer must be freed by the caller (unless NULL)
4285
****************************************************************/
4286
static char *detect_proxy(struct connectdata *conn)
4290
#ifndef CURL_DISABLE_HTTP
4291
/* If proxy was not specified, we check for default proxy environment
4292
* variables, to enable i.e Lynx compliance:
4294
* http_proxy=http://some.server.dom:port/
4295
* https_proxy=http://some.server.dom:port/
4296
* ftp_proxy=http://some.server.dom:port/
4297
* no_proxy=domain1.dom,host.domain2.dom
4298
* (a comma-separated list of hosts which should
4299
* not be proxied, or an asterisk to override
4300
* all proxy variables)
4301
* all_proxy=http://some.server.dom:port/
4302
* (seems to exist for the CERN www lib. Probably
4303
* the first to check for.)
4305
* For compatibility, the all-uppercase versions of these variables are
4306
* checked if the lowercase versions don't exist.
4308
char *no_proxy=NULL;
4309
char proxy_env[128];
4311
no_proxy=curl_getenv("no_proxy");
4313
no_proxy=curl_getenv("NO_PROXY");
4315
if(!check_noproxy(conn->host.name, no_proxy)) {
4316
/* It was not listed as without proxy */
4317
const char *protop = conn->handler->scheme;
4318
char *envp = proxy_env;
4321
/* Now, build <protocol>_proxy and check for such a one to use */
4323
*envp++ = (char)tolower((int)*protop++);
4326
strcpy(envp, "_proxy");
4328
/* read the protocol proxy: */
4329
prox=curl_getenv(proxy_env);
4332
* We don't try the uppercase version of HTTP_PROXY because of
4335
* When curl is used in a webserver application
4336
* environment (cgi or php), this environment variable can
4337
* be controlled by the web server user by setting the
4338
* http header 'Proxy:' to some value.
4340
* This can cause 'internal' http/ftp requests to be
4341
* arbitrarily redirected by any external attacker.
4343
if(!prox && !Curl_raw_equal("http_proxy", proxy_env)) {
4344
/* There was no lowercase variable, try the uppercase version: */
4345
Curl_strntoupper(proxy_env, proxy_env, sizeof(proxy_env));
4346
prox=curl_getenv(proxy_env);
4349
if(prox && *prox) { /* don't count "" strings */
4350
proxy = prox; /* use this */
4353
proxy = curl_getenv("all_proxy"); /* default proxy to use */
4355
proxy=curl_getenv("ALL_PROXY");
4357
} /* if(!check_noproxy(conn->host.name, no_proxy)) - it wasn't specified
4362
#else /* !CURL_DISABLE_HTTP */
4365
#endif /* CURL_DISABLE_HTTP */
4371
* If this is supposed to use a proxy, we need to figure out the proxy
4372
* host name, so that we can re-use an existing connection
4373
* that may exist registered to the same proxy host.
4374
* proxy will be freed before this function returns.
4376
static CURLcode parse_proxy(struct SessionHandle *data,
4377
struct connectdata *conn, char *proxy)
4382
/* We use 'proxyptr' to point to the proxy name from now on... */
4387
/* We do the proxy host string parsing here. We want the host name and the
4388
* port name. Accept a protocol:// prefix
4391
/* Parse the protocol part if present */
4392
endofprot = strstr(proxy, "://");
4394
proxyptr = endofprot+3;
4395
if(checkprefix("socks5h", proxy))
4396
conn->proxytype = CURLPROXY_SOCKS5_HOSTNAME;
4397
else if(checkprefix("socks5", proxy))
4398
conn->proxytype = CURLPROXY_SOCKS5;
4399
else if(checkprefix("socks4a", proxy))
4400
conn->proxytype = CURLPROXY_SOCKS4A;
4401
else if(checkprefix("socks4", proxy) || checkprefix("socks", proxy))
4402
conn->proxytype = CURLPROXY_SOCKS4;
4403
/* Any other xxx:// : change to http proxy */
4406
proxyptr = proxy; /* No xxx:// head: It's a HTTP proxy */
4408
/* Is there a username and password given in this proxy url? */
4409
atsign = strchr(proxyptr, '@');
4411
CURLcode res = CURLE_OK;
4412
char *proxyuser = NULL;
4413
char *proxypasswd = NULL;
4415
res = parse_login_details(proxyptr, atsign - proxyptr,
4416
&proxyuser, &proxypasswd, NULL);
4418
/* found user and password, rip them out. note that we are
4419
unescaping them, as there is otherwise no way to have a
4420
username or password with reserved characters like ':' in
4422
Curl_safefree(conn->proxyuser);
4423
if(proxyuser && strlen(proxyuser) < MAX_CURL_USER_LENGTH)
4424
conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
4426
conn->proxyuser = strdup("");
4428
if(!conn->proxyuser)
4429
res = CURLE_OUT_OF_MEMORY;
4431
Curl_safefree(conn->proxypasswd);
4432
if(proxypasswd && strlen(proxypasswd) < MAX_CURL_PASSWORD_LENGTH)
4433
conn->proxypasswd = curl_easy_unescape(data, proxypasswd, 0, NULL);
4435
conn->proxypasswd = strdup("");
4437
if(!conn->proxypasswd)
4438
res = CURLE_OUT_OF_MEMORY;
4442
conn->bits.proxy_user_passwd = TRUE; /* enable it */
4443
atsign++; /* the right side of the @-letter */
4446
proxyptr = atsign; /* now use this instead */
4448
res = CURLE_OUT_OF_MEMORY;
4452
Curl_safefree(proxyuser);
4453
Curl_safefree(proxypasswd);
4459
/* start scanning for port number at this point */
4462
/* detect and extract RFC6874-style IPv6-addresses */
4463
if(*proxyptr == '[') {
4464
char *ptr = ++proxyptr; /* advance beyond the initial bracket */
4465
while(*ptr && (ISXDIGIT(*ptr) || (*ptr == ':') || (*ptr == '.')))
4468
/* There might be a zone identifier */
4469
if(strncmp("%25", ptr, 3))
4470
infof(data, "Please URL encode %% as %%25, see RFC 6874.\n");
4472
/* Allow unresered characters as defined in RFC 3986 */
4473
while(*ptr && (ISALPHA(*ptr) || ISXDIGIT(*ptr) || (*ptr == '-') ||
4474
(*ptr == '.') || (*ptr == '_') || (*ptr == '~')))
4478
/* yeps, it ended nicely with a bracket as well */
4481
infof(data, "Invalid IPv6 address format\n");
4483
/* Note that if this didn't end with a bracket, we still advanced the
4484
* proxyptr first, but I can't see anything wrong with that as no host
4485
* name nor a numeric can legally start with a bracket.
4489
/* Get port number off proxy.server.com:1080 */
4490
prox_portno = strchr(portptr, ':');
4492
*prox_portno = 0x0; /* cut off number from host name */
4494
/* now set the local port number */
4495
conn->port = strtol(prox_portno, NULL, 10);
4498
if(proxyptr[0]=='/')
4499
/* If the first character in the proxy string is a slash, fail
4500
immediately. The following code will otherwise clear the string which
4501
will lead to code running as if no proxy was set! */
4502
return CURLE_COULDNT_RESOLVE_PROXY;
4504
/* without a port number after the host name, some people seem to use
4505
a slash so we strip everything from the first slash */
4506
atsign = strchr(proxyptr, '/');
4508
*atsign = 0x0; /* cut off path part from host name */
4510
if(data->set.proxyport)
4511
/* None given in the proxy string, then get the default one if it is
4513
conn->port = data->set.proxyport;
4516
/* now, clone the cleaned proxy host name */
4517
conn->proxy.rawalloc = strdup(proxyptr);
4518
conn->proxy.name = conn->proxy.rawalloc;
4520
if(!conn->proxy.rawalloc)
4521
return CURLE_OUT_OF_MEMORY;
4527
* Extract the user and password from the authentication string
4529
static CURLcode parse_proxy_auth(struct SessionHandle *data,
4530
struct connectdata *conn)
4532
char proxyuser[MAX_CURL_USER_LENGTH]="";
4533
char proxypasswd[MAX_CURL_PASSWORD_LENGTH]="";
4535
if(data->set.str[STRING_PROXYUSERNAME] != NULL) {
4536
strncpy(proxyuser, data->set.str[STRING_PROXYUSERNAME],
4537
MAX_CURL_USER_LENGTH);
4538
proxyuser[MAX_CURL_USER_LENGTH-1] = '\0'; /*To be on safe side*/
4540
if(data->set.str[STRING_PROXYPASSWORD] != NULL) {
4541
strncpy(proxypasswd, data->set.str[STRING_PROXYPASSWORD],
4542
MAX_CURL_PASSWORD_LENGTH);
4543
proxypasswd[MAX_CURL_PASSWORD_LENGTH-1] = '\0'; /*To be on safe side*/
4546
conn->proxyuser = curl_easy_unescape(data, proxyuser, 0, NULL);
4547
if(!conn->proxyuser)
4548
return CURLE_OUT_OF_MEMORY;
4550
conn->proxypasswd = curl_easy_unescape(data, proxypasswd, 0, NULL);
4551
if(!conn->proxypasswd)
4552
return CURLE_OUT_OF_MEMORY;
4556
#endif /* CURL_DISABLE_PROXY */
4561
* Parse the login details (user name, password and options) from the URL and
4562
* strip them out of the host name
4564
* Inputs: data->set.use_netrc (CURLOPT_NETRC)
4567
* Outputs: (almost :- all currently undefined)
4568
* conn->bits.user_passwd - non-zero if non-default passwords exist
4569
* user - non-zero length if defined
4570
* passwd - non-zero length if defined
4571
* options - non-zero length if defined
4572
* conn->host.name - remove user name and password
4574
static CURLcode parse_url_login(struct SessionHandle *data,
4575
struct connectdata *conn,
4576
char **user, char **passwd, char **options)
4578
CURLcode result = CURLE_OK;
4580
char *passwdp = NULL;
4581
char *optionsp = NULL;
4583
/* At this point, we're hoping all the other special cases have
4584
* been taken care of, so conn->host.name is at most
4585
* [user[:password][;options]]@]hostname
4587
* We need somewhere to put the embedded details, so do that first.
4590
char *ptr = strchr(conn->host.name, '@');
4591
char *login = conn->host.name;
4593
DEBUGASSERT(!**user);
4594
DEBUGASSERT(!**passwd);
4595
DEBUGASSERT(!**options);
4600
/* We will now try to extract the
4601
* possible login information in a string like:
4602
* ftp://user:password@ftp.my.site:8021/README */
4603
conn->host.name = ++ptr;
4605
/* So the hostname is sane. Only bother interpreting the
4606
* results if we could care. It could still be wasted
4607
* work because it might be overtaken by the programmatically
4608
* set user/passwd, but doing that first adds more cases here :-(
4611
if(data->set.use_netrc == CURL_NETRC_REQUIRED)
4614
/* We could use the login information in the URL so extract it */
4615
result = parse_login_details(login, ptr - login - 1,
4616
&userp, &passwdp, &optionsp);
4617
if(result != CURLE_OK)
4623
/* We have a user in the URL */
4624
conn->bits.userpwd_in_url = TRUE;
4625
conn->bits.user_passwd = TRUE; /* enable user+password */
4627
/* Decode the user */
4628
newname = curl_easy_unescape(data, userp, 0, NULL);
4630
result = CURLE_OUT_OF_MEMORY;
4639
/* We have a password in the URL so decode it */
4640
char *newpasswd = curl_easy_unescape(data, passwdp, 0, NULL);
4642
result = CURLE_OUT_OF_MEMORY;
4647
*passwd = newpasswd;
4651
/* We have an options list in the URL so decode it */
4652
char *newoptions = curl_easy_unescape(data, optionsp, 0, NULL);
4654
result = CURLE_OUT_OF_MEMORY;
4659
*options = newoptions;
4665
Curl_safefree(userp);
4666
Curl_safefree(passwdp);
4667
Curl_safefree(optionsp);
4673
* parse_login_details()
4675
* This is used to parse a login string for user name, password and options in
4676
* the following formats:
4680
* user:password;options
4682
* user;options:password
4690
* login [in] - The login string.
4691
* len [in] - The length of the login string.
4692
* userp [in/out] - The address where a pointer to newly allocated memory
4693
* holding the user will be stored upon completion.
4694
* passdwp [in/out] - The address where a pointer to newly allocated memory
4695
* holding the password will be stored upon completion.
4696
* optionsp [in/out] - The address where a pointer to newly allocated memory
4697
* holding the options will be stored upon completion.
4699
* Returns CURLE_OK on success.
4701
static CURLcode parse_login_details(const char *login, const size_t len,
4702
char **userp, char **passwdp,
4705
CURLcode result = CURLE_OK;
4709
const char *psep = NULL;
4710
const char *osep = NULL;
4715
/* Attempt to find the password separator */
4717
psep = strchr(login, ':');
4719
/* Within the constraint of the login string */
4720
if(psep >= login + len)
4724
/* Attempt to find the options separator */
4726
osep = strchr(login, ';');
4728
/* Within the constraint of the login string */
4729
if(osep >= login + len)
4733
/* Calculate the portion lengths */
4735
(size_t)(osep && psep > osep ? osep - login : psep - login) :
4736
(osep ? (size_t)(osep - login) : len));
4738
(osep && osep > psep ? (size_t)(osep - psep) :
4739
(size_t)(login + len - psep)) - 1 : 0);
4741
(psep && psep > osep ? (size_t)(psep - osep) :
4742
(size_t)(login + len - osep)) - 1 : 0);
4744
/* Allocate the user portion buffer */
4746
ubuf = malloc(ulen + 1);
4748
result = CURLE_OUT_OF_MEMORY;
4751
/* Allocate the password portion buffer */
4752
if(!result && passwdp && plen) {
4753
pbuf = malloc(plen + 1);
4755
Curl_safefree(ubuf);
4756
result = CURLE_OUT_OF_MEMORY;
4760
/* Allocate the options portion buffer */
4761
if(!result && optionsp && olen) {
4762
obuf = malloc(olen + 1);
4764
Curl_safefree(pbuf);
4765
Curl_safefree(ubuf);
4766
result = CURLE_OUT_OF_MEMORY;
4771
/* Store the user portion if necessary */
4773
memcpy(ubuf, login, ulen);
4775
Curl_safefree(*userp);
4779
/* Store the password portion if necessary */
4781
memcpy(pbuf, psep + 1, plen);
4783
Curl_safefree(*passwdp);
4787
/* Store the options portion if necessary */
4789
memcpy(obuf, osep + 1, olen);
4791
Curl_safefree(*optionsp);
4799
/*************************************************************
4800
* Figure out the remote port number and fix it in the URL
4802
* No matter if we use a proxy or not, we have to figure out the remote
4803
* port number of various reasons.
4805
* To be able to detect port number flawlessly, we must not confuse them
4806
* IPv6-specified addresses in the [0::1] style. (RFC2732)
4808
* The conn->host.name is currently [user:passwd@]host[:port] where host
4809
* could be a hostname, IPv4 address or IPv6 address.
4811
* The port number embedded in the URL is replaced, if necessary.
4812
*************************************************************/
4813
static CURLcode parse_remote_port(struct SessionHandle *data,
4814
struct connectdata *conn)
4819
/* Note that at this point, the IPv6 address cannot contain any scope
4820
suffix as that has already been removed in the parseurlandfillconn()
4822
if((1 == sscanf(conn->host.name, "[%*45[0123456789abcdefABCDEF:.]%c",
4824
(']' == endbracket)) {
4825
/* this is a RFC2732-style specified IP-address */
4826
conn->bits.ipv6_ip = TRUE;
4828
conn->host.name++; /* skip over the starting bracket */
4829
portptr = strchr(conn->host.name, ']');
4831
*portptr++ = '\0'; /* zero terminate, killing the bracket */
4833
portptr = NULL; /* no port number available */
4838
struct in6_addr in6;
4839
if(Curl_inet_pton(AF_INET6, conn->host.name, &in6) > 0) {
4840
/* This is a numerical IPv6 address, meaning this is a wrongly formatted
4842
failf(data, "IPv6 numerical address used in URL without brackets");
4843
return CURLE_URL_MALFORMAT;
4847
portptr = strrchr(conn->host.name, ':');
4850
if(data->set.use_port && data->state.allow_port) {
4851
/* if set, we use this and ignore the port possibly given in the URL */
4852
conn->remote_port = (unsigned short)data->set.use_port;
4854
*portptr = '\0'; /* cut off the name there anyway - if there was a port
4855
number - since the port number is to be ignored! */
4856
if(conn->bits.httpproxy) {
4857
/* we need to create new URL with the new port number */
4861
if(conn->bits.type_set)
4862
snprintf(type, sizeof(type), ";type=%c",
4863
data->set.prefer_ascii?'A':
4864
(data->set.ftp_list_only?'D':'I'));
4867
* This synthesized URL isn't always right--suffixes like ;type=A are
4868
* stripped off. It would be better to work directly from the original
4869
* URL and simply replace the port part of it.
4871
url = aprintf("%s://%s%s%s:%hu%s%s%s", conn->given->scheme,
4872
conn->bits.ipv6_ip?"[":"", conn->host.name,
4873
conn->bits.ipv6_ip?"]":"", conn->remote_port,
4874
data->state.slash_removed?"/":"", data->state.path,
4877
return CURLE_OUT_OF_MEMORY;
4879
if(data->change.url_alloc) {
4880
Curl_safefree(data->change.url);
4881
data->change.url_alloc = FALSE;
4884
data->change.url = url;
4885
data->change.url_alloc = TRUE;
4889
/* no CURLOPT_PORT given, extract the one from the URL */
4894
port=strtol(portptr+1, &rest, 10); /* Port number must be decimal */
4896
if((port < 0) || (port > 0xffff)) {
4897
/* Single unix standard says port numbers are 16 bits long */
4898
failf(data, "Port number out of range");
4899
return CURLE_URL_MALFORMAT;
4902
else if(rest != &portptr[1]) {
4903
*portptr = '\0'; /* cut off the name there */
4904
conn->remote_port = curlx_ultous(port);
4907
/* Browser behavior adaptation. If there's a colon with no digits after,
4908
just cut off the name there which makes us ignore the colon and just
4909
use the default port. Firefox and Chrome both do that. */
4916
* Override the login details from the URL with that in the CURLOPT_USERPWD
4917
* option or a .netrc file, if applicable.
4919
static CURLcode override_login(struct SessionHandle *data,
4920
struct connectdata *conn,
4921
char **userp, char **passwdp, char **optionsp)
4923
if(data->set.str[STRING_USERNAME]) {
4925
*userp = strdup(data->set.str[STRING_USERNAME]);
4927
return CURLE_OUT_OF_MEMORY;
4930
if(data->set.str[STRING_PASSWORD]) {
4932
*passwdp = strdup(data->set.str[STRING_PASSWORD]);
4934
return CURLE_OUT_OF_MEMORY;
4937
if(data->set.str[STRING_OPTIONS]) {
4939
*optionsp = strdup(data->set.str[STRING_OPTIONS]);
4941
return CURLE_OUT_OF_MEMORY;
4944
conn->bits.netrc = FALSE;
4945
if(data->set.use_netrc != CURL_NETRC_IGNORED) {
4946
int ret = Curl_parsenetrc(conn->host.name,
4948
data->set.str[STRING_NETRC_FILE]);
4950
infof(data, "Couldn't find host %s in the "
4951
DOT_CHAR "netrc file; using defaults\n",
4955
return CURLE_OUT_OF_MEMORY;
4958
/* set bits.netrc TRUE to remember that we got the name from a .netrc
4959
file, so that it is safe to use even if we followed a Location: to a
4960
different host or similar. */
4961
conn->bits.netrc = TRUE;
4963
conn->bits.user_passwd = TRUE; /* enable user+password */
4971
* Set the login details so they're available in the connection
4973
static CURLcode set_login(struct connectdata *conn,
4974
const char *user, const char *passwd,
4975
const char *options)
4977
CURLcode result = CURLE_OK;
4979
/* If our protocol needs a password and we have none, use the defaults */
4980
if((conn->handler->flags & PROTOPT_NEEDSPWD) && !conn->bits.user_passwd) {
4981
/* Store the default user */
4982
conn->user = strdup(CURL_DEFAULT_USER);
4984
/* Store the default password */
4986
conn->passwd = strdup(CURL_DEFAULT_PASSWORD);
4988
conn->passwd = NULL;
4990
/* This is the default password, so DON'T set conn->bits.user_passwd */
4993
/* Store the user, zero-length if not set */
4994
conn->user = strdup(user);
4996
/* Store the password (only if user is present), zero-length if not set */
4998
conn->passwd = strdup(passwd);
5000
conn->passwd = NULL;
5003
if(!conn->user || !conn->passwd)
5004
result = CURLE_OUT_OF_MEMORY;
5006
/* Store the options, null if not set */
5007
if(!result && options[0]) {
5008
conn->options = strdup(options);
5011
result = CURLE_OUT_OF_MEMORY;
5017
/*************************************************************
5018
* Resolve the address of the server or proxy
5019
*************************************************************/
5020
static CURLcode resolve_server(struct SessionHandle *data,
5021
struct connectdata *conn,
5024
CURLcode result=CURLE_OK;
5025
long timeout_ms = Curl_timeleft(data, NULL, TRUE);
5027
/*************************************************************
5028
* Resolve the name of the server or proxy
5029
*************************************************************/
5030
if(conn->bits.reuse)
5031
/* We're reusing the connection - no need to resolve anything, and
5032
fix_hostname() was called already in create_conn() for the re-use
5037
/* this is a fresh connect */
5039
struct Curl_dns_entry *hostaddr;
5041
/* set a pointer to the hostname we display */
5042
fix_hostname(data, conn, &conn->host);
5044
if(!conn->proxy.name || !*conn->proxy.name) {
5045
/* If not connecting via a proxy, extract the port from the URL, if it is
5046
* there, thus overriding any defaults that might have been set above. */
5047
conn->port = conn->remote_port; /* it is the same port */
5049
/* Resolve target host right on */
5050
rc = Curl_resolv_timeout(conn, conn->host.name, (int)conn->port,
5051
&hostaddr, timeout_ms);
5052
if(rc == CURLRESOLV_PENDING)
5055
else if(rc == CURLRESOLV_TIMEDOUT)
5056
result = CURLE_OPERATION_TIMEDOUT;
5058
else if(!hostaddr) {
5059
failf(data, "Couldn't resolve host '%s'", conn->host.dispname);
5060
result = CURLE_COULDNT_RESOLVE_HOST;
5061
/* don't return yet, we need to clean up the timeout first */
5065
/* This is a proxy that hasn't been resolved yet. */
5067
/* IDN-fix the proxy name */
5068
fix_hostname(data, conn, &conn->proxy);
5071
rc = Curl_resolv_timeout(conn, conn->proxy.name, (int)conn->port,
5072
&hostaddr, timeout_ms);
5074
if(rc == CURLRESOLV_PENDING)
5077
else if(rc == CURLRESOLV_TIMEDOUT)
5078
result = CURLE_OPERATION_TIMEDOUT;
5080
else if(!hostaddr) {
5081
failf(data, "Couldn't resolve proxy '%s'", conn->proxy.dispname);
5082
result = CURLE_COULDNT_RESOLVE_PROXY;
5083
/* don't return yet, we need to clean up the timeout first */
5086
DEBUGASSERT(conn->dns_entry == NULL);
5087
conn->dns_entry = hostaddr;
5094
* Cleanup the connection just allocated before we can move along and use the
5095
* previously existing one. All relevant data is copied over and old_conn is
5096
* ready for freeing once this function returns.
5098
static void reuse_conn(struct connectdata *old_conn,
5099
struct connectdata *conn)
5101
if(old_conn->proxy.rawalloc)
5102
free(old_conn->proxy.rawalloc);
5104
/* free the SSL config struct from this connection struct as this was
5105
allocated in vain and is targeted for destruction */
5106
Curl_free_ssl_config(&old_conn->ssl_config);
5108
conn->data = old_conn->data;
5110
/* get the user+password information from the old_conn struct since it may
5111
* be new for this request even when we re-use an existing connection */
5112
conn->bits.user_passwd = old_conn->bits.user_passwd;
5113
if(conn->bits.user_passwd) {
5114
/* use the new user name and password though */
5115
Curl_safefree(conn->user);
5116
Curl_safefree(conn->passwd);
5117
conn->user = old_conn->user;
5118
conn->passwd = old_conn->passwd;
5119
old_conn->user = NULL;
5120
old_conn->passwd = NULL;
5123
conn->bits.proxy_user_passwd = old_conn->bits.proxy_user_passwd;
5124
if(conn->bits.proxy_user_passwd) {
5125
/* use the new proxy user name and proxy password though */
5126
Curl_safefree(conn->proxyuser);
5127
Curl_safefree(conn->proxypasswd);
5128
conn->proxyuser = old_conn->proxyuser;
5129
conn->proxypasswd = old_conn->proxypasswd;
5130
old_conn->proxyuser = NULL;
5131
old_conn->proxypasswd = NULL;
5134
/* host can change, when doing keepalive with a proxy or if the case is
5135
different this time etc */
5136
Curl_safefree(conn->host.rawalloc);
5137
conn->host=old_conn->host;
5139
/* persist connection info in session handle */
5140
Curl_persistconninfo(conn);
5143
conn->bits.reuse = TRUE; /* yes, we're re-using here */
5145
Curl_safefree(old_conn->user);
5146
Curl_safefree(old_conn->passwd);
5147
Curl_safefree(old_conn->proxyuser);
5148
Curl_safefree(old_conn->proxypasswd);
5149
Curl_safefree(old_conn->localdev);
5151
Curl_llist_destroy(old_conn->send_pipe, NULL);
5152
Curl_llist_destroy(old_conn->recv_pipe, NULL);
5154
old_conn->send_pipe = NULL;
5155
old_conn->recv_pipe = NULL;
5157
Curl_safefree(old_conn->master_buffer);
5161
* create_conn() sets up a new connectdata struct, or re-uses an already
5162
* existing one, and resolves host name.
5164
* if this function returns CURLE_OK and *async is set to TRUE, the resolve
5165
* response will be coming asynchronously. If *async is FALSE, the name is
5168
* @param data The sessionhandle pointer
5169
* @param in_connect is set to the next connection data pointer
5170
* @param async is set TRUE when an async DNS resolution is pending
5171
* @see Curl_setup_conn()
5173
* *NOTE* this function assigns the conn->data pointer!
5176
static CURLcode create_conn(struct SessionHandle *data,
5177
struct connectdata **in_connect,
5180
CURLcode result = CURLE_OK;
5181
struct connectdata *conn;
5182
struct connectdata *conn_temp = NULL;
5185
char *passwd = NULL;
5186
char *options = NULL;
5189
bool prot_missing = FALSE;
5190
bool no_connections_available = FALSE;
5191
bool force_reuse = FALSE;
5192
size_t max_host_connections = Curl_multi_max_host_connections(data->multi);
5193
size_t max_total_connections = Curl_multi_max_total_connections(data->multi);
5197
/*************************************************************
5199
*************************************************************/
5201
if(!data->change.url) {
5202
result = CURLE_URL_MALFORMAT;
5206
/* First, split up the current URL in parts so that we can use the
5207
parts for checking against the already present connections. In order
5208
to not have to modify everything at once, we allocate a temporary
5209
connection data struct and fill in for comparison purposes. */
5210
conn = allocate_conn(data);
5213
result = CURLE_OUT_OF_MEMORY;
5217
/* We must set the return variable as soon as possible, so that our
5218
parent can cleanup any possible allocs we may have done before
5222
/* This initing continues below, see the comment "Continue connectdata
5223
* initialization here" */
5225
/***********************************************************
5226
* We need to allocate memory to store the path in. We get the size of the
5227
* full URL to be sure, and we need to make it at least 256 bytes since
5228
* other parts of the code will rely on this fact
5229
***********************************************************/
5230
#define LEAST_PATH_ALLOC 256
5231
urllen=strlen(data->change.url);
5232
if(urllen < LEAST_PATH_ALLOC)
5233
urllen=LEAST_PATH_ALLOC;
5236
* We malloc() the buffers below urllen+2 to make room for 2 possibilities:
5237
* 1 - an extra terminating zero
5238
* 2 - an extra slash (in case a syntax like "www.host.com?moo" is used)
5241
Curl_safefree(data->state.pathbuffer);
5242
data->state.path = NULL;
5244
data->state.pathbuffer = malloc(urllen+2);
5245
if(NULL == data->state.pathbuffer) {
5246
result = CURLE_OUT_OF_MEMORY; /* really bad error */
5249
data->state.path = data->state.pathbuffer;
5251
conn->host.rawalloc = malloc(urllen+2);
5252
if(NULL == conn->host.rawalloc) {
5253
Curl_safefree(data->state.pathbuffer);
5254
data->state.path = NULL;
5255
result = CURLE_OUT_OF_MEMORY;
5259
conn->host.name = conn->host.rawalloc;
5260
conn->host.name[0] = 0;
5263
passwd = strdup("");
5264
options = strdup("");
5265
if(!user || !passwd || !options) {
5266
result = CURLE_OUT_OF_MEMORY;
5270
result = parseurlandfillconn(data, conn, &prot_missing, &user, &passwd,
5272
if(result != CURLE_OK)
5275
/*************************************************************
5276
* No protocol part in URL was used, add it!
5277
*************************************************************/
5279
/* We're guessing prefixes here and if we're told to use a proxy or if
5280
we're gonna follow a Location: later or... then we need the protocol
5281
part added so that we have a valid URL. */
5284
reurl = aprintf("%s://%s", conn->handler->scheme, data->change.url);
5287
result = CURLE_OUT_OF_MEMORY;
5291
if(data->change.url_alloc) {
5292
Curl_safefree(data->change.url);
5293
data->change.url_alloc = FALSE;
5296
data->change.url = reurl;
5297
data->change.url_alloc = TRUE; /* free this later */
5300
/*************************************************************
5301
* If the protocol can't handle url query strings, then cut
5302
* off the unhandable part
5303
*************************************************************/
5304
if((conn->given->flags&PROTOPT_NOURLQUERY)) {
5305
char *path_q_sep = strchr(conn->data->state.path, '?');
5307
/* according to rfc3986, allow the query (?foo=bar)
5308
also on protocols that can't handle it.
5310
cut the string-part after '?'
5313
/* terminate the string */
5318
if(data->set.str[STRING_BEARER]) {
5319
conn->xoauth2_bearer = strdup(data->set.str[STRING_BEARER]);
5320
if(!conn->xoauth2_bearer) {
5321
result = CURLE_OUT_OF_MEMORY;
5326
#ifndef CURL_DISABLE_PROXY
5327
/*************************************************************
5328
* Extract the user and password from the authentication string
5329
*************************************************************/
5330
if(conn->bits.proxy_user_passwd) {
5331
result = parse_proxy_auth(data, conn);
5332
if(result != CURLE_OK)
5336
/*************************************************************
5337
* Detect what (if any) proxy to use
5338
*************************************************************/
5339
if(data->set.str[STRING_PROXY]) {
5340
proxy = strdup(data->set.str[STRING_PROXY]);
5341
/* if global proxy is set, this is it */
5343
failf(data, "memory shortage");
5344
result = CURLE_OUT_OF_MEMORY;
5349
if(data->set.str[STRING_NOPROXY] &&
5350
check_noproxy(conn->host.name, data->set.str[STRING_NOPROXY])) {
5352
free(proxy); /* proxy is in exception list */
5357
proxy = detect_proxy(conn);
5359
if(proxy && (!*proxy || (conn->handler->flags & PROTOPT_NONETWORK))) {
5360
free(proxy); /* Don't bother with an empty proxy string or if the
5361
protocol doesn't work with network */
5365
/***********************************************************************
5366
* If this is supposed to use a proxy, we need to figure out the proxy host
5367
* name, proxy type and port number, so that we can re-use an existing
5368
* connection that may exist registered to the same proxy host.
5369
***********************************************************************/
5371
result = parse_proxy(data, conn, proxy);
5373
Curl_safefree(proxy); /* parse_proxy copies the proxy string */
5378
if((conn->proxytype == CURLPROXY_HTTP) ||
5379
(conn->proxytype == CURLPROXY_HTTP_1_0)) {
5380
#ifdef CURL_DISABLE_HTTP
5381
/* asking for a HTTP proxy is a bit funny when HTTP is disabled... */
5382
result = CURLE_UNSUPPORTED_PROTOCOL;
5385
/* force this connection's protocol to become HTTP if not already
5386
compatible - if it isn't tunneling through */
5387
if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) &&
5388
!conn->bits.tunnel_proxy)
5389
conn->handler = &Curl_handler_http;
5391
conn->bits.httpproxy = TRUE;
5395
conn->bits.httpproxy = FALSE; /* not a HTTP proxy */
5396
conn->bits.proxy = TRUE;
5399
/* we aren't using the proxy after all... */
5400
conn->bits.proxy = FALSE;
5401
conn->bits.httpproxy = FALSE;
5402
conn->bits.proxy_user_passwd = FALSE;
5403
conn->bits.tunnel_proxy = FALSE;
5406
#endif /* CURL_DISABLE_PROXY */
5408
/*************************************************************
5409
* If the protocol is using SSL and HTTP proxy is used, we set
5410
* the tunnel_proxy bit.
5411
*************************************************************/
5412
if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy)
5413
conn->bits.tunnel_proxy = TRUE;
5415
/*************************************************************
5416
* Figure out the remote port number and fix it in the URL
5417
*************************************************************/
5418
result = parse_remote_port(data, conn);
5419
if(result != CURLE_OK)
5422
/* Check for overridden login details and set them accordingly so they
5423
they are known when protocol->setup_connection is called! */
5424
result = override_login(data, conn, &user, &passwd, &options);
5425
if(result != CURLE_OK)
5427
result = set_login(conn, user, passwd, options);
5428
if(result != CURLE_OK)
5431
/*************************************************************
5432
* Setup internals depending on protocol. Needs to be done after
5433
* we figured out what/if proxy to use.
5434
*************************************************************/
5435
result = setup_connection_internals(conn);
5436
if(result != CURLE_OK)
5439
conn->recv[FIRSTSOCKET] = Curl_recv_plain;
5440
conn->send[FIRSTSOCKET] = Curl_send_plain;
5441
conn->recv[SECONDARYSOCKET] = Curl_recv_plain;
5442
conn->send[SECONDARYSOCKET] = Curl_send_plain;
5444
/***********************************************************************
5445
* file: is a special case in that it doesn't need a network connection
5446
***********************************************************************/
5447
#ifndef CURL_DISABLE_FILE
5448
if(conn->handler->flags & PROTOPT_NONETWORK) {
5450
/* this is supposed to be the connect function so we better at least check
5451
that the file is present here! */
5452
DEBUGASSERT(conn->handler->connect_it);
5453
result = conn->handler->connect_it(conn, &done);
5455
/* Setup a "faked" transfer that'll do nothing */
5456
if(CURLE_OK == result) {
5458
conn->bits.tcpconnect[FIRSTSOCKET] = TRUE; /* we are "connected */
5460
ConnectionStore(data, conn);
5463
* Setup whatever necessary for a resumed transfer
5465
result = setup_range(data);
5467
DEBUGASSERT(conn->handler->done);
5468
/* we ignore the return code for the protocol-specific DONE */
5469
(void)conn->handler->done(conn, result, FALSE);
5473
Curl_setup_transfer(conn, -1, -1, FALSE, NULL, /* no download */
5474
-1, NULL); /* no upload */
5477
/* since we skip do_init() */
5484
/* Get a cloned copy of the SSL config situation stored in the
5485
connection struct. But to get this going nicely, we must first make
5486
sure that the strings in the master copy are pointing to the correct
5487
strings in the session handle strings array!
5489
Keep in mind that the pointers in the master copy are pointing to strings
5490
that will be freed as part of the SessionHandle struct, but all cloned
5491
copies will be separately allocated.
5493
data->set.ssl.CApath = data->set.str[STRING_SSL_CAPATH];
5494
data->set.ssl.CAfile = data->set.str[STRING_SSL_CAFILE];
5495
data->set.ssl.CRLfile = data->set.str[STRING_SSL_CRLFILE];
5496
data->set.ssl.issuercert = data->set.str[STRING_SSL_ISSUERCERT];
5497
data->set.ssl.random_file = data->set.str[STRING_SSL_RANDOM_FILE];
5498
data->set.ssl.egdsocket = data->set.str[STRING_SSL_EGDSOCKET];
5499
data->set.ssl.cipher_list = data->set.str[STRING_SSL_CIPHER_LIST];
5501
data->set.ssl.username = data->set.str[STRING_TLSAUTH_USERNAME];
5502
data->set.ssl.password = data->set.str[STRING_TLSAUTH_PASSWORD];
5505
if(!Curl_clone_ssl_config(&data->set.ssl, &conn->ssl_config)) {
5506
result = CURLE_OUT_OF_MEMORY;
5510
prune_dead_connections(data);
5512
/*************************************************************
5513
* Check the current list of connections to see if we can
5514
* re-use an already existing one or if we have to create a
5516
*************************************************************/
5518
/* reuse_fresh is TRUE if we are told to use a new connection by force, but
5519
we only acknowledge this option if this is not a re-used connection
5520
already (which happens due to follow-location or during a HTTP
5521
authentication phase). */
5522
if(data->set.reuse_fresh && !data->state.this_is_a_follow)
5525
reuse = ConnectionExists(data, conn, &conn_temp, &force_reuse);
5527
/* If we found a reusable connection, we may still want to
5528
open a new connection if we are pipelining. */
5529
if(reuse && !force_reuse && IsPipeliningPossible(data, conn_temp)) {
5530
size_t pipelen = conn_temp->send_pipe->size + conn_temp->recv_pipe->size;
5532
infof(data, "Found connection %ld, with requests in the pipe (%zu)\n",
5533
conn_temp->connection_id, pipelen);
5535
if(conn_temp->bundle->num_connections < max_host_connections &&
5536
data->state.conn_cache->num_connections < max_total_connections) {
5537
/* We want a new connection anyway */
5540
infof(data, "We can reuse, but we want a new connection anyway\n");
5547
* We already have a connection for this, we got the former connection
5548
* in the conn_temp variable and thus we need to cleanup the one we
5549
* just allocated before we can move along and use the previously
5552
conn_temp->inuse = TRUE; /* mark this as being in use so that no other
5553
handle in a multi stack may nick it */
5554
reuse_conn(conn, conn_temp);
5555
free(conn); /* we don't need this anymore */
5559
/* set a pointer to the hostname we display */
5560
fix_hostname(data, conn, &conn->host);
5562
infof(data, "Re-using existing connection! (#%ld) with host %s\n",
5563
conn->connection_id,
5564
conn->proxy.name?conn->proxy.dispname:conn->host.dispname);
5567
/* We have decided that we want a new connection. However, we may not
5568
be able to do that if we have reached the limit of how many
5569
connections we are allowed to open. */
5570
struct connectbundle *bundle;
5572
bundle = Curl_conncache_find_bundle(data->state.conn_cache,
5574
if(max_host_connections > 0 && bundle &&
5575
(bundle->num_connections >= max_host_connections)) {
5576
struct connectdata *conn_candidate;
5578
/* The bundle is full. Let's see if we can kill a connection. */
5579
conn_candidate = find_oldest_idle_connection_in_bundle(data, bundle);
5581
if(conn_candidate) {
5582
/* Set the connection's owner correctly, then kill it */
5583
conn_candidate->data = data;
5584
(void)Curl_disconnect(conn_candidate, /* dead_connection */ FALSE);
5587
no_connections_available = TRUE;
5590
if(max_total_connections > 0 &&
5591
(data->state.conn_cache->num_connections >= max_total_connections)) {
5592
struct connectdata *conn_candidate;
5594
/* The cache is full. Let's see if we can kill a connection. */
5595
conn_candidate = find_oldest_idle_connection(data);
5597
if(conn_candidate) {
5598
/* Set the connection's owner correctly, then kill it */
5599
conn_candidate->data = data;
5600
(void)Curl_disconnect(conn_candidate, /* dead_connection */ FALSE);
5603
no_connections_available = TRUE;
5607
if(no_connections_available) {
5608
infof(data, "No connections available.\n");
5613
result = CURLE_NO_CONNECTION_AVAILABLE;
5618
* This is a brand new connection, so let's store it in the connection
5621
ConnectionStore(data, conn);
5624
/* If NTLM is requested in a part of this connection, make sure we don't
5625
assume the state is fine as this is a fresh connection and NTLM is
5626
connection based. */
5627
if((data->state.authhost.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
5628
data->state.authhost.done) {
5629
infof(data, "NTLM picked AND auth done set, clear picked!\n");
5630
data->state.authhost.picked = CURLAUTH_NONE;
5632
if((data->state.authproxy.picked & (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
5633
data->state.authproxy.done) {
5634
infof(data, "NTLM-proxy picked AND auth done set, clear picked!\n");
5635
data->state.authproxy.picked = CURLAUTH_NONE;
5640
/* Mark the connection as used */
5643
/* Setup and init stuff before DO starts, in preparing for the transfer. */
5647
* Setup whatever necessary for a resumed transfer
5649
result = setup_range(data);
5653
/* Continue connectdata initialization here. */
5656
* Inherit the proper values from the urldata struct AFTER we have arranged
5657
* the persistent connection stuff
5659
conn->fread_func = data->set.fread_func;
5660
conn->fread_in = data->set.in;
5661
conn->seek_func = data->set.seek_func;
5662
conn->seek_client = data->set.seek_client;
5664
/*************************************************************
5665
* Resolve the address of the server or proxy
5666
*************************************************************/
5667
result = resolve_server(data, conn, async);
5671
Curl_safefree(options);
5672
Curl_safefree(passwd);
5673
Curl_safefree(user);
5674
Curl_safefree(proxy);
5678
/* Curl_setup_conn() is called after the name resolve initiated in
5679
* create_conn() is all done.
5681
* Curl_setup_conn() also handles reused connections
5683
* conn->data MUST already have been setup fine (in create_conn)
5686
CURLcode Curl_setup_conn(struct connectdata *conn,
5687
bool *protocol_done)
5689
CURLcode result = CURLE_OK;
5690
struct SessionHandle *data = conn->data;
5692
Curl_pgrsTime(data, TIMER_NAMELOOKUP);
5694
if(conn->handler->flags & PROTOPT_NONETWORK) {
5695
/* nothing to setup when not using a network */
5696
*protocol_done = TRUE;
5699
*protocol_done = FALSE; /* default to not done */
5701
/* set proxy_connect_closed to false unconditionally already here since it
5702
is used strictly to provide extra information to a parent function in the
5703
case of proxy CONNECT failures and we must make sure we don't have it
5704
lingering set from a previous invoke */
5705
conn->bits.proxy_connect_closed = FALSE;
5708
* Set user-agent. Used for HTTP, but since we can attempt to tunnel
5709
* basically anything through a http proxy we can't limit this based on
5712
if(data->set.str[STRING_USERAGENT]) {
5713
Curl_safefree(conn->allocptr.uagent);
5714
conn->allocptr.uagent =
5715
aprintf("User-Agent: %s\r\n", data->set.str[STRING_USERAGENT]);
5716
if(!conn->allocptr.uagent)
5717
return CURLE_OUT_OF_MEMORY;
5720
data->req.headerbytecount = 0;
5722
#ifdef CURL_DO_LINEEND_CONV
5723
data->state.crlf_conversions = 0; /* reset CRLF conversion counter */
5724
#endif /* CURL_DO_LINEEND_CONV */
5726
/* set start time here for timeout purposes in the connect procedure, it
5727
is later set again for the progress meter purpose */
5728
conn->now = Curl_tvnow();
5730
if(CURL_SOCKET_BAD == conn->sock[FIRSTSOCKET]) {
5731
conn->bits.tcpconnect[FIRSTSOCKET] = FALSE;
5732
result = Curl_connecthost(conn, conn->dns_entry);
5737
Curl_pgrsTime(data, TIMER_CONNECT); /* we're connected already */
5738
Curl_pgrsTime(data, TIMER_APPCONNECT); /* we're connected already */
5739
conn->bits.tcpconnect[FIRSTSOCKET] = TRUE;
5740
*protocol_done = TRUE;
5741
Curl_updateconninfo(conn, conn->sock[FIRSTSOCKET]);
5742
Curl_verboseconnect(conn);
5745
conn->now = Curl_tvnow(); /* time this *after* the connect is done, we
5746
set this here perhaps a second time */
5750
* This check is quite a hack. We're calling _fsetmode to fix the problem
5751
* with fwrite converting newline characters (you get mangled text files,
5752
* and corrupted binary files when you download to stdout and redirect it to
5756
if((data->set.out)->_handle == NULL) {
5757
_fsetmode(stdout, "b");
5764
CURLcode Curl_connect(struct SessionHandle *data,
5765
struct connectdata **in_connect,
5767
bool *protocol_done)
5771
*asyncp = FALSE; /* assume synchronous resolves by default */
5773
/* call the stuff that needs to be called */
5774
code = create_conn(data, in_connect, asyncp);
5776
if(CURLE_OK == code) {
5778
if((*in_connect)->send_pipe->size || (*in_connect)->recv_pipe->size)
5780
*protocol_done = TRUE;
5782
/* DNS resolution is done: that's either because this is a reused
5783
connection, in which case DNS was unnecessary, or because DNS
5784
really did finish already (synch resolver/fast async resolve) */
5785
code = Curl_setup_conn(*in_connect, protocol_done);
5789
if(code == CURLE_NO_CONNECTION_AVAILABLE) {
5794
if(code && *in_connect) {
5795
/* We're not allowed to return failure with memory left allocated
5796
in the connectdata struct, free those here */
5797
Curl_disconnect(*in_connect, FALSE); /* close the connection */
5798
*in_connect = NULL; /* return a NULL */
5804
CURLcode Curl_done(struct connectdata **connp,
5805
CURLcode status, /* an error if this is called after an
5806
error was detected */
5810
struct connectdata *conn;
5811
struct SessionHandle *data;
5813
DEBUGASSERT(*connp);
5819
/* Stop if Curl_done() has already been called */
5822
Curl_getoff_all_pipelines(data, conn);
5824
if((conn->send_pipe->size + conn->recv_pipe->size != 0 &&
5825
!data->set.reuse_forbid &&
5827
/* Stop if pipeline is not empty and we do not have to close
5831
conn->bits.done = TRUE; /* called just now! */
5833
/* Cleanup possible redirect junk */
5834
if(data->req.newurl) {
5835
free(data->req.newurl);
5836
data->req.newurl = NULL;
5838
if(data->req.location) {
5839
free(data->req.location);
5840
data->req.location = NULL;
5843
Curl_resolver_cancel(conn);
5845
if(conn->dns_entry) {
5846
Curl_resolv_unlock(data, conn->dns_entry); /* done with this */
5847
conn->dns_entry = NULL;
5851
case CURLE_ABORTED_BY_CALLBACK:
5852
case CURLE_READ_ERROR:
5853
case CURLE_WRITE_ERROR:
5854
/* When we're aborted due to a callback return code it basically have to
5855
be counted as premature as there is trouble ahead if we don't. We have
5856
many callbacks and protocols work differently, we could potentially do
5857
this more fine-grained in the future. */
5863
/* this calls the protocol-specific function pointer previously set */
5864
if(conn->handler->done)
5865
result = conn->handler->done(conn, status, premature);
5869
if(!result && Curl_pgrsDone(conn))
5870
result = CURLE_ABORTED_BY_CALLBACK;
5872
/* if the transfer was completed in a paused state there can be buffered
5873
data left to write and then kill */
5874
if(data->state.tempwrite) {
5875
free(data->state.tempwrite);
5876
data->state.tempwrite = NULL;
5879
/* if data->set.reuse_forbid is TRUE, it means the libcurl client has
5880
forced us to close this connection. This is ignored for requests taking
5881
place in a NTLM authentication handshake
5883
if conn->bits.close is TRUE, it means that the connection should be
5884
closed in spite of all our efforts to be nice, due to protocol
5885
restrictions in our or the server's end
5887
if premature is TRUE, it means this connection was said to be DONE before
5888
the entire request operation is complete and thus we can't know in what
5889
state it is for re-using, so we're forced to close it. In a perfect world
5890
we can add code that keep track of if we really must close it here or not,
5891
but currently we have no such detail knowledge.
5894
if((data->set.reuse_forbid && !(conn->ntlm.state == NTLMSTATE_TYPE2 ||
5895
conn->proxyntlm.state == NTLMSTATE_TYPE2))
5896
|| conn->bits.close || premature) {
5897
CURLcode res2 = Curl_disconnect(conn, premature); /* close connection */
5899
/* If we had an error already, make sure we return that one. But
5900
if we got a new error, return that. */
5905
/* the connection is no longer in use */
5906
if(ConnectionDone(data, conn)) {
5907
/* remember the most recently used connection */
5908
data->state.lastconnect = conn;
5910
infof(data, "Connection #%ld to host %s left intact\n",
5911
conn->connection_id,
5912
conn->bits.httpproxy?conn->proxy.dispname:conn->host.dispname);
5915
data->state.lastconnect = NULL;
5918
*connp = NULL; /* to make the caller of this function better detect that
5919
this was either closed or handed over to the connection
5920
cache here, and therefore cannot be used from this point on
5922
Curl_free_request_state(data);
5928
* do_init() inits the readwrite session. This is inited each time (in the DO
5929
* function before the protocol-specific DO functions are invoked) for a
5930
* transfer, sometimes multiple times on the same SessionHandle. Make sure
5931
* nothing in here depends on stuff that are setup dynamically for the
5935
static CURLcode do_init(struct connectdata *conn)
5937
struct SessionHandle *data = conn->data;
5938
struct SingleRequest *k = &data->req;
5940
conn->bits.done = FALSE; /* Curl_done() is not called yet */
5941
conn->bits.do_more = FALSE; /* by default there's no curl_do_more() to use */
5942
data->state.expect100header = FALSE;
5944
if(data->set.opt_no_body)
5945
/* in HTTP lingo, no body means using the HEAD request... */
5946
data->set.httpreq = HTTPREQ_HEAD;
5947
else if(HTTPREQ_HEAD == data->set.httpreq)
5948
/* ... but if unset there really is no perfect method that is the
5949
"opposite" of HEAD but in reality most people probably think GET
5950
then. The important thing is that we can't let it remain HEAD if the
5951
opt_no_body is set FALSE since then we'll behave wrong when getting
5953
data->set.httpreq = HTTPREQ_GET;
5955
k->start = Curl_tvnow(); /* start time */
5956
k->now = k->start; /* current time is now */
5957
k->header = TRUE; /* assume header */
5961
k->buf = data->state.buffer;
5962
k->uploadbuf = data->state.uploadbuffer;
5963
k->hbufp = data->state.headerbuff;
5964
k->ignorebody=FALSE;
5966
Curl_speedinit(data);
5968
Curl_pgrsSetUploadCounter(data, 0);
5969
Curl_pgrsSetDownloadCounter(data, 0);
5975
* do_complete is called when the DO actions are complete.
5977
* We init chunking and trailer bits to their default values here immediately
5978
* before receiving any header data for the current request in the pipeline.
5980
static void do_complete(struct connectdata *conn)
5982
conn->data->req.chunk=FALSE;
5983
conn->data->req.maxfd = (conn->sockfd>conn->writesockfd?
5984
conn->sockfd:conn->writesockfd)+1;
5985
Curl_pgrsTime(conn->data, TIMER_PRETRANSFER);
5988
CURLcode Curl_do(struct connectdata **connp, bool *done)
5990
CURLcode result=CURLE_OK;
5991
struct connectdata *conn = *connp;
5992
struct SessionHandle *data = conn->data;
5994
if(conn->handler->do_it) {
5995
/* generic protocol-specific function pointer set in curl_connect() */
5996
result = conn->handler->do_it(conn, done);
5998
/* This was formerly done in transfer.c, but we better do it here */
5999
if((CURLE_SEND_ERROR == result) && conn->bits.reuse) {
6001
* If the connection is using an easy handle, call reconnect
6002
* to re-establish the connection. Otherwise, let the multi logic
6003
* figure out how to re-establish the connection.
6006
result = Curl_reconnect_request(connp);
6008
if(result == CURLE_OK) {
6009
/* ... finally back to actually retry the DO phase */
6010
conn = *connp; /* re-assign conn since Curl_reconnect_request
6011
creates a new connection */
6012
result = conn->handler->do_it(conn, done);
6019
if((result == CURLE_OK) && *done)
6020
/* do_complete must be called after the protocol-specific DO function */
6027
* Curl_do_more() is called during the DO_MORE multi state. It is basically a
6028
* second stage DO state which (wrongly) was introduced to support FTP's
6029
* second connection.
6031
* TODO: A future libcurl should be able to work away this state.
6033
* 'complete' can return 0 for incomplete, 1 for done and -1 for go back to
6034
* DOING state there's more work to do!
6037
CURLcode Curl_do_more(struct connectdata *conn, int *complete)
6039
CURLcode result=CURLE_OK;
6043
if(conn->handler->do_more)
6044
result = conn->handler->do_more(conn, complete);
6046
if(!result && (*complete == 1))
6047
/* do_complete must be called after the protocol-specific DO function */