1*6236dae4SAndroid Build Coastguard Worker #ifndef HEADER_CURL_URLDATA_H 2*6236dae4SAndroid Build Coastguard Worker #define HEADER_CURL_URLDATA_H 3*6236dae4SAndroid Build Coastguard Worker /*************************************************************************** 4*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 5*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 6*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 7*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 8*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 9*6236dae4SAndroid Build Coastguard Worker * 10*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 11*6236dae4SAndroid Build Coastguard Worker * 12*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 13*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 14*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 17*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 18*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 21*6236dae4SAndroid Build Coastguard Worker * KIND, either express or implied. 22*6236dae4SAndroid Build Coastguard Worker * 23*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 24*6236dae4SAndroid Build Coastguard Worker * 25*6236dae4SAndroid Build Coastguard Worker ***************************************************************************/ 26*6236dae4SAndroid Build Coastguard Worker 27*6236dae4SAndroid Build Coastguard Worker /* This file is for lib internal stuff */ 28*6236dae4SAndroid Build Coastguard Worker 29*6236dae4SAndroid Build Coastguard Worker #include "curl_setup.h" 30*6236dae4SAndroid Build Coastguard Worker 31*6236dae4SAndroid Build Coastguard Worker #define PORT_FTP 21 32*6236dae4SAndroid Build Coastguard Worker #define PORT_FTPS 990 33*6236dae4SAndroid Build Coastguard Worker #define PORT_TELNET 23 34*6236dae4SAndroid Build Coastguard Worker #define PORT_HTTP 80 35*6236dae4SAndroid Build Coastguard Worker #define PORT_HTTPS 443 36*6236dae4SAndroid Build Coastguard Worker #define PORT_DICT 2628 37*6236dae4SAndroid Build Coastguard Worker #define PORT_LDAP 389 38*6236dae4SAndroid Build Coastguard Worker #define PORT_LDAPS 636 39*6236dae4SAndroid Build Coastguard Worker #define PORT_TFTP 69 40*6236dae4SAndroid Build Coastguard Worker #define PORT_SSH 22 41*6236dae4SAndroid Build Coastguard Worker #define PORT_IMAP 143 42*6236dae4SAndroid Build Coastguard Worker #define PORT_IMAPS 993 43*6236dae4SAndroid Build Coastguard Worker #define PORT_POP3 110 44*6236dae4SAndroid Build Coastguard Worker #define PORT_POP3S 995 45*6236dae4SAndroid Build Coastguard Worker #define PORT_SMB 445 46*6236dae4SAndroid Build Coastguard Worker #define PORT_SMBS 445 47*6236dae4SAndroid Build Coastguard Worker #define PORT_SMTP 25 48*6236dae4SAndroid Build Coastguard Worker #define PORT_SMTPS 465 /* sometimes called SSMTP */ 49*6236dae4SAndroid Build Coastguard Worker #define PORT_RTSP 554 50*6236dae4SAndroid Build Coastguard Worker #define PORT_RTMP 1935 51*6236dae4SAndroid Build Coastguard Worker #define PORT_RTMPT PORT_HTTP 52*6236dae4SAndroid Build Coastguard Worker #define PORT_RTMPS PORT_HTTPS 53*6236dae4SAndroid Build Coastguard Worker #define PORT_GOPHER 70 54*6236dae4SAndroid Build Coastguard Worker #define PORT_MQTT 1883 55*6236dae4SAndroid Build Coastguard Worker 56*6236dae4SAndroid Build Coastguard Worker struct curl_trc_featt; 57*6236dae4SAndroid Build Coastguard Worker 58*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ECH 59*6236dae4SAndroid Build Coastguard Worker /* CURLECH_ bits for the tls_ech option */ 60*6236dae4SAndroid Build Coastguard Worker # define CURLECH_DISABLE (1<<0) 61*6236dae4SAndroid Build Coastguard Worker # define CURLECH_GREASE (1<<1) 62*6236dae4SAndroid Build Coastguard Worker # define CURLECH_ENABLE (1<<2) 63*6236dae4SAndroid Build Coastguard Worker # define CURLECH_HARD (1<<3) 64*6236dae4SAndroid Build Coastguard Worker # define CURLECH_CLA_CFG (1<<4) 65*6236dae4SAndroid Build Coastguard Worker #endif 66*6236dae4SAndroid Build Coastguard Worker 67*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_WEBSOCKETS 68*6236dae4SAndroid Build Coastguard Worker /* CURLPROTO_GOPHERS (29) is the highest publicly used protocol bit number, 69*6236dae4SAndroid Build Coastguard Worker * the rest are internal information. If we use higher bits we only do this on 70*6236dae4SAndroid Build Coastguard Worker * platforms that have a >= 64-bit type and then we use such a type for the 71*6236dae4SAndroid Build Coastguard Worker * protocol fields in the protocol handler. 72*6236dae4SAndroid Build Coastguard Worker */ 73*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_WS (1<<30) 74*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_WSS ((curl_prot_t)1<<31) 75*6236dae4SAndroid Build Coastguard Worker #else 76*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_WS 0 77*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_WSS 0 78*6236dae4SAndroid Build Coastguard Worker #endif 79*6236dae4SAndroid Build Coastguard Worker 80*6236dae4SAndroid Build Coastguard Worker /* the default protocols accepting a redirect to */ 81*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_REDIR (CURLPROTO_HTTP | CURLPROTO_HTTPS | CURLPROTO_FTP | \ 82*6236dae4SAndroid Build Coastguard Worker CURLPROTO_FTPS) 83*6236dae4SAndroid Build Coastguard Worker 84*6236dae4SAndroid Build Coastguard Worker /* This should be undefined once we need bit 32 or higher */ 85*6236dae4SAndroid Build Coastguard Worker #define PROTO_TYPE_SMALL 86*6236dae4SAndroid Build Coastguard Worker 87*6236dae4SAndroid Build Coastguard Worker #ifndef PROTO_TYPE_SMALL 88*6236dae4SAndroid Build Coastguard Worker typedef curl_off_t curl_prot_t; 89*6236dae4SAndroid Build Coastguard Worker #else 90*6236dae4SAndroid Build Coastguard Worker typedef unsigned int curl_prot_t; 91*6236dae4SAndroid Build Coastguard Worker #endif 92*6236dae4SAndroid Build Coastguard Worker 93*6236dae4SAndroid Build Coastguard Worker /* This mask is for all the old protocols that are provided and defined in the 94*6236dae4SAndroid Build Coastguard Worker public header and shall exclude protocols added since which are not exposed 95*6236dae4SAndroid Build Coastguard Worker in the API */ 96*6236dae4SAndroid Build Coastguard Worker #define CURLPROTO_MASK (0x3ffffff) 97*6236dae4SAndroid Build Coastguard Worker 98*6236dae4SAndroid Build Coastguard Worker #define DICT_MATCH "/MATCH:" 99*6236dae4SAndroid Build Coastguard Worker #define DICT_MATCH2 "/M:" 100*6236dae4SAndroid Build Coastguard Worker #define DICT_MATCH3 "/FIND:" 101*6236dae4SAndroid Build Coastguard Worker #define DICT_DEFINE "/DEFINE:" 102*6236dae4SAndroid Build Coastguard Worker #define DICT_DEFINE2 "/D:" 103*6236dae4SAndroid Build Coastguard Worker #define DICT_DEFINE3 "/LOOKUP:" 104*6236dae4SAndroid Build Coastguard Worker 105*6236dae4SAndroid Build Coastguard Worker #define CURL_DEFAULT_USER "anonymous" 106*6236dae4SAndroid Build Coastguard Worker #define CURL_DEFAULT_PASSWORD "[email protected]" 107*6236dae4SAndroid Build Coastguard Worker 108*6236dae4SAndroid Build Coastguard Worker #if !defined(_WIN32) && !defined(MSDOS) && !defined(__EMX__) 109*6236dae4SAndroid Build Coastguard Worker /* do FTP line-end CRLF => LF conversions on platforms that prefer LF-only. It 110*6236dae4SAndroid Build Coastguard Worker also means: keep CRLF line endings on the CRLF platforms */ 111*6236dae4SAndroid Build Coastguard Worker #define CURL_PREFER_LF_LINEENDS 112*6236dae4SAndroid Build Coastguard Worker #endif 113*6236dae4SAndroid Build Coastguard Worker 114*6236dae4SAndroid Build Coastguard Worker /* Convenience defines for checking protocols or their SSL based version. Each 115*6236dae4SAndroid Build Coastguard Worker protocol handler should only ever have a single CURLPROTO_ in its protocol 116*6236dae4SAndroid Build Coastguard Worker field. */ 117*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_HTTP (CURLPROTO_HTTP|CURLPROTO_HTTPS|CURLPROTO_WS| \ 118*6236dae4SAndroid Build Coastguard Worker CURLPROTO_WSS) 119*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_FTP (CURLPROTO_FTP|CURLPROTO_FTPS) 120*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S) 121*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_SMB (CURLPROTO_SMB|CURLPROTO_SMBS) 122*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS) 123*6236dae4SAndroid Build Coastguard Worker #define PROTO_FAMILY_SSH (CURLPROTO_SCP|CURLPROTO_SFTP) 124*6236dae4SAndroid Build Coastguard Worker 125*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) || \ 126*6236dae4SAndroid Build Coastguard Worker !defined(CURL_DISABLE_POP3) || !defined(CURL_DISABLE_FILE) 127*6236dae4SAndroid Build Coastguard Worker /* these protocols support CURLOPT_DIRLISTONLY */ 128*6236dae4SAndroid Build Coastguard Worker #define CURL_LIST_ONLY_PROTOCOL 1 129*6236dae4SAndroid Build Coastguard Worker #endif 130*6236dae4SAndroid Build Coastguard Worker 131*6236dae4SAndroid Build Coastguard Worker #define DEFAULT_CONNCACHE_SIZE 5 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard Worker /* length of longest IPv6 address string including the trailing null */ 134*6236dae4SAndroid Build Coastguard Worker #define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255") 135*6236dae4SAndroid Build Coastguard Worker 136*6236dae4SAndroid Build Coastguard Worker /* Default FTP/IMAP etc response timeout in milliseconds */ 137*6236dae4SAndroid Build Coastguard Worker #define RESP_TIMEOUT (120*1000) 138*6236dae4SAndroid Build Coastguard Worker 139*6236dae4SAndroid Build Coastguard Worker /* Max string input length is a precaution against abuse and to detect junk 140*6236dae4SAndroid Build Coastguard Worker input easier and better. */ 141*6236dae4SAndroid Build Coastguard Worker #define CURL_MAX_INPUT_LENGTH 8000000 142*6236dae4SAndroid Build Coastguard Worker 143*6236dae4SAndroid Build Coastguard Worker 144*6236dae4SAndroid Build Coastguard Worker #include "cookie.h" 145*6236dae4SAndroid Build Coastguard Worker #include "psl.h" 146*6236dae4SAndroid Build Coastguard Worker #include "formdata.h" 147*6236dae4SAndroid Build Coastguard Worker 148*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN_H 149*6236dae4SAndroid Build Coastguard Worker #include <netinet/in.h> 150*6236dae4SAndroid Build Coastguard Worker #endif 151*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_NETINET_IN6_H 152*6236dae4SAndroid Build Coastguard Worker #include <netinet/in6.h> 153*6236dae4SAndroid Build Coastguard Worker #endif 154*6236dae4SAndroid Build Coastguard Worker 155*6236dae4SAndroid Build Coastguard Worker #include "timeval.h" 156*6236dae4SAndroid Build Coastguard Worker 157*6236dae4SAndroid Build Coastguard Worker #include <curl/curl.h> 158*6236dae4SAndroid Build Coastguard Worker 159*6236dae4SAndroid Build Coastguard Worker #include "http_chunks.h" /* for the structs and enum stuff */ 160*6236dae4SAndroid Build Coastguard Worker #include "hostip.h" 161*6236dae4SAndroid Build Coastguard Worker #include "hash.h" 162*6236dae4SAndroid Build Coastguard Worker #include "splay.h" 163*6236dae4SAndroid Build Coastguard Worker #include "dynbuf.h" 164*6236dae4SAndroid Build Coastguard Worker #include "dynhds.h" 165*6236dae4SAndroid Build Coastguard Worker #include "request.h" 166*6236dae4SAndroid Build Coastguard Worker #include "netrc.h" 167*6236dae4SAndroid Build Coastguard Worker 168*6236dae4SAndroid Build Coastguard Worker /* return the count of bytes sent, or -1 on error */ 169*6236dae4SAndroid Build Coastguard Worker typedef ssize_t (Curl_send)(struct Curl_easy *data, /* transfer */ 170*6236dae4SAndroid Build Coastguard Worker int sockindex, /* socketindex */ 171*6236dae4SAndroid Build Coastguard Worker const void *buf, /* data to write */ 172*6236dae4SAndroid Build Coastguard Worker size_t len, /* max amount to write */ 173*6236dae4SAndroid Build Coastguard Worker bool eos, /* last chunk */ 174*6236dae4SAndroid Build Coastguard Worker CURLcode *err); /* error to return */ 175*6236dae4SAndroid Build Coastguard Worker 176*6236dae4SAndroid Build Coastguard Worker /* return the count of bytes read, or -1 on error */ 177*6236dae4SAndroid Build Coastguard Worker typedef ssize_t (Curl_recv)(struct Curl_easy *data, /* transfer */ 178*6236dae4SAndroid Build Coastguard Worker int sockindex, /* socketindex */ 179*6236dae4SAndroid Build Coastguard Worker char *buf, /* store data here */ 180*6236dae4SAndroid Build Coastguard Worker size_t len, /* max amount to read */ 181*6236dae4SAndroid Build Coastguard Worker CURLcode *err); /* error to return */ 182*6236dae4SAndroid Build Coastguard Worker 183*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER 184*6236dae4SAndroid Build Coastguard Worker typedef CURLcode (*Curl_datastream)(struct Curl_easy *data, 185*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, 186*6236dae4SAndroid Build Coastguard Worker int *didwhat, 187*6236dae4SAndroid Build Coastguard Worker int select_res); 188*6236dae4SAndroid Build Coastguard Worker #endif 189*6236dae4SAndroid Build Coastguard Worker 190*6236dae4SAndroid Build Coastguard Worker #include "mime.h" 191*6236dae4SAndroid Build Coastguard Worker #include "imap.h" 192*6236dae4SAndroid Build Coastguard Worker #include "pop3.h" 193*6236dae4SAndroid Build Coastguard Worker #include "smtp.h" 194*6236dae4SAndroid Build Coastguard Worker #include "ftp.h" 195*6236dae4SAndroid Build Coastguard Worker #include "file.h" 196*6236dae4SAndroid Build Coastguard Worker #include "vssh/ssh.h" 197*6236dae4SAndroid Build Coastguard Worker #include "http.h" 198*6236dae4SAndroid Build Coastguard Worker #include "rtsp.h" 199*6236dae4SAndroid Build Coastguard Worker #include "smb.h" 200*6236dae4SAndroid Build Coastguard Worker #include "mqtt.h" 201*6236dae4SAndroid Build Coastguard Worker #include "ftplistparser.h" 202*6236dae4SAndroid Build Coastguard Worker #include "multihandle.h" 203*6236dae4SAndroid Build Coastguard Worker #include "c-hyper.h" 204*6236dae4SAndroid Build Coastguard Worker #include "cf-socket.h" 205*6236dae4SAndroid Build Coastguard Worker 206*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI 207*6236dae4SAndroid Build Coastguard Worker # ifdef HAVE_GSSGNU 208*6236dae4SAndroid Build Coastguard Worker # include <gss.h> 209*6236dae4SAndroid Build Coastguard Worker # elif defined HAVE_GSSAPI_GSSAPI_H 210*6236dae4SAndroid Build Coastguard Worker # include <gssapi/gssapi.h> 211*6236dae4SAndroid Build Coastguard Worker # else 212*6236dae4SAndroid Build Coastguard Worker # include <gssapi.h> 213*6236dae4SAndroid Build Coastguard Worker # endif 214*6236dae4SAndroid Build Coastguard Worker # ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H 215*6236dae4SAndroid Build Coastguard Worker # include <gssapi/gssapi_generic.h> 216*6236dae4SAndroid Build Coastguard Worker # endif 217*6236dae4SAndroid Build Coastguard Worker #endif 218*6236dae4SAndroid Build Coastguard Worker 219*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBSSH2 220*6236dae4SAndroid Build Coastguard Worker #include <libssh2.h> 221*6236dae4SAndroid Build Coastguard Worker #include <libssh2_sftp.h> 222*6236dae4SAndroid Build Coastguard Worker #endif /* USE_LIBSSH2 */ 223*6236dae4SAndroid Build Coastguard Worker 224*6236dae4SAndroid Build Coastguard Worker #define READBUFFER_SIZE CURL_MAX_WRITE_SIZE 225*6236dae4SAndroid Build Coastguard Worker #define READBUFFER_MAX CURL_MAX_READ_SIZE 226*6236dae4SAndroid Build Coastguard Worker #define READBUFFER_MIN 1024 227*6236dae4SAndroid Build Coastguard Worker 228*6236dae4SAndroid Build Coastguard Worker /* The default upload buffer size, should not be smaller than 229*6236dae4SAndroid Build Coastguard Worker CURL_MAX_WRITE_SIZE, as it needs to hold a full buffer as could be sent in 230*6236dae4SAndroid Build Coastguard Worker a write callback. 231*6236dae4SAndroid Build Coastguard Worker 232*6236dae4SAndroid Build Coastguard Worker The size was 16KB for many years but was bumped to 64KB because it makes 233*6236dae4SAndroid Build Coastguard Worker libcurl able to do significantly faster uploads in some circumstances. Even 234*6236dae4SAndroid Build Coastguard Worker larger buffers can help further, but this is deemed a fair memory/speed 235*6236dae4SAndroid Build Coastguard Worker compromise. */ 236*6236dae4SAndroid Build Coastguard Worker #define UPLOADBUFFER_DEFAULT 65536 237*6236dae4SAndroid Build Coastguard Worker #define UPLOADBUFFER_MAX (2*1024*1024) 238*6236dae4SAndroid Build Coastguard Worker #define UPLOADBUFFER_MIN CURL_MAX_WRITE_SIZE 239*6236dae4SAndroid Build Coastguard Worker 240*6236dae4SAndroid Build Coastguard Worker #define CURLEASY_MAGIC_NUMBER 0xc0dedbadU 241*6236dae4SAndroid Build Coastguard Worker #ifdef DEBUGBUILD 242*6236dae4SAndroid Build Coastguard Worker /* On a debug build, we want to fail hard on easy handles that 243*6236dae4SAndroid Build Coastguard Worker * are not NULL, but no longer have the MAGIC touch. This gives 244*6236dae4SAndroid Build Coastguard Worker * us early warning on things only discovered by valgrind otherwise. */ 245*6236dae4SAndroid Build Coastguard Worker #define GOOD_EASY_HANDLE(x) \ 246*6236dae4SAndroid Build Coastguard Worker (((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))? TRUE: \ 247*6236dae4SAndroid Build Coastguard Worker (DEBUGASSERT(!(x)), FALSE)) 248*6236dae4SAndroid Build Coastguard Worker #else 249*6236dae4SAndroid Build Coastguard Worker #define GOOD_EASY_HANDLE(x) \ 250*6236dae4SAndroid Build Coastguard Worker ((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER)) 251*6236dae4SAndroid Build Coastguard Worker #endif 252*6236dae4SAndroid Build Coastguard Worker 253*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI 254*6236dae4SAndroid Build Coastguard Worker /* Types needed for krb5-ftp connections */ 255*6236dae4SAndroid Build Coastguard Worker struct krb5buffer { 256*6236dae4SAndroid Build Coastguard Worker struct dynbuf buf; 257*6236dae4SAndroid Build Coastguard Worker size_t index; 258*6236dae4SAndroid Build Coastguard Worker BIT(eof_flag); 259*6236dae4SAndroid Build Coastguard Worker }; 260*6236dae4SAndroid Build Coastguard Worker 261*6236dae4SAndroid Build Coastguard Worker enum protection_level { 262*6236dae4SAndroid Build Coastguard Worker PROT_NONE, /* first in list */ 263*6236dae4SAndroid Build Coastguard Worker PROT_CLEAR, 264*6236dae4SAndroid Build Coastguard Worker PROT_SAFE, 265*6236dae4SAndroid Build Coastguard Worker PROT_CONFIDENTIAL, 266*6236dae4SAndroid Build Coastguard Worker PROT_PRIVATE, 267*6236dae4SAndroid Build Coastguard Worker PROT_CMD, 268*6236dae4SAndroid Build Coastguard Worker PROT_LAST /* last in list */ 269*6236dae4SAndroid Build Coastguard Worker }; 270*6236dae4SAndroid Build Coastguard Worker #endif 271*6236dae4SAndroid Build Coastguard Worker 272*6236dae4SAndroid Build Coastguard Worker /* SSL backend-specific data; declared differently by each SSL backend */ 273*6236dae4SAndroid Build Coastguard Worker struct ssl_backend_data; 274*6236dae4SAndroid Build Coastguard Worker 275*6236dae4SAndroid Build Coastguard Worker typedef enum { 276*6236dae4SAndroid Build Coastguard Worker CURL_SSL_PEER_DNS, 277*6236dae4SAndroid Build Coastguard Worker CURL_SSL_PEER_IPV4, 278*6236dae4SAndroid Build Coastguard Worker CURL_SSL_PEER_IPV6 279*6236dae4SAndroid Build Coastguard Worker } ssl_peer_type; 280*6236dae4SAndroid Build Coastguard Worker 281*6236dae4SAndroid Build Coastguard Worker struct ssl_peer { 282*6236dae4SAndroid Build Coastguard Worker char *hostname; /* hostname for verification */ 283*6236dae4SAndroid Build Coastguard Worker char *dispname; /* display version of hostname */ 284*6236dae4SAndroid Build Coastguard Worker char *sni; /* SNI version of hostname or NULL if not usable */ 285*6236dae4SAndroid Build Coastguard Worker ssl_peer_type type; /* type of the peer information */ 286*6236dae4SAndroid Build Coastguard Worker int port; /* port we are talking to */ 287*6236dae4SAndroid Build Coastguard Worker int transport; /* one of TRNSPRT_* defines */ 288*6236dae4SAndroid Build Coastguard Worker }; 289*6236dae4SAndroid Build Coastguard Worker 290*6236dae4SAndroid Build Coastguard Worker struct ssl_primary_config { 291*6236dae4SAndroid Build Coastguard Worker char *CApath; /* certificate dir (does not work on Windows) */ 292*6236dae4SAndroid Build Coastguard Worker char *CAfile; /* certificate to verify peer against */ 293*6236dae4SAndroid Build Coastguard Worker char *issuercert; /* optional issuer certificate filename */ 294*6236dae4SAndroid Build Coastguard Worker char *clientcert; 295*6236dae4SAndroid Build Coastguard Worker char *cipher_list; /* list of ciphers to use */ 296*6236dae4SAndroid Build Coastguard Worker char *cipher_list13; /* list of TLS 1.3 cipher suites to use */ 297*6236dae4SAndroid Build Coastguard Worker char *pinned_key; 298*6236dae4SAndroid Build Coastguard Worker char *CRLfile; /* CRL to check certificate revocation */ 299*6236dae4SAndroid Build Coastguard Worker struct curl_blob *cert_blob; 300*6236dae4SAndroid Build Coastguard Worker struct curl_blob *ca_info_blob; 301*6236dae4SAndroid Build Coastguard Worker struct curl_blob *issuercert_blob; 302*6236dae4SAndroid Build Coastguard Worker #ifdef USE_TLS_SRP 303*6236dae4SAndroid Build Coastguard Worker char *username; /* TLS username (for, e.g., SRP) */ 304*6236dae4SAndroid Build Coastguard Worker char *password; /* TLS password (for, e.g., SRP) */ 305*6236dae4SAndroid Build Coastguard Worker #endif 306*6236dae4SAndroid Build Coastguard Worker char *curves; /* list of curves to use */ 307*6236dae4SAndroid Build Coastguard Worker unsigned char ssl_options; /* the CURLOPT_SSL_OPTIONS bitmask */ 308*6236dae4SAndroid Build Coastguard Worker unsigned int version_max; /* max supported version the client wants to use */ 309*6236dae4SAndroid Build Coastguard Worker unsigned char version; /* what version the client wants to use */ 310*6236dae4SAndroid Build Coastguard Worker BIT(verifypeer); /* set TRUE if this is desired */ 311*6236dae4SAndroid Build Coastguard Worker BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */ 312*6236dae4SAndroid Build Coastguard Worker BIT(verifystatus); /* set TRUE if certificate status must be checked */ 313*6236dae4SAndroid Build Coastguard Worker BIT(cache_session); /* cache session or not */ 314*6236dae4SAndroid Build Coastguard Worker }; 315*6236dae4SAndroid Build Coastguard Worker 316*6236dae4SAndroid Build Coastguard Worker struct ssl_config_data { 317*6236dae4SAndroid Build Coastguard Worker struct ssl_primary_config primary; 318*6236dae4SAndroid Build Coastguard Worker long certverifyresult; /* result from the certificate verification */ 319*6236dae4SAndroid Build Coastguard Worker curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */ 320*6236dae4SAndroid Build Coastguard Worker void *fsslctxp; /* parameter for call back */ 321*6236dae4SAndroid Build Coastguard Worker char *cert_type; /* format for certificate (default: PEM)*/ 322*6236dae4SAndroid Build Coastguard Worker char *key; /* private key filename */ 323*6236dae4SAndroid Build Coastguard Worker struct curl_blob *key_blob; 324*6236dae4SAndroid Build Coastguard Worker char *key_type; /* format for private key (default: PEM) */ 325*6236dae4SAndroid Build Coastguard Worker char *key_passwd; /* plain text private key password */ 326*6236dae4SAndroid Build Coastguard Worker BIT(certinfo); /* gather lots of certificate info */ 327*6236dae4SAndroid Build Coastguard Worker BIT(falsestart); 328*6236dae4SAndroid Build Coastguard Worker BIT(earlydata); /* use tls1.3 early data */ 329*6236dae4SAndroid Build Coastguard Worker BIT(enable_beast); /* allow this flaw for interoperability's sake */ 330*6236dae4SAndroid Build Coastguard Worker BIT(no_revoke); /* disable SSL certificate revocation checks */ 331*6236dae4SAndroid Build Coastguard Worker BIT(no_partialchain); /* do not accept partial certificate chains */ 332*6236dae4SAndroid Build Coastguard Worker BIT(revoke_best_effort); /* ignore SSL revocation offline/missing revocation 333*6236dae4SAndroid Build Coastguard Worker list errors */ 334*6236dae4SAndroid Build Coastguard Worker BIT(native_ca_store); /* use the native ca store of operating system */ 335*6236dae4SAndroid Build Coastguard Worker BIT(auto_client_cert); /* automatically locate and use a client 336*6236dae4SAndroid Build Coastguard Worker certificate for authentication (Schannel) */ 337*6236dae4SAndroid Build Coastguard Worker }; 338*6236dae4SAndroid Build Coastguard Worker 339*6236dae4SAndroid Build Coastguard Worker struct ssl_general_config { 340*6236dae4SAndroid Build Coastguard Worker size_t max_ssl_sessions; /* SSL session id cache size */ 341*6236dae4SAndroid Build Coastguard Worker int ca_cache_timeout; /* Certificate store cache timeout (seconds) */ 342*6236dae4SAndroid Build Coastguard Worker }; 343*6236dae4SAndroid Build Coastguard Worker 344*6236dae4SAndroid Build Coastguard Worker typedef void Curl_ssl_sessionid_dtor(void *sessionid, size_t idsize); 345*6236dae4SAndroid Build Coastguard Worker 346*6236dae4SAndroid Build Coastguard Worker /* information stored about one single SSL session */ 347*6236dae4SAndroid Build Coastguard Worker struct Curl_ssl_session { 348*6236dae4SAndroid Build Coastguard Worker char *name; /* hostname for which this ID was used */ 349*6236dae4SAndroid Build Coastguard Worker char *conn_to_host; /* hostname for the connection (may be NULL) */ 350*6236dae4SAndroid Build Coastguard Worker const char *scheme; /* protocol scheme used */ 351*6236dae4SAndroid Build Coastguard Worker char *alpn; /* APLN TLS negotiated protocol string */ 352*6236dae4SAndroid Build Coastguard Worker void *sessionid; /* as returned from the SSL layer */ 353*6236dae4SAndroid Build Coastguard Worker size_t idsize; /* if known, otherwise 0 */ 354*6236dae4SAndroid Build Coastguard Worker Curl_ssl_sessionid_dtor *sessionid_free; /* free `sessionid` callback */ 355*6236dae4SAndroid Build Coastguard Worker long age; /* just a number, the higher the more recent */ 356*6236dae4SAndroid Build Coastguard Worker int remote_port; /* remote port */ 357*6236dae4SAndroid Build Coastguard Worker int conn_to_port; /* remote port for the connection (may be -1) */ 358*6236dae4SAndroid Build Coastguard Worker int transport; /* TCP or QUIC */ 359*6236dae4SAndroid Build Coastguard Worker struct ssl_primary_config ssl_config; /* setup for this session */ 360*6236dae4SAndroid Build Coastguard Worker }; 361*6236dae4SAndroid Build Coastguard Worker 362*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WINDOWS_SSPI 363*6236dae4SAndroid Build Coastguard Worker #include "curl_sspi.h" 364*6236dae4SAndroid Build Coastguard Worker #endif 365*6236dae4SAndroid Build Coastguard Worker 366*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DIGEST_AUTH 367*6236dae4SAndroid Build Coastguard Worker /* Struct used for Digest challenge-response authentication */ 368*6236dae4SAndroid Build Coastguard Worker struct digestdata { 369*6236dae4SAndroid Build Coastguard Worker #if defined(USE_WINDOWS_SSPI) 370*6236dae4SAndroid Build Coastguard Worker BYTE *input_token; 371*6236dae4SAndroid Build Coastguard Worker size_t input_token_len; 372*6236dae4SAndroid Build Coastguard Worker CtxtHandle *http_context; 373*6236dae4SAndroid Build Coastguard Worker /* copy of user/passwd used to make the identity for http_context. 374*6236dae4SAndroid Build Coastguard Worker either may be NULL. */ 375*6236dae4SAndroid Build Coastguard Worker char *user; 376*6236dae4SAndroid Build Coastguard Worker char *passwd; 377*6236dae4SAndroid Build Coastguard Worker #else 378*6236dae4SAndroid Build Coastguard Worker char *nonce; 379*6236dae4SAndroid Build Coastguard Worker char *cnonce; 380*6236dae4SAndroid Build Coastguard Worker char *realm; 381*6236dae4SAndroid Build Coastguard Worker char *opaque; 382*6236dae4SAndroid Build Coastguard Worker char *qop; 383*6236dae4SAndroid Build Coastguard Worker char *algorithm; 384*6236dae4SAndroid Build Coastguard Worker int nc; /* nonce count */ 385*6236dae4SAndroid Build Coastguard Worker unsigned char algo; 386*6236dae4SAndroid Build Coastguard Worker BIT(stale); /* set true for re-negotiation */ 387*6236dae4SAndroid Build Coastguard Worker BIT(userhash); 388*6236dae4SAndroid Build Coastguard Worker #endif 389*6236dae4SAndroid Build Coastguard Worker }; 390*6236dae4SAndroid Build Coastguard Worker #endif 391*6236dae4SAndroid Build Coastguard Worker 392*6236dae4SAndroid Build Coastguard Worker typedef enum { 393*6236dae4SAndroid Build Coastguard Worker NTLMSTATE_NONE, 394*6236dae4SAndroid Build Coastguard Worker NTLMSTATE_TYPE1, 395*6236dae4SAndroid Build Coastguard Worker NTLMSTATE_TYPE2, 396*6236dae4SAndroid Build Coastguard Worker NTLMSTATE_TYPE3, 397*6236dae4SAndroid Build Coastguard Worker NTLMSTATE_LAST 398*6236dae4SAndroid Build Coastguard Worker } curlntlm; 399*6236dae4SAndroid Build Coastguard Worker 400*6236dae4SAndroid Build Coastguard Worker typedef enum { 401*6236dae4SAndroid Build Coastguard Worker GSS_AUTHNONE, 402*6236dae4SAndroid Build Coastguard Worker GSS_AUTHRECV, 403*6236dae4SAndroid Build Coastguard Worker GSS_AUTHSENT, 404*6236dae4SAndroid Build Coastguard Worker GSS_AUTHDONE, 405*6236dae4SAndroid Build Coastguard Worker GSS_AUTHSUCC 406*6236dae4SAndroid Build Coastguard Worker } curlnegotiate; 407*6236dae4SAndroid Build Coastguard Worker 408*6236dae4SAndroid Build Coastguard Worker /* Struct used for GSSAPI (Kerberos V5) authentication */ 409*6236dae4SAndroid Build Coastguard Worker #if defined(USE_KERBEROS5) 410*6236dae4SAndroid Build Coastguard Worker struct kerberos5data { 411*6236dae4SAndroid Build Coastguard Worker #if defined(USE_WINDOWS_SSPI) 412*6236dae4SAndroid Build Coastguard Worker CredHandle *credentials; 413*6236dae4SAndroid Build Coastguard Worker CtxtHandle *context; 414*6236dae4SAndroid Build Coastguard Worker TCHAR *spn; 415*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY identity; 416*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY *p_identity; 417*6236dae4SAndroid Build Coastguard Worker size_t token_max; 418*6236dae4SAndroid Build Coastguard Worker BYTE *output_token; 419*6236dae4SAndroid Build Coastguard Worker #else 420*6236dae4SAndroid Build Coastguard Worker gss_ctx_id_t context; 421*6236dae4SAndroid Build Coastguard Worker gss_name_t spn; 422*6236dae4SAndroid Build Coastguard Worker #endif 423*6236dae4SAndroid Build Coastguard Worker }; 424*6236dae4SAndroid Build Coastguard Worker #endif 425*6236dae4SAndroid Build Coastguard Worker 426*6236dae4SAndroid Build Coastguard Worker /* Struct used for SCRAM-SHA-1 authentication */ 427*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL 428*6236dae4SAndroid Build Coastguard Worker #include <gsasl.h> 429*6236dae4SAndroid Build Coastguard Worker struct gsasldata { 430*6236dae4SAndroid Build Coastguard Worker Gsasl *ctx; 431*6236dae4SAndroid Build Coastguard Worker Gsasl_session *client; 432*6236dae4SAndroid Build Coastguard Worker }; 433*6236dae4SAndroid Build Coastguard Worker #endif 434*6236dae4SAndroid Build Coastguard Worker 435*6236dae4SAndroid Build Coastguard Worker /* Struct used for NTLM challenge-response authentication */ 436*6236dae4SAndroid Build Coastguard Worker #if defined(USE_NTLM) 437*6236dae4SAndroid Build Coastguard Worker struct ntlmdata { 438*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WINDOWS_SSPI 439*6236dae4SAndroid Build Coastguard Worker /* The sslContext is used for the Schannel bindings. The 440*6236dae4SAndroid Build Coastguard Worker * api is available on the Windows 7 SDK and later. 441*6236dae4SAndroid Build Coastguard Worker */ 442*6236dae4SAndroid Build Coastguard Worker #ifdef SECPKG_ATTR_ENDPOINT_BINDINGS 443*6236dae4SAndroid Build Coastguard Worker CtxtHandle *sslContext; 444*6236dae4SAndroid Build Coastguard Worker #endif 445*6236dae4SAndroid Build Coastguard Worker CredHandle *credentials; 446*6236dae4SAndroid Build Coastguard Worker CtxtHandle *context; 447*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY identity; 448*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY *p_identity; 449*6236dae4SAndroid Build Coastguard Worker size_t token_max; 450*6236dae4SAndroid Build Coastguard Worker BYTE *output_token; 451*6236dae4SAndroid Build Coastguard Worker BYTE *input_token; 452*6236dae4SAndroid Build Coastguard Worker size_t input_token_len; 453*6236dae4SAndroid Build Coastguard Worker TCHAR *spn; 454*6236dae4SAndroid Build Coastguard Worker #else 455*6236dae4SAndroid Build Coastguard Worker unsigned int flags; 456*6236dae4SAndroid Build Coastguard Worker unsigned char nonce[8]; 457*6236dae4SAndroid Build Coastguard Worker unsigned int target_info_len; 458*6236dae4SAndroid Build Coastguard Worker void *target_info; /* TargetInfo received in the NTLM type-2 message */ 459*6236dae4SAndroid Build Coastguard Worker #endif 460*6236dae4SAndroid Build Coastguard Worker }; 461*6236dae4SAndroid Build Coastguard Worker #endif 462*6236dae4SAndroid Build Coastguard Worker 463*6236dae4SAndroid Build Coastguard Worker /* Struct used for Negotiate (SPNEGO) authentication */ 464*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SPNEGO 465*6236dae4SAndroid Build Coastguard Worker struct negotiatedata { 466*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI 467*6236dae4SAndroid Build Coastguard Worker OM_uint32 status; 468*6236dae4SAndroid Build Coastguard Worker gss_ctx_id_t context; 469*6236dae4SAndroid Build Coastguard Worker gss_name_t spn; 470*6236dae4SAndroid Build Coastguard Worker gss_buffer_desc output_token; 471*6236dae4SAndroid Build Coastguard Worker struct dynbuf channel_binding_data; 472*6236dae4SAndroid Build Coastguard Worker #else 473*6236dae4SAndroid Build Coastguard Worker #ifdef USE_WINDOWS_SSPI 474*6236dae4SAndroid Build Coastguard Worker #ifdef SECPKG_ATTR_ENDPOINT_BINDINGS 475*6236dae4SAndroid Build Coastguard Worker CtxtHandle *sslContext; 476*6236dae4SAndroid Build Coastguard Worker #endif 477*6236dae4SAndroid Build Coastguard Worker DWORD status; 478*6236dae4SAndroid Build Coastguard Worker CredHandle *credentials; 479*6236dae4SAndroid Build Coastguard Worker CtxtHandle *context; 480*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY identity; 481*6236dae4SAndroid Build Coastguard Worker SEC_WINNT_AUTH_IDENTITY *p_identity; 482*6236dae4SAndroid Build Coastguard Worker TCHAR *spn; 483*6236dae4SAndroid Build Coastguard Worker size_t token_max; 484*6236dae4SAndroid Build Coastguard Worker BYTE *output_token; 485*6236dae4SAndroid Build Coastguard Worker size_t output_token_length; 486*6236dae4SAndroid Build Coastguard Worker #endif 487*6236dae4SAndroid Build Coastguard Worker #endif 488*6236dae4SAndroid Build Coastguard Worker BIT(noauthpersist); 489*6236dae4SAndroid Build Coastguard Worker BIT(havenoauthpersist); 490*6236dae4SAndroid Build Coastguard Worker BIT(havenegdata); 491*6236dae4SAndroid Build Coastguard Worker BIT(havemultiplerequests); 492*6236dae4SAndroid Build Coastguard Worker }; 493*6236dae4SAndroid Build Coastguard Worker #endif 494*6236dae4SAndroid Build Coastguard Worker 495*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_DISABLE_PROXY 496*6236dae4SAndroid Build Coastguard Worker #define CONN_IS_PROXIED(x) 0 497*6236dae4SAndroid Build Coastguard Worker #else 498*6236dae4SAndroid Build Coastguard Worker #define CONN_IS_PROXIED(x) x->bits.proxy 499*6236dae4SAndroid Build Coastguard Worker #endif 500*6236dae4SAndroid Build Coastguard Worker 501*6236dae4SAndroid Build Coastguard Worker /* 502*6236dae4SAndroid Build Coastguard Worker * Boolean values that concerns this connection. 503*6236dae4SAndroid Build Coastguard Worker */ 504*6236dae4SAndroid Build Coastguard Worker struct ConnectBits { 505*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 506*6236dae4SAndroid Build Coastguard Worker BIT(httpproxy); /* if set, this transfer is done through an HTTP proxy */ 507*6236dae4SAndroid Build Coastguard Worker BIT(socksproxy); /* if set, this transfer is done through a socks proxy */ 508*6236dae4SAndroid Build Coastguard Worker BIT(proxy_user_passwd); /* user+password for the proxy? */ 509*6236dae4SAndroid Build Coastguard Worker BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy. 510*6236dae4SAndroid Build Coastguard Worker This is implicit when SSL-protocols are used through 511*6236dae4SAndroid Build Coastguard Worker proxies, but can also be enabled explicitly by 512*6236dae4SAndroid Build Coastguard Worker apps */ 513*6236dae4SAndroid Build Coastguard Worker BIT(proxy); /* if set, this transfer is done through a proxy - any type */ 514*6236dae4SAndroid Build Coastguard Worker #endif 515*6236dae4SAndroid Build Coastguard Worker /* always modify bits.close with the connclose() and connkeep() macros! */ 516*6236dae4SAndroid Build Coastguard Worker BIT(close); /* if set, we close the connection after this request */ 517*6236dae4SAndroid Build Coastguard Worker BIT(reuse); /* if set, this is a reused connection */ 518*6236dae4SAndroid Build Coastguard Worker BIT(altused); /* this is an alt-svc "redirect" */ 519*6236dae4SAndroid Build Coastguard Worker BIT(conn_to_host); /* if set, this connection has a "connect to host" 520*6236dae4SAndroid Build Coastguard Worker that overrides the host in the URL */ 521*6236dae4SAndroid Build Coastguard Worker BIT(conn_to_port); /* if set, this connection has a "connect to port" 522*6236dae4SAndroid Build Coastguard Worker that overrides the port in the URL (remote port) */ 523*6236dae4SAndroid Build Coastguard Worker BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6 524*6236dae4SAndroid Build Coastguard Worker IP address */ 525*6236dae4SAndroid Build Coastguard Worker BIT(ipv6); /* we communicate with a site using an IPv6 address */ 526*6236dae4SAndroid Build Coastguard Worker BIT(do_more); /* this is set TRUE if the ->curl_do_more() function is 527*6236dae4SAndroid Build Coastguard Worker supposed to be called, after ->curl_do() */ 528*6236dae4SAndroid Build Coastguard Worker BIT(protoconnstart);/* the protocol layer has STARTED its operation after 529*6236dae4SAndroid Build Coastguard Worker the TCP layer connect */ 530*6236dae4SAndroid Build Coastguard Worker BIT(retry); /* this connection is about to get closed and then 531*6236dae4SAndroid Build Coastguard Worker re-attempted at another connection. */ 532*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 533*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_epsv); /* As set with CURLOPT_FTP_USE_EPSV, but if we find out 534*6236dae4SAndroid Build Coastguard Worker EPSV does not work we disable it for the forthcoming 535*6236dae4SAndroid Build Coastguard Worker requests */ 536*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_eprt); /* As set with CURLOPT_FTP_USE_EPRT, but if we find out 537*6236dae4SAndroid Build Coastguard Worker EPRT does not work we disable it for the forthcoming 538*6236dae4SAndroid Build Coastguard Worker requests */ 539*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */ 540*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_control_ssl); /* Enabled SSL for the control connection */ 541*6236dae4SAndroid Build Coastguard Worker #endif 542*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_NETRC 543*6236dae4SAndroid Build Coastguard Worker BIT(netrc); /* name+password provided by netrc */ 544*6236dae4SAndroid Build Coastguard Worker #endif 545*6236dae4SAndroid Build Coastguard Worker BIT(bound); /* set true if bind() has already been done on this socket/ 546*6236dae4SAndroid Build Coastguard Worker connection */ 547*6236dae4SAndroid Build Coastguard Worker BIT(asks_multiplex); /* connection asks for multiplexing, but is not yet */ 548*6236dae4SAndroid Build Coastguard Worker BIT(multiplex); /* connection is multiplexed */ 549*6236dae4SAndroid Build Coastguard Worker BIT(tcp_fastopen); /* use TCP Fast Open */ 550*6236dae4SAndroid Build Coastguard Worker BIT(tls_enable_alpn); /* TLS ALPN extension? */ 551*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DOH 552*6236dae4SAndroid Build Coastguard Worker BIT(doh); 553*6236dae4SAndroid Build Coastguard Worker #endif 554*6236dae4SAndroid Build Coastguard Worker #ifdef USE_UNIX_SOCKETS 555*6236dae4SAndroid Build Coastguard Worker BIT(abstract_unix_socket); 556*6236dae4SAndroid Build Coastguard Worker #endif 557*6236dae4SAndroid Build Coastguard Worker BIT(tls_upgraded); 558*6236dae4SAndroid Build Coastguard Worker BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with 559*6236dae4SAndroid Build Coastguard Worker accept() */ 560*6236dae4SAndroid Build Coastguard Worker BIT(parallel_connect); /* set TRUE when a parallel connect attempt has 561*6236dae4SAndroid Build Coastguard Worker started (happy eyeballs) */ 562*6236dae4SAndroid Build Coastguard Worker BIT(aborted); /* connection was aborted, e.g. in unclean state */ 563*6236dae4SAndroid Build Coastguard Worker BIT(shutdown_handler); /* connection shutdown: handler shut down */ 564*6236dae4SAndroid Build Coastguard Worker BIT(shutdown_filters); /* connection shutdown: filters shut down */ 565*6236dae4SAndroid Build Coastguard Worker BIT(in_cpool); /* connection is kept in a connection pool */ 566*6236dae4SAndroid Build Coastguard Worker }; 567*6236dae4SAndroid Build Coastguard Worker 568*6236dae4SAndroid Build Coastguard Worker struct hostname { 569*6236dae4SAndroid Build Coastguard Worker char *rawalloc; /* allocated "raw" version of the name */ 570*6236dae4SAndroid Build Coastguard Worker char *encalloc; /* allocated IDN-encoded version of the name */ 571*6236dae4SAndroid Build Coastguard Worker char *name; /* name to use internally, might be encoded, might be raw */ 572*6236dae4SAndroid Build Coastguard Worker const char *dispname; /* name to display, as 'name' might be encoded */ 573*6236dae4SAndroid Build Coastguard Worker }; 574*6236dae4SAndroid Build Coastguard Worker 575*6236dae4SAndroid Build Coastguard Worker /* 576*6236dae4SAndroid Build Coastguard Worker * Flags on the keepon member of the Curl_transfer_keeper 577*6236dae4SAndroid Build Coastguard Worker */ 578*6236dae4SAndroid Build Coastguard Worker 579*6236dae4SAndroid Build Coastguard Worker #define KEEP_NONE 0 580*6236dae4SAndroid Build Coastguard Worker #define KEEP_RECV (1<<0) /* there is or may be data to read */ 581*6236dae4SAndroid Build Coastguard Worker #define KEEP_SEND (1<<1) /* there is or may be data to write */ 582*6236dae4SAndroid Build Coastguard Worker #define KEEP_RECV_HOLD (1<<2) /* when set, no reading should be done but there 583*6236dae4SAndroid Build Coastguard Worker might still be data to read */ 584*6236dae4SAndroid Build Coastguard Worker #define KEEP_SEND_HOLD (1<<3) /* when set, no writing should be done but there 585*6236dae4SAndroid Build Coastguard Worker might still be data to write */ 586*6236dae4SAndroid Build Coastguard Worker #define KEEP_RECV_PAUSE (1<<4) /* reading is paused */ 587*6236dae4SAndroid Build Coastguard Worker #define KEEP_SEND_PAUSE (1<<5) /* writing is paused */ 588*6236dae4SAndroid Build Coastguard Worker 589*6236dae4SAndroid Build Coastguard Worker /* KEEP_SEND_TIMED is set when the transfer should attempt sending 590*6236dae4SAndroid Build Coastguard Worker * at timer (or other) events. A transfer waiting on a timer will 591*6236dae4SAndroid Build Coastguard Worker * remove KEEP_SEND to suppress POLLOUTs of the connection. 592*6236dae4SAndroid Build Coastguard Worker * Adding KEEP_SEND_TIMED will then attempt to send whenever the transfer 593*6236dae4SAndroid Build Coastguard Worker * enters the "readwrite" loop, e.g. when a timer fires. 594*6236dae4SAndroid Build Coastguard Worker * This is used in HTTP for 'Expect: 100-continue' waiting. */ 595*6236dae4SAndroid Build Coastguard Worker #define KEEP_SEND_TIMED (1<<6) 596*6236dae4SAndroid Build Coastguard Worker 597*6236dae4SAndroid Build Coastguard Worker #define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE) 598*6236dae4SAndroid Build Coastguard Worker #define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE) 599*6236dae4SAndroid Build Coastguard Worker 600*6236dae4SAndroid Build Coastguard Worker /* transfer wants to send is not PAUSE or HOLD */ 601*6236dae4SAndroid Build Coastguard Worker #define CURL_WANT_SEND(data) \ 602*6236dae4SAndroid Build Coastguard Worker (((data)->req.keepon & KEEP_SENDBITS) == KEEP_SEND) 603*6236dae4SAndroid Build Coastguard Worker /* transfer receive is not on PAUSE or HOLD */ 604*6236dae4SAndroid Build Coastguard Worker #define CURL_WANT_RECV(data) \ 605*6236dae4SAndroid Build Coastguard Worker (((data)->req.keepon & KEEP_RECVBITS) == KEEP_RECV) 606*6236dae4SAndroid Build Coastguard Worker 607*6236dae4SAndroid Build Coastguard Worker #if defined(CURLRES_ASYNCH) || !defined(CURL_DISABLE_DOH) 608*6236dae4SAndroid Build Coastguard Worker #define USE_CURL_ASYNC 609*6236dae4SAndroid Build Coastguard Worker struct Curl_async { 610*6236dae4SAndroid Build Coastguard Worker char *hostname; 611*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry *dns; 612*6236dae4SAndroid Build Coastguard Worker struct thread_data *tdata; 613*6236dae4SAndroid Build Coastguard Worker void *resolver; /* resolver state, if it is used in the URL state - 614*6236dae4SAndroid Build Coastguard Worker ares_channel e.g. */ 615*6236dae4SAndroid Build Coastguard Worker int port; 616*6236dae4SAndroid Build Coastguard Worker int status; /* if done is TRUE, this is the status from the callback */ 617*6236dae4SAndroid Build Coastguard Worker BIT(done); /* set TRUE when the lookup is complete */ 618*6236dae4SAndroid Build Coastguard Worker }; 619*6236dae4SAndroid Build Coastguard Worker 620*6236dae4SAndroid Build Coastguard Worker #endif 621*6236dae4SAndroid Build Coastguard Worker 622*6236dae4SAndroid Build Coastguard Worker #define FIRSTSOCKET 0 623*6236dae4SAndroid Build Coastguard Worker #define SECONDARYSOCKET 1 624*6236dae4SAndroid Build Coastguard Worker 625*6236dae4SAndroid Build Coastguard Worker /* Polling requested by an easy handle. 626*6236dae4SAndroid Build Coastguard Worker * `action` is CURL_POLL_IN, CURL_POLL_OUT or CURL_POLL_INOUT. 627*6236dae4SAndroid Build Coastguard Worker */ 628*6236dae4SAndroid Build Coastguard Worker struct easy_pollset { 629*6236dae4SAndroid Build Coastguard Worker curl_socket_t sockets[MAX_SOCKSPEREASYHANDLE]; 630*6236dae4SAndroid Build Coastguard Worker unsigned int num; 631*6236dae4SAndroid Build Coastguard Worker unsigned char actions[MAX_SOCKSPEREASYHANDLE]; 632*6236dae4SAndroid Build Coastguard Worker }; 633*6236dae4SAndroid Build Coastguard Worker 634*6236dae4SAndroid Build Coastguard Worker /* 635*6236dae4SAndroid Build Coastguard Worker * Specific protocol handler. 636*6236dae4SAndroid Build Coastguard Worker */ 637*6236dae4SAndroid Build Coastguard Worker 638*6236dae4SAndroid Build Coastguard Worker struct Curl_handler { 639*6236dae4SAndroid Build Coastguard Worker const char *scheme; /* URL scheme name in lowercase */ 640*6236dae4SAndroid Build Coastguard Worker 641*6236dae4SAndroid Build Coastguard Worker /* Complement to setup_connection_internals(). This is done before the 642*6236dae4SAndroid Build Coastguard Worker transfer "owns" the connection. */ 643*6236dae4SAndroid Build Coastguard Worker CURLcode (*setup_connection)(struct Curl_easy *data, 644*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn); 645*6236dae4SAndroid Build Coastguard Worker 646*6236dae4SAndroid Build Coastguard Worker /* These two functions MUST be set to be protocol dependent */ 647*6236dae4SAndroid Build Coastguard Worker CURLcode (*do_it)(struct Curl_easy *data, bool *done); 648*6236dae4SAndroid Build Coastguard Worker CURLcode (*done)(struct Curl_easy *, CURLcode, bool); 649*6236dae4SAndroid Build Coastguard Worker 650*6236dae4SAndroid Build Coastguard Worker /* If the curl_do() function is better made in two halves, this 651*6236dae4SAndroid Build Coastguard Worker * curl_do_more() function will be called afterwards, if set. For example 652*6236dae4SAndroid Build Coastguard Worker * for doing the FTP stuff after the PASV/PORT command. 653*6236dae4SAndroid Build Coastguard Worker */ 654*6236dae4SAndroid Build Coastguard Worker CURLcode (*do_more)(struct Curl_easy *, int *); 655*6236dae4SAndroid Build Coastguard Worker 656*6236dae4SAndroid Build Coastguard Worker /* This function *MAY* be set to a protocol-dependent function that is run 657*6236dae4SAndroid Build Coastguard Worker * after the connect() and everything is done, as a step in the connection. 658*6236dae4SAndroid Build Coastguard Worker * The 'done' pointer points to a bool that should be set to TRUE if the 659*6236dae4SAndroid Build Coastguard Worker * function completes before return. If it does not complete, the caller 660*6236dae4SAndroid Build Coastguard Worker * should call the ->connecting() function until it is. 661*6236dae4SAndroid Build Coastguard Worker */ 662*6236dae4SAndroid Build Coastguard Worker CURLcode (*connect_it)(struct Curl_easy *data, bool *done); 663*6236dae4SAndroid Build Coastguard Worker 664*6236dae4SAndroid Build Coastguard Worker /* See above. */ 665*6236dae4SAndroid Build Coastguard Worker CURLcode (*connecting)(struct Curl_easy *data, bool *done); 666*6236dae4SAndroid Build Coastguard Worker CURLcode (*doing)(struct Curl_easy *data, bool *done); 667*6236dae4SAndroid Build Coastguard Worker 668*6236dae4SAndroid Build Coastguard Worker /* Called from the multi interface during the PROTOCONNECT phase, and it 669*6236dae4SAndroid Build Coastguard Worker should then return a proper fd set */ 670*6236dae4SAndroid Build Coastguard Worker int (*proto_getsock)(struct Curl_easy *data, 671*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, curl_socket_t *socks); 672*6236dae4SAndroid Build Coastguard Worker 673*6236dae4SAndroid Build Coastguard Worker /* Called from the multi interface during the DOING phase, and it should 674*6236dae4SAndroid Build Coastguard Worker then return a proper fd set */ 675*6236dae4SAndroid Build Coastguard Worker int (*doing_getsock)(struct Curl_easy *data, 676*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, curl_socket_t *socks); 677*6236dae4SAndroid Build Coastguard Worker 678*6236dae4SAndroid Build Coastguard Worker /* Called from the multi interface during the DO_MORE phase, and it should 679*6236dae4SAndroid Build Coastguard Worker then return a proper fd set */ 680*6236dae4SAndroid Build Coastguard Worker int (*domore_getsock)(struct Curl_easy *data, 681*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, curl_socket_t *socks); 682*6236dae4SAndroid Build Coastguard Worker 683*6236dae4SAndroid Build Coastguard Worker /* Called from the multi interface during the DO_DONE, PERFORM and 684*6236dae4SAndroid Build Coastguard Worker WAITPERFORM phases, and it should then return a proper fd set. Not setting 685*6236dae4SAndroid Build Coastguard Worker this will make libcurl use the generic default one. */ 686*6236dae4SAndroid Build Coastguard Worker int (*perform_getsock)(struct Curl_easy *data, 687*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, curl_socket_t *socks); 688*6236dae4SAndroid Build Coastguard Worker 689*6236dae4SAndroid Build Coastguard Worker /* This function *MAY* be set to a protocol-dependent function that is run 690*6236dae4SAndroid Build Coastguard Worker * by the curl_disconnect(), as a step in the disconnection. If the handler 691*6236dae4SAndroid Build Coastguard Worker * is called because the connection has been considered dead, 692*6236dae4SAndroid Build Coastguard Worker * dead_connection is set to TRUE. The connection is (again) associated with 693*6236dae4SAndroid Build Coastguard Worker * the transfer here. 694*6236dae4SAndroid Build Coastguard Worker */ 695*6236dae4SAndroid Build Coastguard Worker CURLcode (*disconnect)(struct Curl_easy *, struct connectdata *, 696*6236dae4SAndroid Build Coastguard Worker bool dead_connection); 697*6236dae4SAndroid Build Coastguard Worker 698*6236dae4SAndroid Build Coastguard Worker /* If used, this function gets called from transfer.c to 699*6236dae4SAndroid Build Coastguard Worker allow the protocol to do extra handling in writing response to 700*6236dae4SAndroid Build Coastguard Worker the client. */ 701*6236dae4SAndroid Build Coastguard Worker CURLcode (*write_resp)(struct Curl_easy *data, const char *buf, size_t blen, 702*6236dae4SAndroid Build Coastguard Worker bool is_eos); 703*6236dae4SAndroid Build Coastguard Worker 704*6236dae4SAndroid Build Coastguard Worker /* If used, this function gets called from transfer.c to 705*6236dae4SAndroid Build Coastguard Worker allow the protocol to do extra handling in writing a single response 706*6236dae4SAndroid Build Coastguard Worker header line to the client. */ 707*6236dae4SAndroid Build Coastguard Worker CURLcode (*write_resp_hd)(struct Curl_easy *data, 708*6236dae4SAndroid Build Coastguard Worker const char *hd, size_t hdlen, bool is_eos); 709*6236dae4SAndroid Build Coastguard Worker 710*6236dae4SAndroid Build Coastguard Worker /* This function can perform various checks on the connection. See 711*6236dae4SAndroid Build Coastguard Worker CONNCHECK_* for more information about the checks that can be performed, 712*6236dae4SAndroid Build Coastguard Worker and CONNRESULT_* for the results that can be returned. */ 713*6236dae4SAndroid Build Coastguard Worker unsigned int (*connection_check)(struct Curl_easy *data, 714*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn, 715*6236dae4SAndroid Build Coastguard Worker unsigned int checks_to_perform); 716*6236dae4SAndroid Build Coastguard Worker 717*6236dae4SAndroid Build Coastguard Worker /* attach() attaches this transfer to this connection */ 718*6236dae4SAndroid Build Coastguard Worker void (*attach)(struct Curl_easy *data, struct connectdata *conn); 719*6236dae4SAndroid Build Coastguard Worker 720*6236dae4SAndroid Build Coastguard Worker int defport; /* Default port. */ 721*6236dae4SAndroid Build Coastguard Worker curl_prot_t protocol; /* See CURLPROTO_* - this needs to be the single 722*6236dae4SAndroid Build Coastguard Worker specific protocol bit */ 723*6236dae4SAndroid Build Coastguard Worker curl_prot_t family; /* single bit for protocol family; basically the 724*6236dae4SAndroid Build Coastguard Worker non-TLS name of the protocol this is */ 725*6236dae4SAndroid Build Coastguard Worker unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */ 726*6236dae4SAndroid Build Coastguard Worker 727*6236dae4SAndroid Build Coastguard Worker }; 728*6236dae4SAndroid Build Coastguard Worker 729*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_NONE 0 /* nothing extra */ 730*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_SSL (1<<0) /* uses SSL */ 731*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_DUAL (1<<1) /* this protocol uses two connections */ 732*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_CLOSEACTION (1<<2) /* need action before socket close */ 733*6236dae4SAndroid Build Coastguard Worker /* some protocols will have to call the underlying functions without regard to 734*6236dae4SAndroid Build Coastguard Worker what exact state the socket signals. IE even if the socket says "readable", 735*6236dae4SAndroid Build Coastguard Worker the send function might need to be called while uploading, or vice versa. 736*6236dae4SAndroid Build Coastguard Worker */ 737*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_DIRLOCK (1<<3) 738*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_NONETWORK (1<<4) /* protocol does not use the network! */ 739*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_NEEDSPWD (1<<5) /* needs a password, and if none is set it 740*6236dae4SAndroid Build Coastguard Worker gets a default */ 741*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_NOURLQUERY (1<<6) /* protocol cannot handle 742*6236dae4SAndroid Build Coastguard Worker URL query strings (?foo=bar) ! */ 743*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login credentials per 744*6236dae4SAndroid Build Coastguard Worker request instead of per connection */ 745*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_ALPN (1<<8) /* set ALPN for this */ 746*6236dae4SAndroid Build Coastguard Worker /* (1<<9) was PROTOPT_STREAM, now free */ 747*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_URLOPTIONS (1<<10) /* allow options part in the userinfo field 748*6236dae4SAndroid Build Coastguard Worker of the URL */ 749*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_PROXY_AS_HTTP (1<<11) /* allow this non-HTTP scheme over a 750*6236dae4SAndroid Build Coastguard Worker HTTP proxy as HTTP proxies may know 751*6236dae4SAndroid Build Coastguard Worker this protocol and act as a gateway */ 752*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_WILDCARD (1<<12) /* protocol supports wildcard matching */ 753*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_USERPWDCTRL (1<<13) /* Allow "control bytes" (< 32 ASCII) in 754*6236dae4SAndroid Build Coastguard Worker username and password */ 755*6236dae4SAndroid Build Coastguard Worker #define PROTOPT_NOTCPPROXY (1<<14) /* this protocol cannot proxy over TCP */ 756*6236dae4SAndroid Build Coastguard Worker 757*6236dae4SAndroid Build Coastguard Worker #define CONNCHECK_NONE 0 /* No checks */ 758*6236dae4SAndroid Build Coastguard Worker #define CONNCHECK_ISDEAD (1<<0) /* Check if the connection is dead. */ 759*6236dae4SAndroid Build Coastguard Worker #define CONNCHECK_KEEPALIVE (1<<1) /* Perform any keepalive function. */ 760*6236dae4SAndroid Build Coastguard Worker 761*6236dae4SAndroid Build Coastguard Worker #define CONNRESULT_NONE 0 /* No extra information. */ 762*6236dae4SAndroid Build Coastguard Worker #define CONNRESULT_DEAD (1<<0) /* The connection is dead. */ 763*6236dae4SAndroid Build Coastguard Worker 764*6236dae4SAndroid Build Coastguard Worker struct ip_quadruple { 765*6236dae4SAndroid Build Coastguard Worker char remote_ip[MAX_IPADR_LEN]; 766*6236dae4SAndroid Build Coastguard Worker char local_ip[MAX_IPADR_LEN]; 767*6236dae4SAndroid Build Coastguard Worker int remote_port; 768*6236dae4SAndroid Build Coastguard Worker int local_port; 769*6236dae4SAndroid Build Coastguard Worker }; 770*6236dae4SAndroid Build Coastguard Worker 771*6236dae4SAndroid Build Coastguard Worker struct proxy_info { 772*6236dae4SAndroid Build Coastguard Worker struct hostname host; 773*6236dae4SAndroid Build Coastguard Worker int port; 774*6236dae4SAndroid Build Coastguard Worker unsigned char proxytype; /* curl_proxytype: what kind of proxy that is in 775*6236dae4SAndroid Build Coastguard Worker use */ 776*6236dae4SAndroid Build Coastguard Worker char *user; /* proxy username string, allocated */ 777*6236dae4SAndroid Build Coastguard Worker char *passwd; /* proxy password string, allocated */ 778*6236dae4SAndroid Build Coastguard Worker }; 779*6236dae4SAndroid Build Coastguard Worker 780*6236dae4SAndroid Build Coastguard Worker struct ldapconninfo; 781*6236dae4SAndroid Build Coastguard Worker 782*6236dae4SAndroid Build Coastguard Worker #define TRNSPRT_TCP 3 783*6236dae4SAndroid Build Coastguard Worker #define TRNSPRT_UDP 4 784*6236dae4SAndroid Build Coastguard Worker #define TRNSPRT_QUIC 5 785*6236dae4SAndroid Build Coastguard Worker #define TRNSPRT_UNIX 6 786*6236dae4SAndroid Build Coastguard Worker 787*6236dae4SAndroid Build Coastguard Worker /* 788*6236dae4SAndroid Build Coastguard Worker * The connectdata struct contains all fields and variables that should be 789*6236dae4SAndroid Build Coastguard Worker * unique for an entire connection. 790*6236dae4SAndroid Build Coastguard Worker */ 791*6236dae4SAndroid Build Coastguard Worker struct connectdata { 792*6236dae4SAndroid Build Coastguard Worker struct Curl_llist_node cpool_node; /* conncache lists */ 793*6236dae4SAndroid Build Coastguard Worker 794*6236dae4SAndroid Build Coastguard Worker curl_closesocket_callback fclosesocket; /* function closing the socket(s) */ 795*6236dae4SAndroid Build Coastguard Worker void *closesocket_client; 796*6236dae4SAndroid Build Coastguard Worker 797*6236dae4SAndroid Build Coastguard Worker /* This is used by the connection pool logic. If this returns TRUE, this 798*6236dae4SAndroid Build Coastguard Worker handle is still used by one or more easy handles and can only used by any 799*6236dae4SAndroid Build Coastguard Worker other easy handle without careful consideration (== only for 800*6236dae4SAndroid Build Coastguard Worker multiplexing) and it cannot be used by another multi handle! */ 801*6236dae4SAndroid Build Coastguard Worker #define CONN_INUSE(c) Curl_llist_count(&(c)->easyq) 802*6236dae4SAndroid Build Coastguard Worker 803*6236dae4SAndroid Build Coastguard Worker /**** Fields set when inited and not modified again */ 804*6236dae4SAndroid Build Coastguard Worker curl_off_t connection_id; /* Contains a unique number to make it easier to 805*6236dae4SAndroid Build Coastguard Worker track the connections in the log output */ 806*6236dae4SAndroid Build Coastguard Worker char *destination; /* string carrying normalized hostname+port+scope */ 807*6236dae4SAndroid Build Coastguard Worker size_t destination_len; /* strlen(destination) + 1 */ 808*6236dae4SAndroid Build Coastguard Worker 809*6236dae4SAndroid Build Coastguard Worker /* 'dns_entry' is the particular host we use. This points to an entry in the 810*6236dae4SAndroid Build Coastguard Worker DNS cache and it will not get pruned while locked. It gets unlocked in 811*6236dae4SAndroid Build Coastguard Worker multi_done(). This entry will be NULL if the connection is reused as then 812*6236dae4SAndroid Build Coastguard Worker there is no name resolve done. */ 813*6236dae4SAndroid Build Coastguard Worker struct Curl_dns_entry *dns_entry; 814*6236dae4SAndroid Build Coastguard Worker 815*6236dae4SAndroid Build Coastguard Worker /* 'remote_addr' is the particular IP we connected to. it is owned, set 816*6236dae4SAndroid Build Coastguard Worker * and NULLed by the connected socket filter (if there is one). */ 817*6236dae4SAndroid Build Coastguard Worker const struct Curl_sockaddr_ex *remote_addr; 818*6236dae4SAndroid Build Coastguard Worker 819*6236dae4SAndroid Build Coastguard Worker struct hostname host; 820*6236dae4SAndroid Build Coastguard Worker char *hostname_resolve; /* hostname to resolve to address, allocated */ 821*6236dae4SAndroid Build Coastguard Worker char *secondaryhostname; /* secondary socket hostname (ftp) */ 822*6236dae4SAndroid Build Coastguard Worker struct hostname conn_to_host; /* the host to connect to. valid only if 823*6236dae4SAndroid Build Coastguard Worker bits.conn_to_host is set */ 824*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 825*6236dae4SAndroid Build Coastguard Worker struct proxy_info socks_proxy; 826*6236dae4SAndroid Build Coastguard Worker struct proxy_info http_proxy; 827*6236dae4SAndroid Build Coastguard Worker #endif 828*6236dae4SAndroid Build Coastguard Worker /* 'primary' and 'secondary' get filled with IP quadruple 829*6236dae4SAndroid Build Coastguard Worker (local/remote numerical ip address and port) whenever a connect is 830*6236dae4SAndroid Build Coastguard Worker *attempted*. 831*6236dae4SAndroid Build Coastguard Worker When more than one address is tried for a connection these will hold data 832*6236dae4SAndroid Build Coastguard Worker for the last attempt. When the connection is actually established 833*6236dae4SAndroid Build Coastguard Worker these are updated with data which comes directly from the socket. */ 834*6236dae4SAndroid Build Coastguard Worker struct ip_quadruple primary; 835*6236dae4SAndroid Build Coastguard Worker struct ip_quadruple secondary; 836*6236dae4SAndroid Build Coastguard Worker char *user; /* username string, allocated */ 837*6236dae4SAndroid Build Coastguard Worker char *passwd; /* password string, allocated */ 838*6236dae4SAndroid Build Coastguard Worker char *options; /* options string, allocated */ 839*6236dae4SAndroid Build Coastguard Worker char *sasl_authzid; /* authorization identity string, allocated */ 840*6236dae4SAndroid Build Coastguard Worker char *oauth_bearer; /* OAUTH2 bearer, allocated */ 841*6236dae4SAndroid Build Coastguard Worker struct curltime now; /* "current" time */ 842*6236dae4SAndroid Build Coastguard Worker struct curltime created; /* creation time */ 843*6236dae4SAndroid Build Coastguard Worker struct curltime lastused; /* when returned to the connection poolas idle */ 844*6236dae4SAndroid Build Coastguard Worker curl_socket_t sock[2]; /* two sockets, the second is used for the data 845*6236dae4SAndroid Build Coastguard Worker transfer when doing FTP */ 846*6236dae4SAndroid Build Coastguard Worker Curl_recv *recv[2]; 847*6236dae4SAndroid Build Coastguard Worker Curl_send *send[2]; 848*6236dae4SAndroid Build Coastguard Worker struct Curl_cfilter *cfilter[2]; /* connection filters */ 849*6236dae4SAndroid Build Coastguard Worker struct { 850*6236dae4SAndroid Build Coastguard Worker struct curltime start[2]; /* when filter shutdown started */ 851*6236dae4SAndroid Build Coastguard Worker unsigned int timeout_ms; /* 0 means no timeout */ 852*6236dae4SAndroid Build Coastguard Worker } shutdown; 853*6236dae4SAndroid Build Coastguard Worker /* Last pollset used in connection shutdown. Used to detect changes 854*6236dae4SAndroid Build Coastguard Worker * for multi_socket API. */ 855*6236dae4SAndroid Build Coastguard Worker struct easy_pollset shutdown_poll; 856*6236dae4SAndroid Build Coastguard Worker 857*6236dae4SAndroid Build Coastguard Worker struct ssl_primary_config ssl_config; 858*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 859*6236dae4SAndroid Build Coastguard Worker struct ssl_primary_config proxy_ssl_config; 860*6236dae4SAndroid Build Coastguard Worker #endif 861*6236dae4SAndroid Build Coastguard Worker struct ConnectBits bits; /* various state-flags for this connection */ 862*6236dae4SAndroid Build Coastguard Worker 863*6236dae4SAndroid Build Coastguard Worker const struct Curl_handler *handler; /* Connection's protocol handler */ 864*6236dae4SAndroid Build Coastguard Worker const struct Curl_handler *given; /* The protocol first given */ 865*6236dae4SAndroid Build Coastguard Worker 866*6236dae4SAndroid Build Coastguard Worker /* Protocols can use a custom keepalive mechanism to keep connections alive. 867*6236dae4SAndroid Build Coastguard Worker This allows those protocols to track the last time the keepalive mechanism 868*6236dae4SAndroid Build Coastguard Worker was used on this connection. */ 869*6236dae4SAndroid Build Coastguard Worker struct curltime keepalive; 870*6236dae4SAndroid Build Coastguard Worker 871*6236dae4SAndroid Build Coastguard Worker /**** curl_get() phase fields */ 872*6236dae4SAndroid Build Coastguard Worker 873*6236dae4SAndroid Build Coastguard Worker curl_socket_t sockfd; /* socket to read from or CURL_SOCKET_BAD */ 874*6236dae4SAndroid Build Coastguard Worker curl_socket_t writesockfd; /* socket to write to, it may be the same we read 875*6236dae4SAndroid Build Coastguard Worker from. CURL_SOCKET_BAD disables */ 876*6236dae4SAndroid Build Coastguard Worker 877*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_GSSAPI 878*6236dae4SAndroid Build Coastguard Worker BIT(sec_complete); /* if Kerberos is enabled for this connection */ 879*6236dae4SAndroid Build Coastguard Worker unsigned char command_prot; /* enum protection_level */ 880*6236dae4SAndroid Build Coastguard Worker unsigned char data_prot; /* enum protection_level */ 881*6236dae4SAndroid Build Coastguard Worker unsigned char request_data_prot; /* enum protection_level */ 882*6236dae4SAndroid Build Coastguard Worker size_t buffer_size; 883*6236dae4SAndroid Build Coastguard Worker struct krb5buffer in_buffer; 884*6236dae4SAndroid Build Coastguard Worker void *app_data; 885*6236dae4SAndroid Build Coastguard Worker const struct Curl_sec_client_mech *mech; 886*6236dae4SAndroid Build Coastguard Worker struct sockaddr_in local_addr; 887*6236dae4SAndroid Build Coastguard Worker #endif 888*6236dae4SAndroid Build Coastguard Worker 889*6236dae4SAndroid Build Coastguard Worker #if defined(USE_KERBEROS5) /* Consider moving some of the above GSS-API */ 890*6236dae4SAndroid Build Coastguard Worker struct kerberos5data krb5; /* variables into the structure definition, */ 891*6236dae4SAndroid Build Coastguard Worker #endif /* however, some of them are ftp specific. */ 892*6236dae4SAndroid Build Coastguard Worker 893*6236dae4SAndroid Build Coastguard Worker struct Curl_llist easyq; /* List of easy handles using this connection */ 894*6236dae4SAndroid Build Coastguard Worker 895*6236dae4SAndroid Build Coastguard Worker /*************** Request - specific items ************/ 896*6236dae4SAndroid Build Coastguard Worker #if defined(USE_WINDOWS_SSPI) && defined(SECPKG_ATTR_ENDPOINT_BINDINGS) 897*6236dae4SAndroid Build Coastguard Worker CtxtHandle *sslContext; 898*6236dae4SAndroid Build Coastguard Worker #endif 899*6236dae4SAndroid Build Coastguard Worker 900*6236dae4SAndroid Build Coastguard Worker #ifdef USE_GSASL 901*6236dae4SAndroid Build Coastguard Worker struct gsasldata gsasl; 902*6236dae4SAndroid Build Coastguard Worker #endif 903*6236dae4SAndroid Build Coastguard Worker 904*6236dae4SAndroid Build Coastguard Worker #if defined(USE_NTLM) 905*6236dae4SAndroid Build Coastguard Worker curlntlm http_ntlm_state; 906*6236dae4SAndroid Build Coastguard Worker curlntlm proxy_ntlm_state; 907*6236dae4SAndroid Build Coastguard Worker 908*6236dae4SAndroid Build Coastguard Worker struct ntlmdata ntlm; /* NTLM differs from other authentication schemes 909*6236dae4SAndroid Build Coastguard Worker because it authenticates connections, not 910*6236dae4SAndroid Build Coastguard Worker single requests! */ 911*6236dae4SAndroid Build Coastguard Worker struct ntlmdata proxyntlm; /* NTLM data for proxy */ 912*6236dae4SAndroid Build Coastguard Worker #endif 913*6236dae4SAndroid Build Coastguard Worker 914*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SPNEGO 915*6236dae4SAndroid Build Coastguard Worker curlnegotiate http_negotiate_state; 916*6236dae4SAndroid Build Coastguard Worker curlnegotiate proxy_negotiate_state; 917*6236dae4SAndroid Build Coastguard Worker 918*6236dae4SAndroid Build Coastguard Worker struct negotiatedata negotiate; /* state data for host Negotiate auth */ 919*6236dae4SAndroid Build Coastguard Worker struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */ 920*6236dae4SAndroid Build Coastguard Worker #endif 921*6236dae4SAndroid Build Coastguard Worker 922*6236dae4SAndroid Build Coastguard Worker union { 923*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 924*6236dae4SAndroid Build Coastguard Worker struct ftp_conn ftpc; 925*6236dae4SAndroid Build Coastguard Worker #endif 926*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH 927*6236dae4SAndroid Build Coastguard Worker struct ssh_conn sshc; 928*6236dae4SAndroid Build Coastguard Worker #endif 929*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TFTP 930*6236dae4SAndroid Build Coastguard Worker struct tftp_state_data *tftpc; 931*6236dae4SAndroid Build Coastguard Worker #endif 932*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_IMAP 933*6236dae4SAndroid Build Coastguard Worker struct imap_conn imapc; 934*6236dae4SAndroid Build Coastguard Worker #endif 935*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_POP3 936*6236dae4SAndroid Build Coastguard Worker struct pop3_conn pop3c; 937*6236dae4SAndroid Build Coastguard Worker #endif 938*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP 939*6236dae4SAndroid Build Coastguard Worker struct smtp_conn smtpc; 940*6236dae4SAndroid Build Coastguard Worker #endif 941*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP 942*6236dae4SAndroid Build Coastguard Worker struct rtsp_conn rtspc; 943*6236dae4SAndroid Build Coastguard Worker #endif 944*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMB 945*6236dae4SAndroid Build Coastguard Worker struct smb_conn smbc; 946*6236dae4SAndroid Build Coastguard Worker #endif 947*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBRTMP 948*6236dae4SAndroid Build Coastguard Worker void *rtmp; 949*6236dae4SAndroid Build Coastguard Worker #endif 950*6236dae4SAndroid Build Coastguard Worker #ifdef USE_OPENLDAP 951*6236dae4SAndroid Build Coastguard Worker struct ldapconninfo *ldapc; 952*6236dae4SAndroid Build Coastguard Worker #endif 953*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_MQTT 954*6236dae4SAndroid Build Coastguard Worker struct mqtt_conn mqtt; 955*6236dae4SAndroid Build Coastguard Worker #endif 956*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_WEBSOCKETS 957*6236dae4SAndroid Build Coastguard Worker struct websocket *ws; 958*6236dae4SAndroid Build Coastguard Worker #endif 959*6236dae4SAndroid Build Coastguard Worker unsigned int unused:1; /* avoids empty union */ 960*6236dae4SAndroid Build Coastguard Worker } proto; 961*6236dae4SAndroid Build Coastguard Worker 962*6236dae4SAndroid Build Coastguard Worker #ifdef USE_UNIX_SOCKETS 963*6236dae4SAndroid Build Coastguard Worker char *unix_domain_socket; 964*6236dae4SAndroid Build Coastguard Worker #endif 965*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER 966*6236dae4SAndroid Build Coastguard Worker /* if set, an alternative data transfer function */ 967*6236dae4SAndroid Build Coastguard Worker Curl_datastream datastream; 968*6236dae4SAndroid Build Coastguard Worker #endif 969*6236dae4SAndroid Build Coastguard Worker /* When this connection is created, store the conditions for the local end 970*6236dae4SAndroid Build Coastguard Worker bind. This is stored before the actual bind and before any connection is 971*6236dae4SAndroid Build Coastguard Worker made and will serve the purpose of being used for comparison reasons so 972*6236dae4SAndroid Build Coastguard Worker that subsequent bound-requested connections are not accidentally reusing 973*6236dae4SAndroid Build Coastguard Worker wrong connections. */ 974*6236dae4SAndroid Build Coastguard Worker char *localdev; 975*6236dae4SAndroid Build Coastguard Worker unsigned short localportrange; 976*6236dae4SAndroid Build Coastguard Worker int waitfor; /* current READ/WRITE bits to wait for */ 977*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) 978*6236dae4SAndroid Build Coastguard Worker int socks5_gssapi_enctype; 979*6236dae4SAndroid Build Coastguard Worker #endif 980*6236dae4SAndroid Build Coastguard Worker /* The field below gets set in connect.c:connecthost() */ 981*6236dae4SAndroid Build Coastguard Worker int remote_port; /* the remote port, not the proxy port! */ 982*6236dae4SAndroid Build Coastguard Worker int conn_to_port; /* the remote port to connect to. valid only if 983*6236dae4SAndroid Build Coastguard Worker bits.conn_to_port is set */ 984*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IPV6 985*6236dae4SAndroid Build Coastguard Worker unsigned int scope_id; /* Scope id for IPv6 */ 986*6236dae4SAndroid Build Coastguard Worker #endif 987*6236dae4SAndroid Build Coastguard Worker unsigned short localport; 988*6236dae4SAndroid Build Coastguard Worker unsigned short secondary_port; /* secondary socket remote port to connect to 989*6236dae4SAndroid Build Coastguard Worker (ftp) */ 990*6236dae4SAndroid Build Coastguard Worker unsigned char alpn; /* APLN TLS negotiated protocol, a CURL_HTTP_VERSION* 991*6236dae4SAndroid Build Coastguard Worker value */ 992*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 993*6236dae4SAndroid Build Coastguard Worker unsigned char proxy_alpn; /* APLN of proxy tunnel, CURL_HTTP_VERSION* */ 994*6236dae4SAndroid Build Coastguard Worker #endif 995*6236dae4SAndroid Build Coastguard Worker unsigned char transport; /* one of the TRNSPRT_* defines */ 996*6236dae4SAndroid Build Coastguard Worker unsigned char ip_version; /* copied from the Curl_easy at creation time */ 997*6236dae4SAndroid Build Coastguard Worker unsigned char httpversion; /* the HTTP version*10 reported by the server */ 998*6236dae4SAndroid Build Coastguard Worker unsigned char connect_only; 999*6236dae4SAndroid Build Coastguard Worker unsigned char gssapi_delegation; /* inherited from set.gssapi_delegation */ 1000*6236dae4SAndroid Build Coastguard Worker }; 1001*6236dae4SAndroid Build Coastguard Worker 1002*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1003*6236dae4SAndroid Build Coastguard Worker #define CURL_CONN_HOST_DISPNAME(c) \ 1004*6236dae4SAndroid Build Coastguard Worker ((c)->bits.socksproxy ? (c)->socks_proxy.host.dispname : \ 1005*6236dae4SAndroid Build Coastguard Worker (c)->bits.httpproxy ? (c)->http_proxy.host.dispname : \ 1006*6236dae4SAndroid Build Coastguard Worker (c)->bits.conn_to_host ? (c)->conn_to_host.dispname : \ 1007*6236dae4SAndroid Build Coastguard Worker (c)->host.dispname) 1008*6236dae4SAndroid Build Coastguard Worker #else 1009*6236dae4SAndroid Build Coastguard Worker #define CURL_CONN_HOST_DISPNAME(c) \ 1010*6236dae4SAndroid Build Coastguard Worker (c)->bits.conn_to_host ? (c)->conn_to_host.dispname : \ 1011*6236dae4SAndroid Build Coastguard Worker (c)->host.dispname 1012*6236dae4SAndroid Build Coastguard Worker #endif 1013*6236dae4SAndroid Build Coastguard Worker 1014*6236dae4SAndroid Build Coastguard Worker /* The end of connectdata. */ 1015*6236dae4SAndroid Build Coastguard Worker 1016*6236dae4SAndroid Build Coastguard Worker /* 1017*6236dae4SAndroid Build Coastguard Worker * Struct to keep statistical and informational data. 1018*6236dae4SAndroid Build Coastguard Worker * All variables in this struct must be initialized/reset in Curl_initinfo(). 1019*6236dae4SAndroid Build Coastguard Worker */ 1020*6236dae4SAndroid Build Coastguard Worker struct PureInfo { 1021*6236dae4SAndroid Build Coastguard Worker int httpcode; /* Recent HTTP, FTP, RTSP or SMTP response code */ 1022*6236dae4SAndroid Build Coastguard Worker int httpproxycode; /* response code from proxy when received separate */ 1023*6236dae4SAndroid Build Coastguard Worker int httpversion; /* the http version number X.Y = X*10+Y */ 1024*6236dae4SAndroid Build Coastguard Worker time_t filetime; /* If requested, this is might get set. Set to -1 if the 1025*6236dae4SAndroid Build Coastguard Worker time was unretrievable. */ 1026*6236dae4SAndroid Build Coastguard Worker curl_off_t request_size; /* the amount of bytes sent in the request(s) */ 1027*6236dae4SAndroid Build Coastguard Worker unsigned long proxyauthavail; /* what proxy auth types were announced */ 1028*6236dae4SAndroid Build Coastguard Worker unsigned long httpauthavail; /* what host auth types were announced */ 1029*6236dae4SAndroid Build Coastguard Worker long numconnects; /* how many new connection did libcurl created */ 1030*6236dae4SAndroid Build Coastguard Worker char *contenttype; /* the content type of the object */ 1031*6236dae4SAndroid Build Coastguard Worker char *wouldredirect; /* URL this would have been redirected to if asked to */ 1032*6236dae4SAndroid Build Coastguard Worker curl_off_t retry_after; /* info from Retry-After: header */ 1033*6236dae4SAndroid Build Coastguard Worker unsigned int header_size; /* size of read header(s) in bytes */ 1034*6236dae4SAndroid Build Coastguard Worker 1035*6236dae4SAndroid Build Coastguard Worker /* PureInfo primary ip_quadruple is copied over from the connectdata 1036*6236dae4SAndroid Build Coastguard Worker struct in order to allow curl_easy_getinfo() to return this information 1037*6236dae4SAndroid Build Coastguard Worker even when the session handle is no longer associated with a connection, 1038*6236dae4SAndroid Build Coastguard Worker and also allow curl_easy_reset() to clear this information from the 1039*6236dae4SAndroid Build Coastguard Worker session handle without disturbing information which is still alive, and 1040*6236dae4SAndroid Build Coastguard Worker that might be reused, in the connection pool. */ 1041*6236dae4SAndroid Build Coastguard Worker struct ip_quadruple primary; 1042*6236dae4SAndroid Build Coastguard Worker int conn_remote_port; /* this is the "remote port", which is the port 1043*6236dae4SAndroid Build Coastguard Worker number of the used URL, independent of proxy or 1044*6236dae4SAndroid Build Coastguard Worker not */ 1045*6236dae4SAndroid Build Coastguard Worker const char *conn_scheme; 1046*6236dae4SAndroid Build Coastguard Worker unsigned int conn_protocol; 1047*6236dae4SAndroid Build Coastguard Worker struct curl_certinfo certs; /* info about the certs. Asked for with 1048*6236dae4SAndroid Build Coastguard Worker CURLOPT_CERTINFO / CURLINFO_CERTINFO */ 1049*6236dae4SAndroid Build Coastguard Worker CURLproxycode pxcode; 1050*6236dae4SAndroid Build Coastguard Worker BIT(timecond); /* set to TRUE if the time condition did not match, which 1051*6236dae4SAndroid Build Coastguard Worker thus made the document NOT get fetched */ 1052*6236dae4SAndroid Build Coastguard Worker BIT(used_proxy); /* the transfer used a proxy */ 1053*6236dae4SAndroid Build Coastguard Worker }; 1054*6236dae4SAndroid Build Coastguard Worker 1055*6236dae4SAndroid Build Coastguard Worker struct pgrs_measure { 1056*6236dae4SAndroid Build Coastguard Worker struct curltime start; /* when measure started */ 1057*6236dae4SAndroid Build Coastguard Worker curl_off_t start_size; /* the 'cur_size' the measure started at */ 1058*6236dae4SAndroid Build Coastguard Worker }; 1059*6236dae4SAndroid Build Coastguard Worker 1060*6236dae4SAndroid Build Coastguard Worker struct pgrs_dir { 1061*6236dae4SAndroid Build Coastguard Worker curl_off_t total_size; /* total expected bytes */ 1062*6236dae4SAndroid Build Coastguard Worker curl_off_t cur_size; /* transferred bytes so far */ 1063*6236dae4SAndroid Build Coastguard Worker curl_off_t speed; /* bytes per second transferred */ 1064*6236dae4SAndroid Build Coastguard Worker struct pgrs_measure limit; 1065*6236dae4SAndroid Build Coastguard Worker }; 1066*6236dae4SAndroid Build Coastguard Worker 1067*6236dae4SAndroid Build Coastguard Worker struct Progress { 1068*6236dae4SAndroid Build Coastguard Worker time_t lastshow; /* time() of the last displayed progress meter or NULL to 1069*6236dae4SAndroid Build Coastguard Worker force redraw at next call */ 1070*6236dae4SAndroid Build Coastguard Worker struct pgrs_dir ul; 1071*6236dae4SAndroid Build Coastguard Worker struct pgrs_dir dl; 1072*6236dae4SAndroid Build Coastguard Worker 1073*6236dae4SAndroid Build Coastguard Worker curl_off_t current_speed; /* uses the currently fastest transfer */ 1074*6236dae4SAndroid Build Coastguard Worker curl_off_t earlydata_sent; 1075*6236dae4SAndroid Build Coastguard Worker 1076*6236dae4SAndroid Build Coastguard Worker int width; /* screen width at download start */ 1077*6236dae4SAndroid Build Coastguard Worker int flags; /* see progress.h */ 1078*6236dae4SAndroid Build Coastguard Worker 1079*6236dae4SAndroid Build Coastguard Worker timediff_t timespent; 1080*6236dae4SAndroid Build Coastguard Worker 1081*6236dae4SAndroid Build Coastguard Worker timediff_t t_postqueue; 1082*6236dae4SAndroid Build Coastguard Worker timediff_t t_nslookup; 1083*6236dae4SAndroid Build Coastguard Worker timediff_t t_connect; 1084*6236dae4SAndroid Build Coastguard Worker timediff_t t_appconnect; 1085*6236dae4SAndroid Build Coastguard Worker timediff_t t_pretransfer; 1086*6236dae4SAndroid Build Coastguard Worker timediff_t t_posttransfer; 1087*6236dae4SAndroid Build Coastguard Worker timediff_t t_starttransfer; 1088*6236dae4SAndroid Build Coastguard Worker timediff_t t_redirect; 1089*6236dae4SAndroid Build Coastguard Worker 1090*6236dae4SAndroid Build Coastguard Worker struct curltime start; 1091*6236dae4SAndroid Build Coastguard Worker struct curltime t_startsingle; 1092*6236dae4SAndroid Build Coastguard Worker struct curltime t_startop; 1093*6236dae4SAndroid Build Coastguard Worker struct curltime t_acceptdata; 1094*6236dae4SAndroid Build Coastguard Worker 1095*6236dae4SAndroid Build Coastguard Worker #define CURR_TIME (5 + 1) /* 6 entries for 5 seconds */ 1096*6236dae4SAndroid Build Coastguard Worker 1097*6236dae4SAndroid Build Coastguard Worker curl_off_t speeder[ CURR_TIME ]; 1098*6236dae4SAndroid Build Coastguard Worker struct curltime speeder_time[ CURR_TIME ]; 1099*6236dae4SAndroid Build Coastguard Worker int speeder_c; 1100*6236dae4SAndroid Build Coastguard Worker BIT(callback); /* set when progress callback is used */ 1101*6236dae4SAndroid Build Coastguard Worker BIT(is_t_startransfer_set); 1102*6236dae4SAndroid Build Coastguard Worker }; 1103*6236dae4SAndroid Build Coastguard Worker 1104*6236dae4SAndroid Build Coastguard Worker typedef enum { 1105*6236dae4SAndroid Build Coastguard Worker RTSPREQ_NONE, /* first in list */ 1106*6236dae4SAndroid Build Coastguard Worker RTSPREQ_OPTIONS, 1107*6236dae4SAndroid Build Coastguard Worker RTSPREQ_DESCRIBE, 1108*6236dae4SAndroid Build Coastguard Worker RTSPREQ_ANNOUNCE, 1109*6236dae4SAndroid Build Coastguard Worker RTSPREQ_SETUP, 1110*6236dae4SAndroid Build Coastguard Worker RTSPREQ_PLAY, 1111*6236dae4SAndroid Build Coastguard Worker RTSPREQ_PAUSE, 1112*6236dae4SAndroid Build Coastguard Worker RTSPREQ_TEARDOWN, 1113*6236dae4SAndroid Build Coastguard Worker RTSPREQ_GET_PARAMETER, 1114*6236dae4SAndroid Build Coastguard Worker RTSPREQ_SET_PARAMETER, 1115*6236dae4SAndroid Build Coastguard Worker RTSPREQ_RECORD, 1116*6236dae4SAndroid Build Coastguard Worker RTSPREQ_RECEIVE, 1117*6236dae4SAndroid Build Coastguard Worker RTSPREQ_LAST /* last in list */ 1118*6236dae4SAndroid Build Coastguard Worker } Curl_RtspReq; 1119*6236dae4SAndroid Build Coastguard Worker 1120*6236dae4SAndroid Build Coastguard Worker struct auth { 1121*6236dae4SAndroid Build Coastguard Worker unsigned long want; /* Bitmask set to the authentication methods wanted by 1122*6236dae4SAndroid Build Coastguard Worker app (with CURLOPT_HTTPAUTH or CURLOPT_PROXYAUTH). */ 1123*6236dae4SAndroid Build Coastguard Worker unsigned long picked; 1124*6236dae4SAndroid Build Coastguard Worker unsigned long avail; /* Bitmask for what the server reports to support for 1125*6236dae4SAndroid Build Coastguard Worker this resource */ 1126*6236dae4SAndroid Build Coastguard Worker BIT(done); /* TRUE when the auth phase is done and ready to do the 1127*6236dae4SAndroid Build Coastguard Worker actual request */ 1128*6236dae4SAndroid Build Coastguard Worker BIT(multipass); /* TRUE if this is not yet authenticated but within the 1129*6236dae4SAndroid Build Coastguard Worker auth multipass negotiation */ 1130*6236dae4SAndroid Build Coastguard Worker BIT(iestyle); /* TRUE if digest should be done IE-style or FALSE if it 1131*6236dae4SAndroid Build Coastguard Worker should be RFC compliant */ 1132*6236dae4SAndroid Build Coastguard Worker }; 1133*6236dae4SAndroid Build Coastguard Worker 1134*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2 1135*6236dae4SAndroid Build Coastguard Worker struct Curl_data_prio_node { 1136*6236dae4SAndroid Build Coastguard Worker struct Curl_data_prio_node *next; 1137*6236dae4SAndroid Build Coastguard Worker struct Curl_easy *data; 1138*6236dae4SAndroid Build Coastguard Worker }; 1139*6236dae4SAndroid Build Coastguard Worker #endif 1140*6236dae4SAndroid Build Coastguard Worker 1141*6236dae4SAndroid Build Coastguard Worker /** 1142*6236dae4SAndroid Build Coastguard Worker * Priority information for an easy handle in relation to others 1143*6236dae4SAndroid Build Coastguard Worker * on the same connection. 1144*6236dae4SAndroid Build Coastguard Worker * TODO: we need to adapt it to the new priority scheme as defined in RFC 9218 1145*6236dae4SAndroid Build Coastguard Worker */ 1146*6236dae4SAndroid Build Coastguard Worker struct Curl_data_priority { 1147*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2 1148*6236dae4SAndroid Build Coastguard Worker /* tree like dependencies only implemented in nghttp2 */ 1149*6236dae4SAndroid Build Coastguard Worker struct Curl_easy *parent; 1150*6236dae4SAndroid Build Coastguard Worker struct Curl_data_prio_node *children; 1151*6236dae4SAndroid Build Coastguard Worker #endif 1152*6236dae4SAndroid Build Coastguard Worker int weight; 1153*6236dae4SAndroid Build Coastguard Worker #ifdef USE_NGHTTP2 1154*6236dae4SAndroid Build Coastguard Worker BIT(exclusive); 1155*6236dae4SAndroid Build Coastguard Worker #endif 1156*6236dae4SAndroid Build Coastguard Worker }; 1157*6236dae4SAndroid Build Coastguard Worker 1158*6236dae4SAndroid Build Coastguard Worker /* Timers */ 1159*6236dae4SAndroid Build Coastguard Worker typedef enum { 1160*6236dae4SAndroid Build Coastguard Worker EXPIRE_100_TIMEOUT, 1161*6236dae4SAndroid Build Coastguard Worker EXPIRE_ASYNC_NAME, 1162*6236dae4SAndroid Build Coastguard Worker EXPIRE_CONNECTTIMEOUT, 1163*6236dae4SAndroid Build Coastguard Worker EXPIRE_DNS_PER_NAME, /* family1 */ 1164*6236dae4SAndroid Build Coastguard Worker EXPIRE_DNS_PER_NAME2, /* family2 */ 1165*6236dae4SAndroid Build Coastguard Worker EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */ 1166*6236dae4SAndroid Build Coastguard Worker EXPIRE_HAPPY_EYEBALLS, 1167*6236dae4SAndroid Build Coastguard Worker EXPIRE_MULTI_PENDING, 1168*6236dae4SAndroid Build Coastguard Worker EXPIRE_RUN_NOW, 1169*6236dae4SAndroid Build Coastguard Worker EXPIRE_SPEEDCHECK, 1170*6236dae4SAndroid Build Coastguard Worker EXPIRE_TIMEOUT, 1171*6236dae4SAndroid Build Coastguard Worker EXPIRE_TOOFAST, 1172*6236dae4SAndroid Build Coastguard Worker EXPIRE_QUIC, 1173*6236dae4SAndroid Build Coastguard Worker EXPIRE_FTP_ACCEPT, 1174*6236dae4SAndroid Build Coastguard Worker EXPIRE_ALPN_EYEBALLS, 1175*6236dae4SAndroid Build Coastguard Worker EXPIRE_LAST /* not an actual timer, used as a marker only */ 1176*6236dae4SAndroid Build Coastguard Worker } expire_id; 1177*6236dae4SAndroid Build Coastguard Worker 1178*6236dae4SAndroid Build Coastguard Worker 1179*6236dae4SAndroid Build Coastguard Worker typedef enum { 1180*6236dae4SAndroid Build Coastguard Worker TRAILERS_NONE, 1181*6236dae4SAndroid Build Coastguard Worker TRAILERS_INITIALIZED, 1182*6236dae4SAndroid Build Coastguard Worker TRAILERS_SENDING, 1183*6236dae4SAndroid Build Coastguard Worker TRAILERS_DONE 1184*6236dae4SAndroid Build Coastguard Worker } trailers_state; 1185*6236dae4SAndroid Build Coastguard Worker 1186*6236dae4SAndroid Build Coastguard Worker 1187*6236dae4SAndroid Build Coastguard Worker /* 1188*6236dae4SAndroid Build Coastguard Worker * One instance for each timeout an easy handle can set. 1189*6236dae4SAndroid Build Coastguard Worker */ 1190*6236dae4SAndroid Build Coastguard Worker struct time_node { 1191*6236dae4SAndroid Build Coastguard Worker struct Curl_llist_node list; 1192*6236dae4SAndroid Build Coastguard Worker struct curltime time; 1193*6236dae4SAndroid Build Coastguard Worker expire_id eid; 1194*6236dae4SAndroid Build Coastguard Worker }; 1195*6236dae4SAndroid Build Coastguard Worker 1196*6236dae4SAndroid Build Coastguard Worker /* individual pieces of the URL */ 1197*6236dae4SAndroid Build Coastguard Worker struct urlpieces { 1198*6236dae4SAndroid Build Coastguard Worker char *scheme; 1199*6236dae4SAndroid Build Coastguard Worker char *hostname; 1200*6236dae4SAndroid Build Coastguard Worker char *port; 1201*6236dae4SAndroid Build Coastguard Worker char *user; 1202*6236dae4SAndroid Build Coastguard Worker char *password; 1203*6236dae4SAndroid Build Coastguard Worker char *options; 1204*6236dae4SAndroid Build Coastguard Worker char *path; 1205*6236dae4SAndroid Build Coastguard Worker char *query; 1206*6236dae4SAndroid Build Coastguard Worker }; 1207*6236dae4SAndroid Build Coastguard Worker 1208*6236dae4SAndroid Build Coastguard Worker #define CREDS_NONE 0 1209*6236dae4SAndroid Build Coastguard Worker #define CREDS_URL 1 /* from URL */ 1210*6236dae4SAndroid Build Coastguard Worker #define CREDS_OPTION 2 /* set with a CURLOPT_ */ 1211*6236dae4SAndroid Build Coastguard Worker #define CREDS_NETRC 3 /* found in netrc */ 1212*6236dae4SAndroid Build Coastguard Worker 1213*6236dae4SAndroid Build Coastguard Worker struct UrlState { 1214*6236dae4SAndroid Build Coastguard Worker /* buffers to store authentication data in, as parsed from input options */ 1215*6236dae4SAndroid Build Coastguard Worker struct curltime keeps_speed; /* for the progress meter really */ 1216*6236dae4SAndroid Build Coastguard Worker 1217*6236dae4SAndroid Build Coastguard Worker curl_off_t lastconnect_id; /* The last connection, -1 if undefined */ 1218*6236dae4SAndroid Build Coastguard Worker curl_off_t recent_conn_id; /* The most recent connection used, might no 1219*6236dae4SAndroid Build Coastguard Worker * longer exist */ 1220*6236dae4SAndroid Build Coastguard Worker struct dynbuf headerb; /* buffer to store headers in */ 1221*6236dae4SAndroid Build Coastguard Worker struct curl_slist *hstslist; /* list of HSTS files set by 1222*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(HSTS) calls */ 1223*6236dae4SAndroid Build Coastguard Worker curl_off_t current_speed; /* the ProgressShow() function sets this, 1224*6236dae4SAndroid Build Coastguard Worker bytes / second */ 1225*6236dae4SAndroid Build Coastguard Worker 1226*6236dae4SAndroid Build Coastguard Worker /* hostname, port number and protocol of the first (not followed) request. 1227*6236dae4SAndroid Build Coastguard Worker if set, this should be the hostname that we will sent authorization to, 1228*6236dae4SAndroid Build Coastguard Worker no else. Used to make Location: following not keep sending user+password. 1229*6236dae4SAndroid Build Coastguard Worker This is strdup()ed data. */ 1230*6236dae4SAndroid Build Coastguard Worker char *first_host; 1231*6236dae4SAndroid Build Coastguard Worker int first_remote_port; 1232*6236dae4SAndroid Build Coastguard Worker curl_prot_t first_remote_protocol; 1233*6236dae4SAndroid Build Coastguard Worker 1234*6236dae4SAndroid Build Coastguard Worker int retrycount; /* number of retries on a new connection */ 1235*6236dae4SAndroid Build Coastguard Worker struct Curl_ssl_session *session; /* array of 'max_ssl_sessions' size */ 1236*6236dae4SAndroid Build Coastguard Worker long sessionage; /* number of the most recent session */ 1237*6236dae4SAndroid Build Coastguard Worker int os_errno; /* filled in with errno whenever an error occurs */ 1238*6236dae4SAndroid Build Coastguard Worker long followlocation; /* redirect counter */ 1239*6236dae4SAndroid Build Coastguard Worker int requests; /* request counter: redirects + authentication retakes */ 1240*6236dae4SAndroid Build Coastguard Worker #ifdef HAVE_SIGNAL 1241*6236dae4SAndroid Build Coastguard Worker /* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */ 1242*6236dae4SAndroid Build Coastguard Worker void (*prev_signal)(int sig); 1243*6236dae4SAndroid Build Coastguard Worker #endif 1244*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DIGEST_AUTH 1245*6236dae4SAndroid Build Coastguard Worker struct digestdata digest; /* state data for host Digest auth */ 1246*6236dae4SAndroid Build Coastguard Worker struct digestdata proxydigest; /* state data for proxy Digest auth */ 1247*6236dae4SAndroid Build Coastguard Worker #endif 1248*6236dae4SAndroid Build Coastguard Worker struct auth authhost; /* auth details for host */ 1249*6236dae4SAndroid Build Coastguard Worker struct auth authproxy; /* auth details for proxy */ 1250*6236dae4SAndroid Build Coastguard Worker #ifdef USE_CURL_ASYNC 1251*6236dae4SAndroid Build Coastguard Worker struct Curl_async async; /* asynchronous name resolver data */ 1252*6236dae4SAndroid Build Coastguard Worker #endif 1253*6236dae4SAndroid Build Coastguard Worker 1254*6236dae4SAndroid Build Coastguard Worker #if defined(USE_OPENSSL) 1255*6236dae4SAndroid Build Coastguard Worker /* void instead of ENGINE to avoid bleeding OpenSSL into this header */ 1256*6236dae4SAndroid Build Coastguard Worker void *engine; 1257*6236dae4SAndroid Build Coastguard Worker #endif /* USE_OPENSSL */ 1258*6236dae4SAndroid Build Coastguard Worker struct curltime expiretime; /* set this with Curl_expire() only */ 1259*6236dae4SAndroid Build Coastguard Worker struct Curl_tree timenode; /* for the splay stuff */ 1260*6236dae4SAndroid Build Coastguard Worker struct Curl_llist timeoutlist; /* list of pending timeouts */ 1261*6236dae4SAndroid Build Coastguard Worker struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */ 1262*6236dae4SAndroid Build Coastguard Worker 1263*6236dae4SAndroid Build Coastguard Worker /* a place to store the most recently set (S)FTP entrypath */ 1264*6236dae4SAndroid Build Coastguard Worker char *most_recent_ftp_entrypath; 1265*6236dae4SAndroid Build Coastguard Worker char *range; /* range, if used. See README for detailed specification on 1266*6236dae4SAndroid Build Coastguard Worker this syntax. */ 1267*6236dae4SAndroid Build Coastguard Worker curl_off_t resume_from; /* continue [ftp] transfer from here */ 1268*6236dae4SAndroid Build Coastguard Worker 1269*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP 1270*6236dae4SAndroid Build Coastguard Worker /* This RTSP state information survives requests and connections */ 1271*6236dae4SAndroid Build Coastguard Worker long rtsp_next_client_CSeq; /* the session's next client CSeq */ 1272*6236dae4SAndroid Build Coastguard Worker long rtsp_next_server_CSeq; /* the session's next server CSeq */ 1273*6236dae4SAndroid Build Coastguard Worker long rtsp_CSeq_recv; /* most recent CSeq received */ 1274*6236dae4SAndroid Build Coastguard Worker 1275*6236dae4SAndroid Build Coastguard Worker unsigned char rtp_channel_mask[32]; /* for the correctness checking of the 1276*6236dae4SAndroid Build Coastguard Worker interleaved data */ 1277*6236dae4SAndroid Build Coastguard Worker #endif 1278*6236dae4SAndroid Build Coastguard Worker 1279*6236dae4SAndroid Build Coastguard Worker curl_off_t infilesize; /* size of file to upload, -1 means unknown. 1280*6236dae4SAndroid Build Coastguard Worker Copied from set.filesize at start of operation */ 1281*6236dae4SAndroid Build Coastguard Worker #if defined(USE_HTTP2) || defined(USE_HTTP3) 1282*6236dae4SAndroid Build Coastguard Worker struct Curl_data_priority priority; /* shallow copy of data->set */ 1283*6236dae4SAndroid Build Coastguard Worker #endif 1284*6236dae4SAndroid Build Coastguard Worker 1285*6236dae4SAndroid Build Coastguard Worker curl_read_callback fread_func; /* read callback/function */ 1286*6236dae4SAndroid Build Coastguard Worker void *in; /* CURLOPT_READDATA */ 1287*6236dae4SAndroid Build Coastguard Worker CURLU *uh; /* URL handle for the current parsed URL */ 1288*6236dae4SAndroid Build Coastguard Worker struct urlpieces up; 1289*6236dae4SAndroid Build Coastguard Worker char *url; /* work URL, copied from UserDefined */ 1290*6236dae4SAndroid Build Coastguard Worker char *referer; /* referer string */ 1291*6236dae4SAndroid Build Coastguard Worker struct curl_slist *resolve; /* set to point to the set.resolve list when 1292*6236dae4SAndroid Build Coastguard Worker this should be dealt with in pretransfer */ 1293*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP 1294*6236dae4SAndroid Build Coastguard Worker curl_mimepart *mimepost; 1295*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FORM_API 1296*6236dae4SAndroid Build Coastguard Worker curl_mimepart *formp; /* storage for old API form-posting, allocated on 1297*6236dae4SAndroid Build Coastguard Worker demand */ 1298*6236dae4SAndroid Build Coastguard Worker #endif 1299*6236dae4SAndroid Build Coastguard Worker size_t trailers_bytes_sent; 1300*6236dae4SAndroid Build Coastguard Worker struct dynbuf trailers_buf; /* a buffer containing the compiled trailing 1301*6236dae4SAndroid Build Coastguard Worker headers */ 1302*6236dae4SAndroid Build Coastguard Worker struct Curl_llist httphdrs; /* received headers */ 1303*6236dae4SAndroid Build Coastguard Worker struct curl_header headerout[2]; /* for external purposes */ 1304*6236dae4SAndroid Build Coastguard Worker struct Curl_header_store *prevhead; /* the latest added header */ 1305*6236dae4SAndroid Build Coastguard Worker trailers_state trailers_state; /* whether we are sending trailers 1306*6236dae4SAndroid Build Coastguard Worker and what stage are we at */ 1307*6236dae4SAndroid Build Coastguard Worker #endif 1308*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1309*6236dae4SAndroid Build Coastguard Worker struct curl_slist *cookielist; /* list of cookie files set by 1310*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(COOKIEFILE) calls */ 1311*6236dae4SAndroid Build Coastguard Worker #endif 1312*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER 1313*6236dae4SAndroid Build Coastguard Worker bool hconnect; /* set if a CONNECT request */ 1314*6236dae4SAndroid Build Coastguard Worker CURLcode hresult; /* used to pass return codes back from hyper callbacks */ 1315*6236dae4SAndroid Build Coastguard Worker #endif 1316*6236dae4SAndroid Build Coastguard Worker 1317*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_VERBOSE_STRINGS 1318*6236dae4SAndroid Build Coastguard Worker struct curl_trc_feat *feat; /* opt. trace feature transfer is part of */ 1319*6236dae4SAndroid Build Coastguard Worker #endif 1320*6236dae4SAndroid Build Coastguard Worker 1321*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_NETRC 1322*6236dae4SAndroid Build Coastguard Worker struct store_netrc netrc; 1323*6236dae4SAndroid Build Coastguard Worker #endif 1324*6236dae4SAndroid Build Coastguard Worker 1325*6236dae4SAndroid Build Coastguard Worker /* Dynamically allocated strings, MUST be freed before this struct is 1326*6236dae4SAndroid Build Coastguard Worker killed. */ 1327*6236dae4SAndroid Build Coastguard Worker struct dynamically_allocated_data { 1328*6236dae4SAndroid Build Coastguard Worker char *uagent; 1329*6236dae4SAndroid Build Coastguard Worker char *accept_encoding; 1330*6236dae4SAndroid Build Coastguard Worker char *userpwd; 1331*6236dae4SAndroid Build Coastguard Worker char *rangeline; 1332*6236dae4SAndroid Build Coastguard Worker char *ref; 1333*6236dae4SAndroid Build Coastguard Worker char *host; 1334*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1335*6236dae4SAndroid Build Coastguard Worker char *cookiehost; 1336*6236dae4SAndroid Build Coastguard Worker #endif 1337*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP 1338*6236dae4SAndroid Build Coastguard Worker char *rtsp_transport; 1339*6236dae4SAndroid Build Coastguard Worker #endif 1340*6236dae4SAndroid Build Coastguard Worker char *te; /* TE: request header */ 1341*6236dae4SAndroid Build Coastguard Worker 1342*6236dae4SAndroid Build Coastguard Worker /* transfer credentials */ 1343*6236dae4SAndroid Build Coastguard Worker char *user; 1344*6236dae4SAndroid Build Coastguard Worker char *passwd; 1345*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1346*6236dae4SAndroid Build Coastguard Worker char *proxyuserpwd; 1347*6236dae4SAndroid Build Coastguard Worker char *proxyuser; 1348*6236dae4SAndroid Build Coastguard Worker char *proxypasswd; 1349*6236dae4SAndroid Build Coastguard Worker #endif 1350*6236dae4SAndroid Build Coastguard Worker } aptr; 1351*6236dae4SAndroid Build Coastguard Worker unsigned char httpwant; /* when non-zero, a specific HTTP version requested 1352*6236dae4SAndroid Build Coastguard Worker to be used in the library's request(s) */ 1353*6236dae4SAndroid Build Coastguard Worker unsigned char httpversion; /* the lowest HTTP version*10 reported by any 1354*6236dae4SAndroid Build Coastguard Worker server involved in this request */ 1355*6236dae4SAndroid Build Coastguard Worker unsigned char httpreq; /* Curl_HttpReq; what kind of HTTP request (if any) 1356*6236dae4SAndroid Build Coastguard Worker is this */ 1357*6236dae4SAndroid Build Coastguard Worker unsigned char select_bits; /* != 0 -> bitmask of socket events for this 1358*6236dae4SAndroid Build Coastguard Worker transfer overriding anything the socket may 1359*6236dae4SAndroid Build Coastguard Worker report */ 1360*6236dae4SAndroid Build Coastguard Worker unsigned int creds_from:2; /* where is the server credentials originating 1361*6236dae4SAndroid Build Coastguard Worker from, see the CREDS_* defines above */ 1362*6236dae4SAndroid Build Coastguard Worker 1363*6236dae4SAndroid Build Coastguard Worker /* when curl_easy_perform() is called, the multi handle is "owned" by 1364*6236dae4SAndroid Build Coastguard Worker the easy handle so curl_easy_cleanup() on such an easy handle will 1365*6236dae4SAndroid Build Coastguard Worker also close the multi handle! */ 1366*6236dae4SAndroid Build Coastguard Worker BIT(multi_owned_by_easy); 1367*6236dae4SAndroid Build Coastguard Worker 1368*6236dae4SAndroid Build Coastguard Worker BIT(this_is_a_follow); /* this is a followed Location: request */ 1369*6236dae4SAndroid Build Coastguard Worker BIT(refused_stream); /* this was refused, try again */ 1370*6236dae4SAndroid Build Coastguard Worker BIT(errorbuf); /* Set to TRUE if the error buffer is already filled in. 1371*6236dae4SAndroid Build Coastguard Worker This must be set to FALSE every time _easy_perform() is 1372*6236dae4SAndroid Build Coastguard Worker called. */ 1373*6236dae4SAndroid Build Coastguard Worker BIT(allow_port); /* Is set.use_port allowed to take effect or not. This 1374*6236dae4SAndroid Build Coastguard Worker is always set TRUE when curl_easy_perform() is called. */ 1375*6236dae4SAndroid Build Coastguard Worker BIT(authproblem); /* TRUE if there is some problem authenticating */ 1376*6236dae4SAndroid Build Coastguard Worker /* set after initial USER failure, to prevent an authentication loop */ 1377*6236dae4SAndroid Build Coastguard Worker BIT(wildcardmatch); /* enable wildcard matching */ 1378*6236dae4SAndroid Build Coastguard Worker BIT(disableexpect); /* TRUE if Expect: is disabled due to a previous 1379*6236dae4SAndroid Build Coastguard Worker 417 response */ 1380*6236dae4SAndroid Build Coastguard Worker BIT(use_range); 1381*6236dae4SAndroid Build Coastguard Worker BIT(rangestringalloc); /* the range string is malloc()'ed */ 1382*6236dae4SAndroid Build Coastguard Worker BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE 1383*6236dae4SAndroid Build Coastguard Worker when multi_done() is called, to prevent multi_done() to get 1384*6236dae4SAndroid Build Coastguard Worker invoked twice when the multi interface is used. */ 1385*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1386*6236dae4SAndroid Build Coastguard Worker BIT(cookie_engine); 1387*6236dae4SAndroid Build Coastguard Worker #endif 1388*6236dae4SAndroid Build Coastguard Worker BIT(prefer_ascii); /* ASCII rather than binary */ 1389*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_LIST_ONLY_PROTOCOL 1390*6236dae4SAndroid Build Coastguard Worker BIT(list_only); /* list directory contents */ 1391*6236dae4SAndroid Build Coastguard Worker #endif 1392*6236dae4SAndroid Build Coastguard Worker BIT(url_alloc); /* URL string is malloc()'ed */ 1393*6236dae4SAndroid Build Coastguard Worker BIT(referer_alloc); /* referer string is malloc()ed */ 1394*6236dae4SAndroid Build Coastguard Worker BIT(wildcard_resolve); /* Set to true if any resolve change is a wildcard */ 1395*6236dae4SAndroid Build Coastguard Worker BIT(upload); /* upload request */ 1396*6236dae4SAndroid Build Coastguard Worker BIT(internal); /* internal: true if this easy handle was created for 1397*6236dae4SAndroid Build Coastguard Worker internal use and the user does not have ownership of the 1398*6236dae4SAndroid Build Coastguard Worker handle. */ 1399*6236dae4SAndroid Build Coastguard Worker }; 1400*6236dae4SAndroid Build Coastguard Worker 1401*6236dae4SAndroid Build Coastguard Worker /* 1402*6236dae4SAndroid Build Coastguard Worker * This 'UserDefined' struct must only contain data that is set once to go 1403*6236dae4SAndroid Build Coastguard Worker * for many (perhaps) independent connections. Values that are generated or 1404*6236dae4SAndroid Build Coastguard Worker * calculated internally for the "session handle" MUST be defined within the 1405*6236dae4SAndroid Build Coastguard Worker * 'struct UrlState' instead. The only exceptions MUST note the changes in 1406*6236dae4SAndroid Build Coastguard Worker * the 'DynamicStatic' struct. 1407*6236dae4SAndroid Build Coastguard Worker * Character pointer fields point to dynamic storage, unless otherwise stated. 1408*6236dae4SAndroid Build Coastguard Worker */ 1409*6236dae4SAndroid Build Coastguard Worker 1410*6236dae4SAndroid Build Coastguard Worker struct Curl_multi; /* declared in multihandle.c */ 1411*6236dae4SAndroid Build Coastguard Worker 1412*6236dae4SAndroid Build Coastguard Worker enum dupstring { 1413*6236dae4SAndroid Build Coastguard Worker STRING_CERT, /* client certificate filename */ 1414*6236dae4SAndroid Build Coastguard Worker STRING_CERT_TYPE, /* format for certificate (default: PEM)*/ 1415*6236dae4SAndroid Build Coastguard Worker STRING_KEY, /* private key filename */ 1416*6236dae4SAndroid Build Coastguard Worker STRING_KEY_PASSWD, /* plain text private key password */ 1417*6236dae4SAndroid Build Coastguard Worker STRING_KEY_TYPE, /* format for private key (default: PEM) */ 1418*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CAPATH, /* CA directory name (does not work on Windows) */ 1419*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CAFILE, /* certificate file to verify peer against */ 1420*6236dae4SAndroid Build Coastguard Worker STRING_SSL_PINNEDPUBLICKEY, /* public key file to verify peer against */ 1421*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CIPHER_LIST, /* list of ciphers to use */ 1422*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CIPHER13_LIST, /* list of TLS 1.3 ciphers to use */ 1423*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CRLFILE, /* crl file to check certificate */ 1424*6236dae4SAndroid Build Coastguard Worker STRING_SSL_ISSUERCERT, /* issuer cert file to check certificate */ 1425*6236dae4SAndroid Build Coastguard Worker STRING_SERVICE_NAME, /* Service name */ 1426*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1427*6236dae4SAndroid Build Coastguard Worker STRING_CERT_PROXY, /* client certificate filename */ 1428*6236dae4SAndroid Build Coastguard Worker STRING_CERT_TYPE_PROXY, /* format for certificate (default: PEM)*/ 1429*6236dae4SAndroid Build Coastguard Worker STRING_KEY_PROXY, /* private key filename */ 1430*6236dae4SAndroid Build Coastguard Worker STRING_KEY_PASSWD_PROXY, /* plain text private key password */ 1431*6236dae4SAndroid Build Coastguard Worker STRING_KEY_TYPE_PROXY, /* format for private key (default: PEM) */ 1432*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CAPATH_PROXY, /* CA directory name (does not work on Windows) */ 1433*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CAFILE_PROXY, /* certificate file to verify peer against */ 1434*6236dae4SAndroid Build Coastguard Worker STRING_SSL_PINNEDPUBLICKEY_PROXY, /* public key file to verify proxy */ 1435*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CIPHER_LIST_PROXY, /* list of ciphers to use */ 1436*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CIPHER13_LIST_PROXY, /* list of TLS 1.3 ciphers to use */ 1437*6236dae4SAndroid Build Coastguard Worker STRING_SSL_CRLFILE_PROXY, /* crl file to check certificate */ 1438*6236dae4SAndroid Build Coastguard Worker STRING_SSL_ISSUERCERT_PROXY, /* issuer cert file to check certificate */ 1439*6236dae4SAndroid Build Coastguard Worker STRING_PROXY_SERVICE_NAME, /* Proxy service name */ 1440*6236dae4SAndroid Build Coastguard Worker #endif 1441*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1442*6236dae4SAndroid Build Coastguard Worker STRING_COOKIE, /* HTTP cookie string to send */ 1443*6236dae4SAndroid Build Coastguard Worker STRING_COOKIEJAR, /* dump all cookies to this file */ 1444*6236dae4SAndroid Build Coastguard Worker #endif 1445*6236dae4SAndroid Build Coastguard Worker STRING_CUSTOMREQUEST, /* HTTP/FTP/RTSP request/method to use */ 1446*6236dae4SAndroid Build Coastguard Worker STRING_DEFAULT_PROTOCOL, /* Protocol to use when the URL does not specify */ 1447*6236dae4SAndroid Build Coastguard Worker STRING_DEVICE, /* local network interface/address to use */ 1448*6236dae4SAndroid Build Coastguard Worker STRING_INTERFACE, /* local network interface to use */ 1449*6236dae4SAndroid Build Coastguard Worker STRING_BINDHOST, /* local address to use */ 1450*6236dae4SAndroid Build Coastguard Worker STRING_ENCODING, /* Accept-Encoding string */ 1451*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 1452*6236dae4SAndroid Build Coastguard Worker STRING_FTP_ACCOUNT, /* ftp account data */ 1453*6236dae4SAndroid Build Coastguard Worker STRING_FTP_ALTERNATIVE_TO_USER, /* command to send if USER/PASS fails */ 1454*6236dae4SAndroid Build Coastguard Worker STRING_FTPPORT, /* port to send with the FTP PORT command */ 1455*6236dae4SAndroid Build Coastguard Worker #endif 1456*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_GSSAPI) 1457*6236dae4SAndroid Build Coastguard Worker STRING_KRB_LEVEL, /* krb security level */ 1458*6236dae4SAndroid Build Coastguard Worker #endif 1459*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_NETRC 1460*6236dae4SAndroid Build Coastguard Worker STRING_NETRC_FILE, /* if not NULL, use this instead of trying to find 1461*6236dae4SAndroid Build Coastguard Worker $HOME/.netrc */ 1462*6236dae4SAndroid Build Coastguard Worker #endif 1463*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1464*6236dae4SAndroid Build Coastguard Worker STRING_PROXY, /* proxy to use */ 1465*6236dae4SAndroid Build Coastguard Worker STRING_PRE_PROXY, /* pre socks proxy to use */ 1466*6236dae4SAndroid Build Coastguard Worker #endif 1467*6236dae4SAndroid Build Coastguard Worker STRING_SET_RANGE, /* range, if used */ 1468*6236dae4SAndroid Build Coastguard Worker STRING_SET_REFERER, /* custom string for the HTTP referer field */ 1469*6236dae4SAndroid Build Coastguard Worker STRING_SET_URL, /* what original URL to work on */ 1470*6236dae4SAndroid Build Coastguard Worker STRING_USERAGENT, /* User-Agent string */ 1471*6236dae4SAndroid Build Coastguard Worker STRING_SSL_ENGINE, /* name of ssl engine */ 1472*6236dae4SAndroid Build Coastguard Worker STRING_USERNAME, /* <username>, if used */ 1473*6236dae4SAndroid Build Coastguard Worker STRING_PASSWORD, /* <password>, if used */ 1474*6236dae4SAndroid Build Coastguard Worker STRING_OPTIONS, /* <options>, if used */ 1475*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1476*6236dae4SAndroid Build Coastguard Worker STRING_PROXYUSERNAME, /* Proxy <username>, if used */ 1477*6236dae4SAndroid Build Coastguard Worker STRING_PROXYPASSWORD, /* Proxy <password>, if used */ 1478*6236dae4SAndroid Build Coastguard Worker STRING_NOPROXY, /* List of hosts which should not use the proxy, if 1479*6236dae4SAndroid Build Coastguard Worker used */ 1480*6236dae4SAndroid Build Coastguard Worker #endif 1481*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP 1482*6236dae4SAndroid Build Coastguard Worker STRING_RTSP_SESSION_ID, /* Session ID to use */ 1483*6236dae4SAndroid Build Coastguard Worker STRING_RTSP_STREAM_URI, /* Stream URI for this request */ 1484*6236dae4SAndroid Build Coastguard Worker STRING_RTSP_TRANSPORT, /* Transport for this session */ 1485*6236dae4SAndroid Build Coastguard Worker #endif 1486*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH 1487*6236dae4SAndroid Build Coastguard Worker STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */ 1488*6236dae4SAndroid Build Coastguard Worker STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */ 1489*6236dae4SAndroid Build Coastguard Worker STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ASCII hex */ 1490*6236dae4SAndroid Build Coastguard Worker STRING_SSH_HOST_PUBLIC_KEY_SHA256, /* sha256 of host public key in base64 */ 1491*6236dae4SAndroid Build Coastguard Worker STRING_SSH_KNOWNHOSTS, /* filename of knownhosts file */ 1492*6236dae4SAndroid Build Coastguard Worker #endif 1493*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP 1494*6236dae4SAndroid Build Coastguard Worker STRING_MAIL_FROM, 1495*6236dae4SAndroid Build Coastguard Worker STRING_MAIL_AUTH, 1496*6236dae4SAndroid Build Coastguard Worker #endif 1497*6236dae4SAndroid Build Coastguard Worker #ifdef USE_TLS_SRP 1498*6236dae4SAndroid Build Coastguard Worker STRING_TLSAUTH_USERNAME, /* TLS auth <username> */ 1499*6236dae4SAndroid Build Coastguard Worker STRING_TLSAUTH_PASSWORD, /* TLS auth <password> */ 1500*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1501*6236dae4SAndroid Build Coastguard Worker STRING_TLSAUTH_USERNAME_PROXY, /* TLS auth <username> */ 1502*6236dae4SAndroid Build Coastguard Worker STRING_TLSAUTH_PASSWORD_PROXY, /* TLS auth <password> */ 1503*6236dae4SAndroid Build Coastguard Worker #endif 1504*6236dae4SAndroid Build Coastguard Worker #endif 1505*6236dae4SAndroid Build Coastguard Worker STRING_BEARER, /* <bearer>, if used */ 1506*6236dae4SAndroid Build Coastguard Worker #ifdef USE_UNIX_SOCKETS 1507*6236dae4SAndroid Build Coastguard Worker STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */ 1508*6236dae4SAndroid Build Coastguard Worker #endif 1509*6236dae4SAndroid Build Coastguard Worker STRING_TARGET, /* CURLOPT_REQUEST_TARGET */ 1510*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DOH 1511*6236dae4SAndroid Build Coastguard Worker STRING_DOH, /* CURLOPT_DOH_URL */ 1512*6236dae4SAndroid Build Coastguard Worker #endif 1513*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_ALTSVC 1514*6236dae4SAndroid Build Coastguard Worker STRING_ALTSVC, /* CURLOPT_ALTSVC */ 1515*6236dae4SAndroid Build Coastguard Worker #endif 1516*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HSTS 1517*6236dae4SAndroid Build Coastguard Worker STRING_HSTS, /* CURLOPT_HSTS */ 1518*6236dae4SAndroid Build Coastguard Worker #endif 1519*6236dae4SAndroid Build Coastguard Worker STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */ 1520*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ARES 1521*6236dae4SAndroid Build Coastguard Worker STRING_DNS_SERVERS, 1522*6236dae4SAndroid Build Coastguard Worker STRING_DNS_INTERFACE, 1523*6236dae4SAndroid Build Coastguard Worker STRING_DNS_LOCAL_IP4, 1524*6236dae4SAndroid Build Coastguard Worker STRING_DNS_LOCAL_IP6, 1525*6236dae4SAndroid Build Coastguard Worker #endif 1526*6236dae4SAndroid Build Coastguard Worker STRING_SSL_EC_CURVES, 1527*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_AWS 1528*6236dae4SAndroid Build Coastguard Worker STRING_AWS_SIGV4, /* Parameters for V4 signature */ 1529*6236dae4SAndroid Build Coastguard Worker #endif 1530*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1531*6236dae4SAndroid Build Coastguard Worker STRING_HAPROXY_CLIENT_IP, /* CURLOPT_HAPROXY_CLIENT_IP */ 1532*6236dae4SAndroid Build Coastguard Worker #endif 1533*6236dae4SAndroid Build Coastguard Worker STRING_ECH_CONFIG, /* CURLOPT_ECH_CONFIG */ 1534*6236dae4SAndroid Build Coastguard Worker STRING_ECH_PUBLIC, /* CURLOPT_ECH_PUBLIC */ 1535*6236dae4SAndroid Build Coastguard Worker 1536*6236dae4SAndroid Build Coastguard Worker /* -- end of null-terminated strings -- */ 1537*6236dae4SAndroid Build Coastguard Worker 1538*6236dae4SAndroid Build Coastguard Worker STRING_LASTZEROTERMINATED, 1539*6236dae4SAndroid Build Coastguard Worker 1540*6236dae4SAndroid Build Coastguard Worker /* -- below this are pointers to binary data that cannot be strdup'ed. --- */ 1541*6236dae4SAndroid Build Coastguard Worker 1542*6236dae4SAndroid Build Coastguard Worker STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */ 1543*6236dae4SAndroid Build Coastguard Worker 1544*6236dae4SAndroid Build Coastguard Worker STRING_LAST /* not used, just an end-of-list marker */ 1545*6236dae4SAndroid Build Coastguard Worker }; 1546*6236dae4SAndroid Build Coastguard Worker 1547*6236dae4SAndroid Build Coastguard Worker enum dupblob { 1548*6236dae4SAndroid Build Coastguard Worker BLOB_CERT, 1549*6236dae4SAndroid Build Coastguard Worker BLOB_KEY, 1550*6236dae4SAndroid Build Coastguard Worker BLOB_SSL_ISSUERCERT, 1551*6236dae4SAndroid Build Coastguard Worker BLOB_CAINFO, 1552*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1553*6236dae4SAndroid Build Coastguard Worker BLOB_CERT_PROXY, 1554*6236dae4SAndroid Build Coastguard Worker BLOB_KEY_PROXY, 1555*6236dae4SAndroid Build Coastguard Worker BLOB_SSL_ISSUERCERT_PROXY, 1556*6236dae4SAndroid Build Coastguard Worker BLOB_CAINFO_PROXY, 1557*6236dae4SAndroid Build Coastguard Worker #endif 1558*6236dae4SAndroid Build Coastguard Worker BLOB_LAST 1559*6236dae4SAndroid Build Coastguard Worker }; 1560*6236dae4SAndroid Build Coastguard Worker 1561*6236dae4SAndroid Build Coastguard Worker /* callback that gets called when this easy handle is completed within a multi 1562*6236dae4SAndroid Build Coastguard Worker handle. Only used for internally created transfers, like for example 1563*6236dae4SAndroid Build Coastguard Worker DoH. */ 1564*6236dae4SAndroid Build Coastguard Worker typedef int (*multidone_func)(struct Curl_easy *easy, CURLcode result); 1565*6236dae4SAndroid Build Coastguard Worker 1566*6236dae4SAndroid Build Coastguard Worker struct UserDefined { 1567*6236dae4SAndroid Build Coastguard Worker FILE *err; /* the stderr user data goes here */ 1568*6236dae4SAndroid Build Coastguard Worker void *debugdata; /* the data that will be passed to fdebug */ 1569*6236dae4SAndroid Build Coastguard Worker char *errorbuffer; /* (Static) store failure messages in here */ 1570*6236dae4SAndroid Build Coastguard Worker void *out; /* CURLOPT_WRITEDATA */ 1571*6236dae4SAndroid Build Coastguard Worker void *in_set; /* CURLOPT_READDATA */ 1572*6236dae4SAndroid Build Coastguard Worker void *writeheader; /* write the header to this if non-NULL */ 1573*6236dae4SAndroid Build Coastguard Worker unsigned short use_port; /* which port to use (when not using default) */ 1574*6236dae4SAndroid Build Coastguard Worker unsigned long httpauth; /* kind of HTTP authentication to use (bitmask) */ 1575*6236dae4SAndroid Build Coastguard Worker unsigned long proxyauth; /* kind of proxy authentication to use (bitmask) */ 1576*6236dae4SAndroid Build Coastguard Worker long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1 1577*6236dae4SAndroid Build Coastguard Worker for infinity */ 1578*6236dae4SAndroid Build Coastguard Worker 1579*6236dae4SAndroid Build Coastguard Worker void *postfields; /* if POST, set the fields' values here */ 1580*6236dae4SAndroid Build Coastguard Worker curl_seek_callback seek_func; /* function that seeks the input */ 1581*6236dae4SAndroid Build Coastguard Worker curl_off_t postfieldsize; /* if POST, this might have a size to use instead 1582*6236dae4SAndroid Build Coastguard Worker of strlen(), and then the data *may* be binary 1583*6236dae4SAndroid Build Coastguard Worker (contain zero bytes) */ 1584*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_BINDLOCAL 1585*6236dae4SAndroid Build Coastguard Worker unsigned short localport; /* local port number to bind to */ 1586*6236dae4SAndroid Build Coastguard Worker unsigned short localportrange; /* number of additional port numbers to test 1587*6236dae4SAndroid Build Coastguard Worker in case the 'localport' one cannot be 1588*6236dae4SAndroid Build Coastguard Worker bind()ed */ 1589*6236dae4SAndroid Build Coastguard Worker #endif 1590*6236dae4SAndroid Build Coastguard Worker curl_write_callback fwrite_func; /* function that stores the output */ 1591*6236dae4SAndroid Build Coastguard Worker curl_write_callback fwrite_header; /* function that stores headers */ 1592*6236dae4SAndroid Build Coastguard Worker curl_write_callback fwrite_rtp; /* function that stores interleaved RTP */ 1593*6236dae4SAndroid Build Coastguard Worker curl_read_callback fread_func_set; /* function that reads the input */ 1594*6236dae4SAndroid Build Coastguard Worker curl_progress_callback fprogress; /* OLD and deprecated progress callback */ 1595*6236dae4SAndroid Build Coastguard Worker curl_xferinfo_callback fxferinfo; /* progress callback */ 1596*6236dae4SAndroid Build Coastguard Worker curl_debug_callback fdebug; /* function that write informational data */ 1597*6236dae4SAndroid Build Coastguard Worker curl_ioctl_callback ioctl_func; /* function for I/O control */ 1598*6236dae4SAndroid Build Coastguard Worker curl_sockopt_callback fsockopt; /* function for setting socket options */ 1599*6236dae4SAndroid Build Coastguard Worker void *sockopt_client; /* pointer to pass to the socket options callback */ 1600*6236dae4SAndroid Build Coastguard Worker curl_opensocket_callback fopensocket; /* function for checking/translating 1601*6236dae4SAndroid Build Coastguard Worker the address and opening the 1602*6236dae4SAndroid Build Coastguard Worker socket */ 1603*6236dae4SAndroid Build Coastguard Worker void *opensocket_client; 1604*6236dae4SAndroid Build Coastguard Worker curl_closesocket_callback fclosesocket; /* function for closing the 1605*6236dae4SAndroid Build Coastguard Worker socket */ 1606*6236dae4SAndroid Build Coastguard Worker void *closesocket_client; 1607*6236dae4SAndroid Build Coastguard Worker curl_prereq_callback fprereq; /* pre-initial request callback */ 1608*6236dae4SAndroid Build Coastguard Worker void *prereq_userp; /* pre-initial request user data */ 1609*6236dae4SAndroid Build Coastguard Worker 1610*6236dae4SAndroid Build Coastguard Worker void *seek_client; /* pointer to pass to the seek callback */ 1611*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HSTS 1612*6236dae4SAndroid Build Coastguard Worker curl_hstsread_callback hsts_read; 1613*6236dae4SAndroid Build Coastguard Worker void *hsts_read_userp; 1614*6236dae4SAndroid Build Coastguard Worker curl_hstswrite_callback hsts_write; 1615*6236dae4SAndroid Build Coastguard Worker void *hsts_write_userp; 1616*6236dae4SAndroid Build Coastguard Worker #endif 1617*6236dae4SAndroid Build Coastguard Worker void *progress_client; /* pointer to pass to the progress callback */ 1618*6236dae4SAndroid Build Coastguard Worker void *ioctl_client; /* pointer to pass to the ioctl callback */ 1619*6236dae4SAndroid Build Coastguard Worker unsigned int timeout; /* ms, 0 means no timeout */ 1620*6236dae4SAndroid Build Coastguard Worker unsigned int connecttimeout; /* ms, 0 means default timeout */ 1621*6236dae4SAndroid Build Coastguard Worker unsigned int happy_eyeballs_timeout; /* ms, 0 is a valid value */ 1622*6236dae4SAndroid Build Coastguard Worker unsigned int server_response_timeout; /* ms, 0 means no timeout */ 1623*6236dae4SAndroid Build Coastguard Worker unsigned int shutdowntimeout; /* ms, 0 means default timeout */ 1624*6236dae4SAndroid Build Coastguard Worker long maxage_conn; /* in seconds, max idle time to allow a connection that 1625*6236dae4SAndroid Build Coastguard Worker is to be reused */ 1626*6236dae4SAndroid Build Coastguard Worker long maxlifetime_conn; /* in seconds, max time since creation to allow a 1627*6236dae4SAndroid Build Coastguard Worker connection that is to be reused */ 1628*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TFTP 1629*6236dae4SAndroid Build Coastguard Worker long tftp_blksize; /* in bytes, 0 means use default */ 1630*6236dae4SAndroid Build Coastguard Worker #endif 1631*6236dae4SAndroid Build Coastguard Worker curl_off_t filesize; /* size of file to upload, -1 means unknown */ 1632*6236dae4SAndroid Build Coastguard Worker long low_speed_limit; /* bytes/second */ 1633*6236dae4SAndroid Build Coastguard Worker long low_speed_time; /* number of seconds */ 1634*6236dae4SAndroid Build Coastguard Worker curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */ 1635*6236dae4SAndroid Build Coastguard Worker curl_off_t max_recv_speed; /* high speed limit in bytes/second for 1636*6236dae4SAndroid Build Coastguard Worker download */ 1637*6236dae4SAndroid Build Coastguard Worker curl_off_t set_resume_from; /* continue [ftp] transfer from here */ 1638*6236dae4SAndroid Build Coastguard Worker struct curl_slist *headers; /* linked list of extra headers */ 1639*6236dae4SAndroid Build Coastguard Worker struct curl_httppost *httppost; /* linked list of old POST data */ 1640*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_MIME) || !defined(CURL_DISABLE_FORM_API) 1641*6236dae4SAndroid Build Coastguard Worker curl_mimepart mimepost; /* MIME/POST data. */ 1642*6236dae4SAndroid Build Coastguard Worker #endif 1643*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TELNET 1644*6236dae4SAndroid Build Coastguard Worker struct curl_slist *telnet_options; /* linked list of telnet options */ 1645*6236dae4SAndroid Build Coastguard Worker #endif 1646*6236dae4SAndroid Build Coastguard Worker struct curl_slist *resolve; /* list of names to add/remove from 1647*6236dae4SAndroid Build Coastguard Worker DNS cache */ 1648*6236dae4SAndroid Build Coastguard Worker struct curl_slist *connect_to; /* list of host:port mappings to override 1649*6236dae4SAndroid Build Coastguard Worker the hostname and port to connect to */ 1650*6236dae4SAndroid Build Coastguard Worker time_t timevalue; /* what time to compare with */ 1651*6236dae4SAndroid Build Coastguard Worker unsigned char timecondition; /* kind of time comparison: curl_TimeCond */ 1652*6236dae4SAndroid Build Coastguard Worker unsigned char method; /* what kind of HTTP request: Curl_HttpReq */ 1653*6236dae4SAndroid Build Coastguard Worker unsigned char httpwant; /* when non-zero, a specific HTTP version requested 1654*6236dae4SAndroid Build Coastguard Worker to be used in the library's request(s) */ 1655*6236dae4SAndroid Build Coastguard Worker struct ssl_config_data ssl; /* user defined SSL stuff */ 1656*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1657*6236dae4SAndroid Build Coastguard Worker struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */ 1658*6236dae4SAndroid Build Coastguard Worker struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */ 1659*6236dae4SAndroid Build Coastguard Worker unsigned short proxyport; /* If non-zero, use this port number by 1660*6236dae4SAndroid Build Coastguard Worker default. If the proxy string features a 1661*6236dae4SAndroid Build Coastguard Worker ":[port]" that one will override this. */ 1662*6236dae4SAndroid Build Coastguard Worker unsigned char proxytype; /* what kind of proxy: curl_proxytype */ 1663*6236dae4SAndroid Build Coastguard Worker unsigned char socks5auth;/* kind of SOCKS5 authentication to use (bitmask) */ 1664*6236dae4SAndroid Build Coastguard Worker #endif 1665*6236dae4SAndroid Build Coastguard Worker struct ssl_general_config general_ssl; /* general user defined SSL stuff */ 1666*6236dae4SAndroid Build Coastguard Worker int dns_cache_timeout; /* DNS cache timeout (seconds) */ 1667*6236dae4SAndroid Build Coastguard Worker unsigned int buffer_size; /* size of receive buffer to use */ 1668*6236dae4SAndroid Build Coastguard Worker unsigned int upload_buffer_size; /* size of upload buffer to use, 1669*6236dae4SAndroid Build Coastguard Worker keep it >= CURL_MAX_WRITE_SIZE */ 1670*6236dae4SAndroid Build Coastguard Worker void *private_data; /* application-private data */ 1671*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP 1672*6236dae4SAndroid Build Coastguard Worker struct curl_slist *http200aliases; /* linked list of aliases for http200 */ 1673*6236dae4SAndroid Build Coastguard Worker #endif 1674*6236dae4SAndroid Build Coastguard Worker unsigned char ipver; /* the CURL_IPRESOLVE_* defines in the public header 1675*6236dae4SAndroid Build Coastguard Worker file 0 - whatever, 1 - v2, 2 - v6 */ 1676*6236dae4SAndroid Build Coastguard Worker curl_off_t max_filesize; /* Maximum file size to download */ 1677*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 1678*6236dae4SAndroid Build Coastguard Worker unsigned char ftp_filemethod; /* how to get to a file: curl_ftpfile */ 1679*6236dae4SAndroid Build Coastguard Worker unsigned char ftpsslauth; /* what AUTH XXX to try: curl_ftpauth */ 1680*6236dae4SAndroid Build Coastguard Worker unsigned char ftp_ccc; /* FTP CCC options: curl_ftpccc */ 1681*6236dae4SAndroid Build Coastguard Worker unsigned int accepttimeout; /* in milliseconds, 0 means no timeout */ 1682*6236dae4SAndroid Build Coastguard Worker #endif 1683*6236dae4SAndroid Build Coastguard Worker #if !defined(CURL_DISABLE_FTP) || defined(USE_SSH) 1684*6236dae4SAndroid Build Coastguard Worker struct curl_slist *quote; /* after connection is established */ 1685*6236dae4SAndroid Build Coastguard Worker struct curl_slist *postquote; /* after the transfer */ 1686*6236dae4SAndroid Build Coastguard Worker struct curl_slist *prequote; /* before the transfer, after type */ 1687*6236dae4SAndroid Build Coastguard Worker /* Despite the name, ftp_create_missing_dirs is for FTP(S) and SFTP 1688*6236dae4SAndroid Build Coastguard Worker 1 - create directories that do not exist 1689*6236dae4SAndroid Build Coastguard Worker 2 - the same but also allow MKD to fail once 1690*6236dae4SAndroid Build Coastguard Worker */ 1691*6236dae4SAndroid Build Coastguard Worker unsigned char ftp_create_missing_dirs; 1692*6236dae4SAndroid Build Coastguard Worker #endif 1693*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBSSH2 1694*6236dae4SAndroid Build Coastguard Worker curl_sshhostkeycallback ssh_hostkeyfunc; /* hostkey check callback */ 1695*6236dae4SAndroid Build Coastguard Worker void *ssh_hostkeyfunc_userp; /* custom pointer to callback */ 1696*6236dae4SAndroid Build Coastguard Worker #endif 1697*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH 1698*6236dae4SAndroid Build Coastguard Worker curl_sshkeycallback ssh_keyfunc; /* key matching callback */ 1699*6236dae4SAndroid Build Coastguard Worker void *ssh_keyfunc_userp; /* custom pointer to callback */ 1700*6236dae4SAndroid Build Coastguard Worker int ssh_auth_types; /* allowed SSH auth types */ 1701*6236dae4SAndroid Build Coastguard Worker unsigned int new_directory_perms; /* when creating remote dirs */ 1702*6236dae4SAndroid Build Coastguard Worker #endif 1703*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_NETRC 1704*6236dae4SAndroid Build Coastguard Worker unsigned char use_netrc; /* enum CURL_NETRC_OPTION values */ 1705*6236dae4SAndroid Build Coastguard Worker #endif 1706*6236dae4SAndroid Build Coastguard Worker unsigned int new_file_perms; /* when creating remote files */ 1707*6236dae4SAndroid Build Coastguard Worker char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */ 1708*6236dae4SAndroid Build Coastguard Worker struct curl_blob *blobs[BLOB_LAST]; 1709*6236dae4SAndroid Build Coastguard Worker #ifdef USE_IPV6 1710*6236dae4SAndroid Build Coastguard Worker unsigned int scope_id; /* Scope id for IPv6 */ 1711*6236dae4SAndroid Build Coastguard Worker #endif 1712*6236dae4SAndroid Build Coastguard Worker curl_prot_t allowed_protocols; 1713*6236dae4SAndroid Build Coastguard Worker curl_prot_t redir_protocols; 1714*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_RTSP 1715*6236dae4SAndroid Build Coastguard Worker void *rtp_out; /* write RTP to this if non-NULL */ 1716*6236dae4SAndroid Build Coastguard Worker /* Common RTSP header options */ 1717*6236dae4SAndroid Build Coastguard Worker Curl_RtspReq rtspreq; /* RTSP request type */ 1718*6236dae4SAndroid Build Coastguard Worker #endif 1719*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 1720*6236dae4SAndroid Build Coastguard Worker curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer 1721*6236dae4SAndroid Build Coastguard Worker starts */ 1722*6236dae4SAndroid Build Coastguard Worker curl_chunk_end_callback chunk_end; /* called after part transferring 1723*6236dae4SAndroid Build Coastguard Worker stopped */ 1724*6236dae4SAndroid Build Coastguard Worker curl_fnmatch_callback fnmatch; /* callback to decide which file corresponds 1725*6236dae4SAndroid Build Coastguard Worker to pattern (e.g. if WILDCARDMATCH is on) */ 1726*6236dae4SAndroid Build Coastguard Worker void *fnmatch_data; 1727*6236dae4SAndroid Build Coastguard Worker void *wildcardptr; 1728*6236dae4SAndroid Build Coastguard Worker #endif 1729*6236dae4SAndroid Build Coastguard Worker /* GSS-API credential delegation, see the documentation of 1730*6236dae4SAndroid Build Coastguard Worker CURLOPT_GSSAPI_DELEGATION */ 1731*6236dae4SAndroid Build Coastguard Worker unsigned char gssapi_delegation; 1732*6236dae4SAndroid Build Coastguard Worker 1733*6236dae4SAndroid Build Coastguard Worker int tcp_keepidle; /* seconds in idle before sending keepalive probe */ 1734*6236dae4SAndroid Build Coastguard Worker int tcp_keepintvl; /* seconds between TCP keepalive probes */ 1735*6236dae4SAndroid Build Coastguard Worker int tcp_keepcnt; /* maximum number of keepalive probes */ 1736*6236dae4SAndroid Build Coastguard Worker 1737*6236dae4SAndroid Build Coastguard Worker long expect_100_timeout; /* in milliseconds */ 1738*6236dae4SAndroid Build Coastguard Worker #if defined(USE_HTTP2) || defined(USE_HTTP3) 1739*6236dae4SAndroid Build Coastguard Worker struct Curl_data_priority priority; 1740*6236dae4SAndroid Build Coastguard Worker #endif 1741*6236dae4SAndroid Build Coastguard Worker curl_resolver_start_callback resolver_start; /* optional callback called 1742*6236dae4SAndroid Build Coastguard Worker before resolver start */ 1743*6236dae4SAndroid Build Coastguard Worker void *resolver_start_client; /* pointer to pass to resolver start callback */ 1744*6236dae4SAndroid Build Coastguard Worker long upkeep_interval_ms; /* Time between calls for connection upkeep. */ 1745*6236dae4SAndroid Build Coastguard Worker multidone_func fmultidone; 1746*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DOH 1747*6236dae4SAndroid Build Coastguard Worker curl_off_t dohfor_mid; /* this is a DoH request for that transfer */ 1748*6236dae4SAndroid Build Coastguard Worker #endif 1749*6236dae4SAndroid Build Coastguard Worker CURLU *uh; /* URL handle for the current parsed URL */ 1750*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HTTP 1751*6236dae4SAndroid Build Coastguard Worker void *trailer_data; /* pointer to pass to trailer data callback */ 1752*6236dae4SAndroid Build Coastguard Worker curl_trailer_callback trailer_callback; /* trailing data callback */ 1753*6236dae4SAndroid Build Coastguard Worker #endif 1754*6236dae4SAndroid Build Coastguard Worker char keep_post; /* keep POSTs as POSTs after a 30x request; each 1755*6236dae4SAndroid Build Coastguard Worker bit represents a request, from 301 to 303 */ 1756*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_SMTP 1757*6236dae4SAndroid Build Coastguard Worker struct curl_slist *mail_rcpt; /* linked list of mail recipients */ 1758*6236dae4SAndroid Build Coastguard Worker BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some 1759*6236dae4SAndroid Build Coastguard Worker recipients */ 1760*6236dae4SAndroid Build Coastguard Worker #endif 1761*6236dae4SAndroid Build Coastguard Worker unsigned int maxconnects; /* Max idle connections in the connection cache */ 1762*6236dae4SAndroid Build Coastguard Worker unsigned char use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or 1763*6236dae4SAndroid Build Coastguard Worker IMAP or POP3 or others! (type: curl_usessl)*/ 1764*6236dae4SAndroid Build Coastguard Worker unsigned char connect_only; /* make connection/request, then let 1765*6236dae4SAndroid Build Coastguard Worker application use the socket */ 1766*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_MIME 1767*6236dae4SAndroid Build Coastguard Worker BIT(mime_formescape); 1768*6236dae4SAndroid Build Coastguard Worker #endif 1769*6236dae4SAndroid Build Coastguard Worker BIT(is_fread_set); /* has read callback been set to non-NULL? */ 1770*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_TFTP 1771*6236dae4SAndroid Build Coastguard Worker BIT(tftp_no_options); /* do not send TFTP options requests */ 1772*6236dae4SAndroid Build Coastguard Worker #endif 1773*6236dae4SAndroid Build Coastguard Worker BIT(sep_headers); /* handle host and proxy headers separately */ 1774*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1775*6236dae4SAndroid Build Coastguard Worker BIT(cookiesession); /* new cookie session? */ 1776*6236dae4SAndroid Build Coastguard Worker #endif 1777*6236dae4SAndroid Build Coastguard Worker BIT(crlf); /* convert crlf on ftp upload(?) */ 1778*6236dae4SAndroid Build Coastguard Worker #ifdef USE_SSH 1779*6236dae4SAndroid Build Coastguard Worker BIT(ssh_compression); /* enable SSH compression */ 1780*6236dae4SAndroid Build Coastguard Worker #endif 1781*6236dae4SAndroid Build Coastguard Worker 1782*6236dae4SAndroid Build Coastguard Worker /* Here follows boolean settings that define how to behave during 1783*6236dae4SAndroid Build Coastguard Worker this session. They are STATIC, set by libcurl users or at least initially 1784*6236dae4SAndroid Build Coastguard Worker and they do not change during operations. */ 1785*6236dae4SAndroid Build Coastguard Worker BIT(quick_exit); /* set 1L when it is okay to leak things (like 1786*6236dae4SAndroid Build Coastguard Worker threads), as we are about to exit() anyway and 1787*6236dae4SAndroid Build Coastguard Worker do not want lengthy cleanups to delay termination, 1788*6236dae4SAndroid Build Coastguard Worker e.g. after a DNS timeout */ 1789*6236dae4SAndroid Build Coastguard Worker BIT(get_filetime); /* get the time and get of the remote file */ 1790*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1791*6236dae4SAndroid Build Coastguard Worker BIT(tunnel_thru_httpproxy); /* use CONNECT through an HTTP proxy */ 1792*6236dae4SAndroid Build Coastguard Worker #endif 1793*6236dae4SAndroid Build Coastguard Worker BIT(prefer_ascii); /* ASCII rather than binary */ 1794*6236dae4SAndroid Build Coastguard Worker BIT(remote_append); /* append, not overwrite, on upload */ 1795*6236dae4SAndroid Build Coastguard Worker #ifdef CURL_LIST_ONLY_PROTOCOL 1796*6236dae4SAndroid Build Coastguard Worker BIT(list_only); /* list directory */ 1797*6236dae4SAndroid Build Coastguard Worker #endif 1798*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 1799*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_port); /* use the FTP PORT command */ 1800*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_epsv); /* if EPSV is to be attempted or not */ 1801*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_eprt); /* if EPRT is to be attempted or not */ 1802*6236dae4SAndroid Build Coastguard Worker BIT(ftp_use_pret); /* if PRET is to be used before PASV or not */ 1803*6236dae4SAndroid Build Coastguard Worker BIT(ftp_skip_ip); /* skip the IP address the FTP server passes on to 1804*6236dae4SAndroid Build Coastguard Worker us */ 1805*6236dae4SAndroid Build Coastguard Worker BIT(wildcard_enabled); /* enable wildcard matching */ 1806*6236dae4SAndroid Build Coastguard Worker #endif 1807*6236dae4SAndroid Build Coastguard Worker BIT(hide_progress); /* do not use the progress meter */ 1808*6236dae4SAndroid Build Coastguard Worker BIT(http_fail_on_error); /* fail on HTTP error codes >= 400 */ 1809*6236dae4SAndroid Build Coastguard Worker BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */ 1810*6236dae4SAndroid Build Coastguard Worker BIT(http_follow_location); /* follow HTTP redirects */ 1811*6236dae4SAndroid Build Coastguard Worker BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */ 1812*6236dae4SAndroid Build Coastguard Worker BIT(allow_auth_to_other_hosts); 1813*6236dae4SAndroid Build Coastguard Worker BIT(include_header); /* include received protocol headers in data output */ 1814*6236dae4SAndroid Build Coastguard Worker BIT(http_set_referer); /* is a custom referer used */ 1815*6236dae4SAndroid Build Coastguard Worker BIT(http_auto_referer); /* set "correct" referer when following 1816*6236dae4SAndroid Build Coastguard Worker location: */ 1817*6236dae4SAndroid Build Coastguard Worker BIT(opt_no_body); /* as set with CURLOPT_NOBODY */ 1818*6236dae4SAndroid Build Coastguard Worker BIT(verbose); /* output verbosity */ 1819*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_GSSAPI) 1820*6236dae4SAndroid Build Coastguard Worker BIT(krb); /* Kerberos connection requested */ 1821*6236dae4SAndroid Build Coastguard Worker #endif 1822*6236dae4SAndroid Build Coastguard Worker BIT(reuse_forbid); /* forbidden to be reused, close after use */ 1823*6236dae4SAndroid Build Coastguard Worker BIT(reuse_fresh); /* do not reuse an existing connection */ 1824*6236dae4SAndroid Build Coastguard Worker BIT(no_signal); /* do not use any signal/alarm handler */ 1825*6236dae4SAndroid Build Coastguard Worker BIT(tcp_nodelay); /* whether to enable TCP_NODELAY or not */ 1826*6236dae4SAndroid Build Coastguard Worker BIT(ignorecl); /* ignore content length */ 1827*6236dae4SAndroid Build Coastguard Worker BIT(http_te_skip); /* pass the raw body data to the user, even when 1828*6236dae4SAndroid Build Coastguard Worker transfer-encoded (chunked, compressed) */ 1829*6236dae4SAndroid Build Coastguard Worker BIT(http_ce_skip); /* pass the raw body data to the user, even when 1830*6236dae4SAndroid Build Coastguard Worker content-encoded (chunked, compressed) */ 1831*6236dae4SAndroid Build Coastguard Worker BIT(proxy_transfer_mode); /* set transfer mode (;type=<a|i>) when doing 1832*6236dae4SAndroid Build Coastguard Worker FTP via an HTTP proxy */ 1833*6236dae4SAndroid Build Coastguard Worker #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI) 1834*6236dae4SAndroid Build Coastguard Worker BIT(socks5_gssapi_nec); /* Flag to support NEC SOCKS5 server */ 1835*6236dae4SAndroid Build Coastguard Worker #endif 1836*6236dae4SAndroid Build Coastguard Worker BIT(sasl_ir); /* Enable/disable SASL initial response */ 1837*6236dae4SAndroid Build Coastguard Worker BIT(tcp_keepalive); /* use TCP keepalives */ 1838*6236dae4SAndroid Build Coastguard Worker BIT(tcp_fastopen); /* use TCP Fast Open */ 1839*6236dae4SAndroid Build Coastguard Worker BIT(ssl_enable_alpn);/* TLS ALPN extension? */ 1840*6236dae4SAndroid Build Coastguard Worker BIT(path_as_is); /* allow dotdots? */ 1841*6236dae4SAndroid Build Coastguard Worker BIT(pipewait); /* wait for multiplex status before starting a new 1842*6236dae4SAndroid Build Coastguard Worker connection */ 1843*6236dae4SAndroid Build Coastguard Worker BIT(suppress_connect_headers); /* suppress proxy CONNECT response headers 1844*6236dae4SAndroid Build Coastguard Worker from user callbacks */ 1845*6236dae4SAndroid Build Coastguard Worker BIT(dns_shuffle_addresses); /* whether to shuffle addresses before use */ 1846*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_PROXY 1847*6236dae4SAndroid Build Coastguard Worker BIT(haproxyprotocol); /* whether to send HAProxy PROXY protocol v1 1848*6236dae4SAndroid Build Coastguard Worker header */ 1849*6236dae4SAndroid Build Coastguard Worker #endif 1850*6236dae4SAndroid Build Coastguard Worker #ifdef USE_UNIX_SOCKETS 1851*6236dae4SAndroid Build Coastguard Worker BIT(abstract_unix_socket); 1852*6236dae4SAndroid Build Coastguard Worker #endif 1853*6236dae4SAndroid Build Coastguard Worker BIT(disallow_username_in_url); /* disallow username in URL */ 1854*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_DOH 1855*6236dae4SAndroid Build Coastguard Worker BIT(doh); /* DNS-over-HTTPS enabled */ 1856*6236dae4SAndroid Build Coastguard Worker BIT(doh_verifypeer); /* DoH certificate peer verification */ 1857*6236dae4SAndroid Build Coastguard Worker BIT(doh_verifyhost); /* DoH certificate hostname verification */ 1858*6236dae4SAndroid Build Coastguard Worker BIT(doh_verifystatus); /* DoH certificate status verification */ 1859*6236dae4SAndroid Build Coastguard Worker #endif 1860*6236dae4SAndroid Build Coastguard Worker BIT(http09_allowed); /* allow HTTP/0.9 responses */ 1861*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_WEBSOCKETS 1862*6236dae4SAndroid Build Coastguard Worker BIT(ws_raw_mode); 1863*6236dae4SAndroid Build Coastguard Worker #endif 1864*6236dae4SAndroid Build Coastguard Worker #ifdef USE_ECH 1865*6236dae4SAndroid Build Coastguard Worker int tls_ech; /* TLS ECH configuration */ 1866*6236dae4SAndroid Build Coastguard Worker #endif 1867*6236dae4SAndroid Build Coastguard Worker }; 1868*6236dae4SAndroid Build Coastguard Worker 1869*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_MIME 1870*6236dae4SAndroid Build Coastguard Worker #define IS_MIME_POST(a) ((a)->set.mimepost.kind != MIMEKIND_NONE) 1871*6236dae4SAndroid Build Coastguard Worker #else 1872*6236dae4SAndroid Build Coastguard Worker #define IS_MIME_POST(a) FALSE 1873*6236dae4SAndroid Build Coastguard Worker #endif 1874*6236dae4SAndroid Build Coastguard Worker 1875*6236dae4SAndroid Build Coastguard Worker struct Names { 1876*6236dae4SAndroid Build Coastguard Worker struct Curl_hash *hostcache; 1877*6236dae4SAndroid Build Coastguard Worker enum { 1878*6236dae4SAndroid Build Coastguard Worker HCACHE_NONE, /* not pointing to anything */ 1879*6236dae4SAndroid Build Coastguard Worker HCACHE_MULTI, /* points to a shared one in the multi handle */ 1880*6236dae4SAndroid Build Coastguard Worker HCACHE_SHARED /* points to a shared one in a shared object */ 1881*6236dae4SAndroid Build Coastguard Worker } hostcachetype; 1882*6236dae4SAndroid Build Coastguard Worker }; 1883*6236dae4SAndroid Build Coastguard Worker 1884*6236dae4SAndroid Build Coastguard Worker /* 1885*6236dae4SAndroid Build Coastguard Worker * The 'connectdata' struct MUST have all the connection oriented stuff as we 1886*6236dae4SAndroid Build Coastguard Worker * may have several simultaneous connections and connection structs in memory. 1887*6236dae4SAndroid Build Coastguard Worker * 1888*6236dae4SAndroid Build Coastguard Worker * The 'struct UserDefined' must only contain data that is set once to go for 1889*6236dae4SAndroid Build Coastguard Worker * many (perhaps) independent connections. Values that are generated or 1890*6236dae4SAndroid Build Coastguard Worker * calculated internally for the "session handle" must be defined within the 1891*6236dae4SAndroid Build Coastguard Worker * 'struct UrlState' instead. 1892*6236dae4SAndroid Build Coastguard Worker */ 1893*6236dae4SAndroid Build Coastguard Worker 1894*6236dae4SAndroid Build Coastguard Worker struct Curl_easy { 1895*6236dae4SAndroid Build Coastguard Worker /* First a simple identifier to easier detect if a user mix up this easy 1896*6236dae4SAndroid Build Coastguard Worker handle with a multi handle. Set this to CURLEASY_MAGIC_NUMBER */ 1897*6236dae4SAndroid Build Coastguard Worker unsigned int magic; 1898*6236dae4SAndroid Build Coastguard Worker /* once an easy handle is tied to a connection pool a non-negative number to 1899*6236dae4SAndroid Build Coastguard Worker distinguish this transfer from other using the same pool. For easier 1900*6236dae4SAndroid Build Coastguard Worker tracking in log output. This may wrap around after LONG_MAX to 0 again, 1901*6236dae4SAndroid Build Coastguard Worker so it has no uniqueness guarantee for large processings. Note: it has no 1902*6236dae4SAndroid Build Coastguard Worker uniqueness either IFF more than one connection pool is used by the 1903*6236dae4SAndroid Build Coastguard Worker libcurl application. */ 1904*6236dae4SAndroid Build Coastguard Worker curl_off_t id; 1905*6236dae4SAndroid Build Coastguard Worker /* once an easy handle is added to a multi, either explicitly by the 1906*6236dae4SAndroid Build Coastguard Worker * libcurl application or implicitly during `curl_easy_perform()`, 1907*6236dae4SAndroid Build Coastguard Worker * a unique identifier inside this one multi instance. */ 1908*6236dae4SAndroid Build Coastguard Worker curl_off_t mid; 1909*6236dae4SAndroid Build Coastguard Worker 1910*6236dae4SAndroid Build Coastguard Worker struct connectdata *conn; 1911*6236dae4SAndroid Build Coastguard Worker struct Curl_llist_node multi_queue; /* for multihandle list management */ 1912*6236dae4SAndroid Build Coastguard Worker struct Curl_llist_node conn_queue; /* list per connectdata */ 1913*6236dae4SAndroid Build Coastguard Worker 1914*6236dae4SAndroid Build Coastguard Worker CURLMstate mstate; /* the handle's state */ 1915*6236dae4SAndroid Build Coastguard Worker CURLcode result; /* previous result */ 1916*6236dae4SAndroid Build Coastguard Worker 1917*6236dae4SAndroid Build Coastguard Worker struct Curl_message msg; /* A single posted message. */ 1918*6236dae4SAndroid Build Coastguard Worker 1919*6236dae4SAndroid Build Coastguard Worker /* Array with the plain socket numbers this handle takes care of, in no 1920*6236dae4SAndroid Build Coastguard Worker particular order. Note that all sockets are added to the sockhash, where 1921*6236dae4SAndroid Build Coastguard Worker the state etc are also kept. This array is mostly used to detect when a 1922*6236dae4SAndroid Build Coastguard Worker socket is to be removed from the hash. See singlesocket(). */ 1923*6236dae4SAndroid Build Coastguard Worker struct easy_pollset last_poll; 1924*6236dae4SAndroid Build Coastguard Worker 1925*6236dae4SAndroid Build Coastguard Worker struct Names dns; 1926*6236dae4SAndroid Build Coastguard Worker struct Curl_multi *multi; /* if non-NULL, points to the multi handle 1927*6236dae4SAndroid Build Coastguard Worker struct to which this "belongs" when used by 1928*6236dae4SAndroid Build Coastguard Worker the multi interface */ 1929*6236dae4SAndroid Build Coastguard Worker struct Curl_multi *multi_easy; /* if non-NULL, points to the multi handle 1930*6236dae4SAndroid Build Coastguard Worker struct to which this "belongs" when used 1931*6236dae4SAndroid Build Coastguard Worker by the easy interface */ 1932*6236dae4SAndroid Build Coastguard Worker struct Curl_share *share; /* Share, handles global variable mutexing */ 1933*6236dae4SAndroid Build Coastguard Worker #ifdef USE_LIBPSL 1934*6236dae4SAndroid Build Coastguard Worker struct PslCache *psl; /* The associated PSL cache. */ 1935*6236dae4SAndroid Build Coastguard Worker #endif 1936*6236dae4SAndroid Build Coastguard Worker struct SingleRequest req; /* Request-specific data */ 1937*6236dae4SAndroid Build Coastguard Worker struct UserDefined set; /* values set by the libcurl user */ 1938*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_COOKIES 1939*6236dae4SAndroid Build Coastguard Worker struct CookieInfo *cookies; /* the cookies, read from files and servers. 1940*6236dae4SAndroid Build Coastguard Worker NOTE that the 'cookie' field in the 1941*6236dae4SAndroid Build Coastguard Worker UserDefined struct defines if the "engine" 1942*6236dae4SAndroid Build Coastguard Worker is to be used or not. */ 1943*6236dae4SAndroid Build Coastguard Worker #endif 1944*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_HSTS 1945*6236dae4SAndroid Build Coastguard Worker struct hsts *hsts; 1946*6236dae4SAndroid Build Coastguard Worker #endif 1947*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_ALTSVC 1948*6236dae4SAndroid Build Coastguard Worker struct altsvcinfo *asi; /* the alt-svc cache */ 1949*6236dae4SAndroid Build Coastguard Worker #endif 1950*6236dae4SAndroid Build Coastguard Worker struct Progress progress; /* for all the progress meter data */ 1951*6236dae4SAndroid Build Coastguard Worker struct UrlState state; /* struct for fields used for state info and 1952*6236dae4SAndroid Build Coastguard Worker other dynamic purposes */ 1953*6236dae4SAndroid Build Coastguard Worker #ifndef CURL_DISABLE_FTP 1954*6236dae4SAndroid Build Coastguard Worker struct WildcardData *wildcard; /* wildcard download state info */ 1955*6236dae4SAndroid Build Coastguard Worker #endif 1956*6236dae4SAndroid Build Coastguard Worker struct PureInfo info; /* stats, reports and info data */ 1957*6236dae4SAndroid Build Coastguard Worker struct curl_tlssessioninfo tsi; /* Information about the TLS session, only 1958*6236dae4SAndroid Build Coastguard Worker valid after a client has asked for it */ 1959*6236dae4SAndroid Build Coastguard Worker #ifdef USE_HYPER 1960*6236dae4SAndroid Build Coastguard Worker struct hyptransfer hyp; 1961*6236dae4SAndroid Build Coastguard Worker #endif 1962*6236dae4SAndroid Build Coastguard Worker }; 1963*6236dae4SAndroid Build Coastguard Worker 1964*6236dae4SAndroid Build Coastguard Worker #define LIBCURL_NAME "libcurl" 1965*6236dae4SAndroid Build Coastguard Worker 1966*6236dae4SAndroid Build Coastguard Worker #endif /* HEADER_CURL_URLDATA_H */ 1967