xref: /aosp_15_r20/external/curl/lib/urldata.h (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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