Imported Upstream version 7.48.0
[platform/upstream/curl.git] / lib / urldata.h
1 #ifndef HEADER_CURL_URLDATA_H
2 #define HEADER_CURL_URLDATA_H
3 /***************************************************************************
4  *                                  _   _ ____  _
5  *  Project                     ___| | | |  _ \| |
6  *                             / __| | | | |_) | |
7  *                            | (__| |_| |  _ <| |___
8  *                             \___|\___/|_| \_\_____|
9  *
10  * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al.
11  *
12  * This software is licensed as described in the file COPYING, which
13  * you should have received as part of this distribution. The terms
14  * are also available at https://curl.haxx.se/docs/copyright.html.
15  *
16  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
17  * copies of the Software, and permit persons to whom the Software is
18  * furnished to do so, under the terms of the COPYING file.
19  *
20  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
21  * KIND, either express or implied.
22  *
23  ***************************************************************************/
24
25 /* This file is for lib internal stuff */
26
27 #include "curl_setup.h"
28
29 #define PORT_FTP 21
30 #define PORT_FTPS 990
31 #define PORT_TELNET 23
32 #define PORT_HTTP 80
33 #define PORT_HTTPS 443
34 #define PORT_DICT 2628
35 #define PORT_LDAP 389
36 #define PORT_LDAPS 636
37 #define PORT_TFTP 69
38 #define PORT_SSH 22
39 #define PORT_IMAP 143
40 #define PORT_IMAPS 993
41 #define PORT_POP3 110
42 #define PORT_POP3S 995
43 #define PORT_SMB 445
44 #define PORT_SMBS 445
45 #define PORT_SMTP 25
46 #define PORT_SMTPS 465 /* sometimes called SSMTP */
47 #define PORT_RTSP 554
48 #define PORT_RTMP 1935
49 #define PORT_RTMPT PORT_HTTP
50 #define PORT_RTMPS PORT_HTTPS
51 #define PORT_GOPHER 70
52
53 #define DICT_MATCH "/MATCH:"
54 #define DICT_MATCH2 "/M:"
55 #define DICT_MATCH3 "/FIND:"
56 #define DICT_DEFINE "/DEFINE:"
57 #define DICT_DEFINE2 "/D:"
58 #define DICT_DEFINE3 "/LOOKUP:"
59
60 #define CURL_DEFAULT_USER "anonymous"
61 #define CURL_DEFAULT_PASSWORD "ftp@example.com"
62
63 /* Convenience defines for checking protocols or their SSL based version. Each
64    protocol handler should only ever have a single CURLPROTO_ in its protocol
65    field. */
66 #define PROTO_FAMILY_HTTP (CURLPROTO_HTTP|CURLPROTO_HTTPS)
67 #define PROTO_FAMILY_FTP  (CURLPROTO_FTP|CURLPROTO_FTPS)
68 #define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
69 #define PROTO_FAMILY_SMB  (CURLPROTO_SMB|CURLPROTO_SMBS)
70 #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
71
72 #define DEFAULT_CONNCACHE_SIZE 5
73
74 /* length of longest IPv6 address string including the trailing null */
75 #define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
76
77 /* Default FTP/IMAP etc response timeout in milliseconds.
78    Symbian OS panics when given a timeout much greater than 1/2 hour.
79 */
80 #define RESP_TIMEOUT (1800*1000)
81
82 #include "cookie.h"
83 #include "formdata.h"
84
85 #ifdef USE_OPENSSL
86 #include <openssl/ssl.h>
87 #ifdef HAVE_OPENSSL_ENGINE_H
88 #include <openssl/engine.h>
89 #endif
90 #endif /* USE_OPENSSL */
91
92 #ifdef USE_GNUTLS
93 #include <gnutls/gnutls.h>
94 #endif
95
96 #ifdef USE_MBEDTLS
97
98 #include <mbedtls/ssl.h>
99 #include <mbedtls/version.h>
100 #include <mbedtls/entropy.h>
101 #include <mbedtls/ctr_drbg.h>
102
103 #elif defined USE_POLARSSL
104
105 #include <polarssl/ssl.h>
106 #include <polarssl/version.h>
107 #if POLARSSL_VERSION_NUMBER<0x01010000
108 #include <polarssl/havege.h>
109 #else
110 #include <polarssl/entropy.h>
111 #include <polarssl/ctr_drbg.h>
112 #endif /* POLARSSL_VERSION_NUMBER<0x01010000 */
113
114 #endif /* USE_POLARSSL */
115
116 #ifdef USE_CYASSL
117 #undef OCSP_REQUEST  /* avoid cyassl/openssl/ssl.h clash with wincrypt.h */
118 #undef OCSP_RESPONSE /* avoid cyassl/openssl/ssl.h clash with wincrypt.h */
119 #include <cyassl/openssl/ssl.h>
120 #endif
121
122 #ifdef USE_NSS
123 #include <nspr.h>
124 #include <pk11pub.h>
125 #endif
126
127 #ifdef USE_GSKIT
128 #include <gskssl.h>
129 #endif
130
131 #ifdef USE_AXTLS
132 #include <axTLS/config.h>
133 #include <axTLS/ssl.h>
134 #undef malloc
135 #undef calloc
136 #undef realloc
137 #endif /* USE_AXTLS */
138
139 #ifdef USE_SCHANNEL
140 #include "curl_sspi.h"
141 #include <schnlsp.h>
142 #include <schannel.h>
143 #endif
144
145 #ifdef USE_DARWINSSL
146 #include <Security/Security.h>
147 /* For some reason, when building for iOS, the omnibus header above does
148  * not include SecureTransport.h as of iOS SDK 5.1. */
149 #include <Security/SecureTransport.h>
150 #endif
151
152 #ifdef HAVE_NETINET_IN_H
153 #include <netinet/in.h>
154 #endif
155
156 #include "timeval.h"
157
158 #ifdef HAVE_ZLIB_H
159 #include <zlib.h>               /* for content-encoding */
160 #ifdef __SYMBIAN32__
161 /* zlib pollutes the namespace with this definition */
162 #undef WIN32
163 #endif
164 #endif
165
166 #include <curl/curl.h>
167
168 #include "http_chunks.h" /* for the structs and enum stuff */
169 #include "hostip.h"
170 #include "hash.h"
171 #include "splay.h"
172
173 #include "imap.h"
174 #include "pop3.h"
175 #include "smtp.h"
176 #include "ftp.h"
177 #include "file.h"
178 #include "ssh.h"
179 #include "http.h"
180 #include "rtsp.h"
181 #include "smb.h"
182 #include "wildcard.h"
183 #include "multihandle.h"
184
185 #ifdef HAVE_GSSAPI
186 # ifdef HAVE_GSSGNU
187 #  include <gss.h>
188 # elif defined HAVE_GSSMIT
189 #  include <gssapi/gssapi.h>
190 #  include <gssapi/gssapi_generic.h>
191 # else
192 #  include <gssapi.h>
193 # endif
194 #endif
195
196 #ifdef HAVE_LIBSSH2_H
197 #include <libssh2.h>
198 #include <libssh2_sftp.h>
199 #endif /* HAVE_LIBSSH2_H */
200
201 /* Download buffer size, keep it fairly big for speed reasons */
202 #undef BUFSIZE
203 #define BUFSIZE CURL_MAX_WRITE_SIZE
204
205 /* Initial size of the buffer to store headers in, it'll be enlarged in case
206    of need. */
207 #define HEADERSIZE 256
208
209 #define CURLEASY_MAGIC_NUMBER 0xc0dedbadU
210 #define GOOD_EASY_HANDLE(x) \
211   ((x) && (((struct SessionHandle *)(x))->magic == CURLEASY_MAGIC_NUMBER))
212
213 /* Some convenience macros to get the larger/smaller value out of two given.
214    We prefix with CURL to prevent name collisions. */
215 #define CURLMAX(x,y) ((x)>(y)?(x):(y))
216 #define CURLMIN(x,y) ((x)<(y)?(x):(y))
217
218
219 #ifdef HAVE_GSSAPI
220 /* Types needed for krb5-ftp connections */
221 struct krb5buffer {
222   void *data;
223   size_t size;
224   size_t index;
225   int eof_flag;
226 };
227
228 enum protection_level {
229   PROT_NONE, /* first in list */
230   PROT_CLEAR,
231   PROT_SAFE,
232   PROT_CONFIDENTIAL,
233   PROT_PRIVATE,
234   PROT_CMD,
235   PROT_LAST /* last in list */
236 };
237 #endif
238
239 #ifdef USE_SCHANNEL
240 /* Structs to store Schannel handles */
241 struct curl_schannel_cred {
242   CredHandle cred_handle;
243   TimeStamp time_stamp;
244   int refcount;
245   bool cached;
246 };
247
248 struct curl_schannel_ctxt {
249   CtxtHandle ctxt_handle;
250   TimeStamp time_stamp;
251 };
252 #endif
253
254 /* enum for the nonblocking SSL connection state machine */
255 typedef enum {
256   ssl_connect_1,
257   ssl_connect_2,
258   ssl_connect_2_reading,
259   ssl_connect_2_writing,
260   ssl_connect_3,
261   ssl_connect_done
262 } ssl_connect_state;
263
264 typedef enum {
265   ssl_connection_none,
266   ssl_connection_negotiating,
267   ssl_connection_complete
268 } ssl_connection_state;
269
270 /* struct for data related to each SSL connection */
271 struct ssl_connect_data {
272   /* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
273      but at least asked to or meaning to use it. See 'state' for the exact
274      current state of the connection. */
275   bool use;
276   ssl_connection_state state;
277   ssl_connect_state connecting_state;
278 #if defined(USE_OPENSSL)
279   /* these ones requires specific SSL-types */
280   SSL_CTX* ctx;
281   SSL*     handle;
282   X509*    server_cert;
283 #elif defined(USE_GNUTLS)
284   gnutls_session_t session;
285   gnutls_certificate_credentials_t cred;
286 #ifdef USE_TLS_SRP
287   gnutls_srp_client_credentials_t srp_client_cred;
288 #endif
289 #elif defined(USE_MBEDTLS)
290   mbedtls_ctr_drbg_context ctr_drbg;
291   mbedtls_entropy_context entropy;
292   mbedtls_ssl_context ssl;
293   mbedtls_ssl_session ssn;
294   int server_fd;
295   mbedtls_x509_crt cacert;
296   mbedtls_x509_crt clicert;
297   mbedtls_x509_crl crl;
298   mbedtls_pk_context pk;
299   mbedtls_ssl_config config;
300   const char *protocols[3];
301 #elif defined(USE_POLARSSL)
302   ctr_drbg_context ctr_drbg;
303   entropy_context entropy;
304   ssl_context ssl;
305   ssl_session ssn;
306   int server_fd;
307   x509_crt cacert;
308   x509_crt clicert;
309   x509_crl crl;
310   rsa_context rsa;
311 #elif defined(USE_CYASSL)
312   SSL_CTX* ctx;
313   SSL*     handle;
314 #elif defined(USE_NSS)
315   PRFileDesc *handle;
316   char *client_nickname;
317   struct SessionHandle *data;
318   struct curl_llist *obj_list;
319   PK11GenericObject *obj_clicert;
320 #elif defined(USE_GSKIT)
321   gsk_handle handle;
322   int iocport;
323 #elif defined(USE_AXTLS)
324   SSL_CTX* ssl_ctx;
325   SSL*     ssl;
326 #elif defined(USE_SCHANNEL)
327   struct curl_schannel_cred *cred;
328   struct curl_schannel_ctxt *ctxt;
329   SecPkgContext_StreamSizes stream_sizes;
330   size_t encdata_length, decdata_length;
331   size_t encdata_offset, decdata_offset;
332   unsigned char *encdata_buffer, *decdata_buffer;
333   unsigned long req_flags, ret_flags;
334   CURLcode recv_unrecoverable_err; /* schannel_recv had an unrecoverable err */
335   bool recv_sspi_close_notify; /* true if connection closed by close_notify */
336   bool recv_connection_closed; /* true if connection closed, regardless how */
337 #elif defined(USE_DARWINSSL)
338   SSLContextRef ssl_ctx;
339   curl_socket_t ssl_sockfd;
340   bool ssl_direction; /* true if writing, false if reading */
341   size_t ssl_write_buffered_length;
342 #elif defined(USE_SSL)
343 #error "SSL backend specific information missing from ssl_connect_data"
344 #endif
345 };
346
347 struct ssl_config_data {
348   long version;          /* what version the client wants to use */
349   long certverifyresult; /* result from the certificate verification */
350
351   bool verifypeer;       /* set TRUE if this is desired */
352   bool verifyhost;       /* set TRUE if CN/SAN must match hostname */
353   bool verifystatus;     /* set TRUE if certificate status must be checked */
354   char *CApath;          /* certificate dir (doesn't work on windows) */
355   char *CAfile;          /* certificate to verify peer against */
356   const char *CRLfile;   /* CRL to check certificate revocation */
357   const char *issuercert;/* optional issuer certificate filename */
358   char *random_file;     /* path to file containing "random" data */
359   char *egdsocket;       /* path to file containing the EGD daemon socket */
360   char *cipher_list;     /* list of ciphers to use */
361   size_t max_ssl_sessions; /* SSL session id cache size */
362   curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
363   void *fsslctxp;        /* parameter for call back */
364   bool sessionid;        /* cache session IDs or not */
365   bool certinfo;         /* gather lots of certificate info */
366   bool falsestart;
367
368 #ifdef USE_TLS_SRP
369   char *username; /* TLS username (for, e.g., SRP) */
370   char *password; /* TLS password (for, e.g., SRP) */
371   enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
372 #endif
373 };
374
375 /* information stored about one single SSL session */
376 struct curl_ssl_session {
377   char *name;       /* host name for which this ID was used */
378   void *sessionid;  /* as returned from the SSL layer */
379   size_t idsize;    /* if known, otherwise 0 */
380   long age;         /* just a number, the higher the more recent */
381   int remote_port;  /* remote port to connect to */
382   struct ssl_config_data ssl_config; /* setup for this session */
383 };
384
385 /* Struct used for Digest challenge-response authentication */
386 struct digestdata {
387 #if defined(USE_WINDOWS_SSPI)
388   BYTE *input_token;
389   size_t input_token_len;
390 #else
391   char *nonce;
392   char *cnonce;
393   char *realm;
394   int algo;
395   bool stale; /* set true for re-negotiation */
396   char *opaque;
397   char *qop;
398   char *algorithm;
399   int nc; /* nounce count */
400 #endif
401 };
402
403 typedef enum {
404   NTLMSTATE_NONE,
405   NTLMSTATE_TYPE1,
406   NTLMSTATE_TYPE2,
407   NTLMSTATE_TYPE3,
408   NTLMSTATE_LAST
409 } curlntlm;
410
411 #ifdef USE_WINDOWS_SSPI
412 #include "curl_sspi.h"
413 #endif
414
415 #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
416 #include <iconv.h>
417 #endif
418
419 /* Struct used for GSSAPI (Kerberos V5) authentication */
420 #if defined(USE_KERBEROS5)
421 struct kerberos5data {
422 #if defined(USE_WINDOWS_SSPI)
423   CredHandle *credentials;
424   CtxtHandle *context;
425   TCHAR *spn;
426   SEC_WINNT_AUTH_IDENTITY identity;
427   SEC_WINNT_AUTH_IDENTITY *p_identity;
428   size_t token_max;
429   BYTE *output_token;
430 #else
431   gss_ctx_id_t context;
432   gss_name_t spn;
433 #endif
434 };
435 #endif
436
437 /* Struct used for NTLM challenge-response authentication */
438 #if defined(USE_NTLM)
439 struct ntlmdata {
440   curlntlm state;
441 #ifdef USE_WINDOWS_SSPI
442   CredHandle *credentials;
443   CtxtHandle *context;
444   SEC_WINNT_AUTH_IDENTITY identity;
445   SEC_WINNT_AUTH_IDENTITY *p_identity;
446   size_t token_max;
447   BYTE *output_token;
448   BYTE *input_token;
449   size_t input_token_len;
450 #else
451   unsigned int flags;
452   unsigned char nonce[8];
453   void* target_info; /* TargetInfo received in the ntlm type-2 message */
454   unsigned int target_info_len;
455 #endif
456 };
457 #endif
458
459 #ifdef USE_SPNEGO
460 struct negotiatedata {
461   /* When doing Negotiate (SPNEGO) auth, we first need to send a token
462      and then validate the received one. */
463   enum { GSS_AUTHNONE, GSS_AUTHRECV, GSS_AUTHSENT } state;
464 #ifdef HAVE_GSSAPI
465   OM_uint32 status;
466   gss_ctx_id_t context;
467   gss_name_t server_name;
468   gss_buffer_desc output_token;
469 #else
470 #ifdef USE_WINDOWS_SSPI
471   DWORD status;
472   CredHandle *credentials;
473   CtxtHandle *context;
474   SEC_WINNT_AUTH_IDENTITY identity;
475   SEC_WINNT_AUTH_IDENTITY *p_identity;
476   TCHAR *server_name;
477   size_t token_max;
478   BYTE *output_token;
479   size_t output_token_length;
480 #endif
481 #endif
482 };
483 #endif
484
485
486 /*
487  * Boolean values that concerns this connection.
488  */
489 struct ConnectBits {
490   /* always modify bits.close with the connclose() and connkeep() macros! */
491   bool close; /* if set, we close the connection after this request */
492   bool reuse; /* if set, this is a re-used connection */
493   bool proxy; /* if set, this transfer is done through a proxy - any type */
494   bool httpproxy;    /* if set, this transfer is done through a http proxy */
495   bool user_passwd;    /* do we use user+password for this connection? */
496   bool proxy_user_passwd; /* user+password for the proxy? */
497   bool ipv6_ip; /* we communicate with a remote site specified with pure IPv6
498                    IP address */
499   bool ipv6;    /* we communicate with a site using an IPv6 address */
500
501   bool do_more; /* this is set TRUE if the ->curl_do_more() function is
502                    supposed to be called, after ->curl_do() */
503   bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
504                          the first time on the first connect function call */
505   bool protoconnstart;/* the protocol layer has STARTED its operation after
506                          the TCP layer connect */
507
508   bool retry;         /* this connection is about to get closed and then
509                          re-attempted at another connection. */
510   bool tunnel_proxy;  /* if CONNECT is used to "tunnel" through the proxy.
511                          This is implicit when SSL-protocols are used through
512                          proxies, but can also be enabled explicitly by
513                          apps */
514   bool authneg;       /* TRUE when the auth phase has started, which means
515                          that we are creating a request with an auth header,
516                          but it is not the final request in the auth
517                          negotiation. */
518   bool rewindaftersend;/* TRUE when the sending couldn't be stopped even
519                           though it will be discarded. When the whole send
520                           operation is done, we must call the data rewind
521                           callback. */
522   bool ftp_use_epsv;  /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
523                          EPSV doesn't work we disable it for the forthcoming
524                          requests */
525
526   bool ftp_use_eprt;  /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
527                          EPRT doesn't work we disable it for the forthcoming
528                          requests */
529   bool netrc;         /* name+password provided by netrc */
530   bool userpwd_in_url; /* name+password found in url */
531   bool stream_was_rewound; /* Indicates that the stream was rewound after a
532                               request read past the end of its response byte
533                               boundary */
534   bool proxy_connect_closed; /* set true if a proxy disconnected the
535                                 connection in a CONNECT request with auth, so
536                                 that libcurl should reconnect and continue. */
537   bool bound; /* set true if bind() has already been done on this socket/
538                  connection */
539   bool type_set;  /* type= was used in the URL */
540   bool multiplex; /* connection is multiplexed */
541 };
542
543 struct hostname {
544   char *rawalloc; /* allocated "raw" version of the name */
545   char *encalloc; /* allocated IDN-encoded version of the name */
546   char *name;     /* name to use internally, might be encoded, might be raw */
547   const char *dispname; /* name to display, as 'name' might be encoded */
548 };
549
550 /*
551  * Flags on the keepon member of the Curl_transfer_keeper
552  */
553
554 #define KEEP_NONE  0
555 #define KEEP_RECV  (1<<0)     /* there is or may be data to read */
556 #define KEEP_SEND (1<<1)     /* there is or may be data to write */
557 #define KEEP_RECV_HOLD (1<<2) /* when set, no reading should be done but there
558                                  might still be data to read */
559 #define KEEP_SEND_HOLD (1<<3) /* when set, no writing should be done but there
560                                   might still be data to write */
561 #define KEEP_RECV_PAUSE (1<<4) /* reading is paused */
562 #define KEEP_SEND_PAUSE (1<<5) /* writing is paused */
563
564 #define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE)
565 #define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
566
567
568 #ifdef HAVE_LIBZ
569 typedef enum {
570   ZLIB_UNINIT,          /* uninitialized */
571   ZLIB_INIT,            /* initialized */
572   ZLIB_GZIP_HEADER,     /* reading gzip header */
573   ZLIB_GZIP_INFLATING,  /* inflating gzip stream */
574   ZLIB_INIT_GZIP        /* initialized in transparent gzip mode */
575 } zlibInitState;
576 #endif
577
578 #ifdef CURLRES_ASYNCH
579 struct Curl_async {
580   char *hostname;
581   int port;
582   struct Curl_dns_entry *dns;
583   bool done;  /* set TRUE when the lookup is complete */
584   int status; /* if done is TRUE, this is the status from the callback */
585   void *os_specific;  /* 'struct thread_data' for Windows */
586 };
587 #endif
588
589 #define FIRSTSOCKET     0
590 #define SECONDARYSOCKET 1
591
592 /* These function pointer types are here only to allow easier typecasting
593    within the source when we need to cast between data pointers (such as NULL)
594    and function pointers. */
595 typedef CURLcode (*Curl_do_more_func)(struct connectdata *, int *);
596 typedef CURLcode (*Curl_done_func)(struct connectdata *, CURLcode, bool);
597
598 enum expect100 {
599   EXP100_SEND_DATA,           /* enough waiting, just send the body now */
600   EXP100_AWAITING_CONTINUE,   /* waiting for the 100 Continue header */
601   EXP100_SENDING_REQUEST,     /* still sending the request but will wait for
602                                  the 100 header once done with the request */
603   EXP100_FAILED               /* used on 417 Expectation Failed */
604 };
605
606 enum upgrade101 {
607   UPGR101_INIT,               /* default state */
608   UPGR101_REQUESTED,          /* upgrade requested */
609   UPGR101_RECEIVED,           /* response received */
610   UPGR101_WORKING             /* talking upgraded protocol */
611 };
612
613 /*
614  * Request specific data in the easy handle (SessionHandle).  Previously,
615  * these members were on the connectdata struct but since a conn struct may
616  * now be shared between different SessionHandles, we store connection-specific
617  * data here. This struct only keeps stuff that's interesting for *this*
618  * request, as it will be cleared between multiple ones
619  */
620 struct SingleRequest {
621   curl_off_t size;        /* -1 if unknown at this point */
622   curl_off_t *bytecountp; /* return number of bytes read or NULL */
623
624   curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch,
625                              -1 means unlimited */
626   curl_off_t *writebytecountp; /* return number of bytes written or NULL */
627
628   curl_off_t bytecount;         /* total number of bytes read */
629   curl_off_t writebytecount;    /* number of bytes written */
630
631   long headerbytecount;         /* only count received headers */
632   long deductheadercount; /* this amount of bytes doesn't count when we check
633                              if anything has been transferred at the end of a
634                              connection. We use this counter to make only a
635                              100 reply (without a following second response
636                              code) result in a CURLE_GOT_NOTHING error code */
637
638   struct timeval start;         /* transfer started at this time */
639   struct timeval now;           /* current time */
640   bool header;                  /* incoming data has HTTP header */
641   enum {
642     HEADER_NORMAL,              /* no bad header at all */
643     HEADER_PARTHEADER,          /* part of the chunk is a bad header, the rest
644                                    is normal data */
645     HEADER_ALLBAD               /* all was believed to be header */
646   } badheader;                  /* the header was deemed bad and will be
647                                    written as body */
648   int headerline;               /* counts header lines to better track the
649                                    first one */
650   char *hbufp;                  /* points at *end* of header line */
651   size_t hbuflen;
652   char *str;                    /* within buf */
653   char *str_start;              /* within buf */
654   char *end_ptr;                /* within buf */
655   char *p;                      /* within headerbuff */
656   bool content_range;           /* set TRUE if Content-Range: was found */
657   curl_off_t offset;            /* possible resume offset read from the
658                                    Content-Range: header */
659   int httpcode;                 /* error code from the 'HTTP/1.? XXX' or
660                                    'RTSP/1.? XXX' line */
661   struct timeval start100;      /* time stamp to wait for the 100 code from */
662   enum expect100 exp100;        /* expect 100 continue state */
663   enum upgrade101 upgr101;      /* 101 upgrade state */
664
665   int auto_decoding;            /* What content encoding. sec 3.5, RFC2616. */
666
667 #define IDENTITY 0              /* No encoding */
668 #define DEFLATE 1               /* zlib deflate [RFC 1950 & 1951] */
669 #define GZIP 2                  /* gzip algorithm [RFC 1952] */
670
671 #ifdef HAVE_LIBZ
672   zlibInitState zlib_init;      /* possible zlib init state;
673                                    undefined if Content-Encoding header. */
674   z_stream z;                   /* State structure for zlib. */
675 #endif
676
677   time_t timeofdoc;
678   long bodywrites;
679
680   char *buf;
681   char *uploadbuf;
682   curl_socket_t maxfd;
683
684   int keepon;
685
686   bool upload_done; /* set to TRUE when doing chunked transfer-encoding upload
687                        and we're uploading the last chunk */
688
689   bool ignorebody;  /* we read a response-body but we ignore it! */
690   bool ignorecl;    /* This HTTP response has no body so we ignore the Content-
691                        Length: header */
692
693   char *location;   /* This points to an allocated version of the Location:
694                        header data */
695   char *newurl;     /* Set to the new URL to use when a redirect or a retry is
696                        wanted */
697
698   /* 'upload_present' is used to keep a byte counter of how much data there is
699      still left in the buffer, aimed for upload. */
700   ssize_t upload_present;
701
702    /* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
703       buffer, so the next read should read from where this pointer points to,
704       and the 'upload_present' contains the number of bytes available at this
705       position */
706   char *upload_fromhere;
707
708   bool chunk; /* if set, this is a chunked transfer-encoding */
709   bool upload_chunky; /* set TRUE if we are doing chunked transfer-encoding
710                          on upload */
711   bool getheader;     /* TRUE if header parsing is wanted */
712
713   bool forbidchunk;   /* used only to explicitly forbid chunk-upload for
714                          specific upload buffers. See readmoredata() in
715                          http.c for details. */
716
717   void *protop;       /* Allocated protocol-specific data. Each protocol
718                          handler makes sure this points to data it needs. */
719 };
720
721 /*
722  * Specific protocol handler.
723  */
724
725 struct Curl_handler {
726   const char * scheme;        /* URL scheme name. */
727
728   /* Complement to setup_connection_internals(). */
729   CURLcode (*setup_connection)(struct connectdata *);
730
731   /* These two functions MUST be set to be protocol dependent */
732   CURLcode (*do_it)(struct connectdata *, bool *done);
733   Curl_done_func done;
734
735   /* If the curl_do() function is better made in two halves, this
736    * curl_do_more() function will be called afterwards, if set. For example
737    * for doing the FTP stuff after the PASV/PORT command.
738    */
739   Curl_do_more_func do_more;
740
741   /* This function *MAY* be set to a protocol-dependent function that is run
742    * after the connect() and everything is done, as a step in the connection.
743    * The 'done' pointer points to a bool that should be set to TRUE if the
744    * function completes before return. If it doesn't complete, the caller
745    * should call the curl_connecting() function until it is.
746    */
747   CURLcode (*connect_it)(struct connectdata *, bool *done);
748
749   /* See above. Currently only used for FTP. */
750   CURLcode (*connecting)(struct connectdata *, bool *done);
751   CURLcode (*doing)(struct connectdata *, bool *done);
752
753   /* Called from the multi interface during the PROTOCONNECT phase, and it
754      should then return a proper fd set */
755   int (*proto_getsock)(struct connectdata *conn,
756                        curl_socket_t *socks,
757                        int numsocks);
758
759   /* Called from the multi interface during the DOING phase, and it should
760      then return a proper fd set */
761   int (*doing_getsock)(struct connectdata *conn,
762                        curl_socket_t *socks,
763                        int numsocks);
764
765   /* Called from the multi interface during the DO_MORE phase, and it should
766      then return a proper fd set */
767   int (*domore_getsock)(struct connectdata *conn,
768                         curl_socket_t *socks,
769                         int numsocks);
770
771   /* Called from the multi interface during the DO_DONE, PERFORM and
772      WAITPERFORM phases, and it should then return a proper fd set. Not setting
773      this will make libcurl use the generic default one. */
774   int (*perform_getsock)(const struct connectdata *conn,
775                          curl_socket_t *socks,
776                          int numsocks);
777
778   /* This function *MAY* be set to a protocol-dependent function that is run
779    * by the curl_disconnect(), as a step in the disconnection.  If the handler
780    * is called because the connection has been considered dead, dead_connection
781    * is set to TRUE.
782    */
783   CURLcode (*disconnect)(struct connectdata *, bool dead_connection);
784
785   /* If used, this function gets called from transfer.c:readwrite_data() to
786      allow the protocol to do extra reads/writes */
787   CURLcode (*readwrite)(struct SessionHandle *data, struct connectdata *conn,
788                         ssize_t *nread, bool *readmore);
789
790   long defport;           /* Default port. */
791   unsigned int protocol;  /* See CURLPROTO_* - this needs to be the single
792                              specific protocol bit */
793   unsigned int flags;     /* Extra particular characteristics, see PROTOPT_* */
794 };
795
796 #define PROTOPT_NONE 0             /* nothing extra */
797 #define PROTOPT_SSL (1<<0)         /* uses SSL */
798 #define PROTOPT_DUAL (1<<1)        /* this protocol uses two connections */
799 #define PROTOPT_CLOSEACTION (1<<2) /* need action before socket close */
800 /* some protocols will have to call the underlying functions without regard to
801    what exact state the socket signals. IE even if the socket says "readable",
802    the send function might need to be called while uploading, or vice versa.
803 */
804 #define PROTOPT_DIRLOCK (1<<3)
805 #define PROTOPT_NONETWORK (1<<4)   /* protocol doesn't use the network! */
806 #define PROTOPT_NEEDSPWD (1<<5)    /* needs a password, and if none is set it
807                                       gets a default */
808 #define PROTOPT_NOURLQUERY (1<<6)   /* protocol can't handle
809                                         url query strings (?foo=bar) ! */
810 #define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login credentials per
811                                           request instead of per connection */
812
813
814 /* return the count of bytes sent, or -1 on error */
815 typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
816                             int sockindex,            /* socketindex */
817                             const void *buf,          /* data to write */
818                             size_t len,               /* max amount to write */
819                             CURLcode *err);           /* error to return */
820
821 /* return the count of bytes read, or -1 on error */
822 typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
823                             int sockindex,            /* socketindex */
824                             char *buf,                /* store data here */
825                             size_t len,               /* max amount to read */
826                             CURLcode *err);           /* error to return */
827
828 /*
829  * The connectdata struct contains all fields and variables that should be
830  * unique for an entire connection.
831  */
832 struct connectdata {
833   /* 'data' is the CURRENT SessionHandle using this connection -- take great
834      caution that this might very well vary between different times this
835      connection is used! */
836   struct SessionHandle *data;
837
838   /* chunk is for HTTP chunked encoding, but is in the general connectdata
839      struct only because we can do just about any protocol through a HTTP proxy
840      and a HTTP proxy may in fact respond using chunked encoding */
841   struct Curl_chunker chunk;
842
843   curl_closesocket_callback fclosesocket; /* function closing the socket(s) */
844   void *closesocket_client;
845
846   bool inuse; /* This is a marker for the connection cache logic. If this is
847                  TRUE this handle is being used by an easy handle and cannot
848                  be used by any other easy handle without careful
849                  consideration (== only for pipelining). */
850
851   /**** Fields set when inited and not modified again */
852   long connection_id; /* Contains a unique number to make it easier to
853                          track the connections in the log output */
854
855   /* 'dns_entry' is the particular host we use. This points to an entry in the
856      DNS cache and it will not get pruned while locked. It gets unlocked in
857      Curl_done(). This entry will be NULL if the connection is re-used as then
858      there is no name resolve done. */
859   struct Curl_dns_entry *dns_entry;
860
861   /* 'ip_addr' is the particular IP we connected to. It points to a struct
862      within the DNS cache, so this pointer is only valid as long as the DNS
863      cache entry remains locked. It gets unlocked in Curl_done() */
864   Curl_addrinfo *ip_addr;
865   Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */
866
867   /* 'ip_addr_str' is the ip_addr data as a human readable string.
868      It remains available as long as the connection does, which is longer than
869      the ip_addr itself. */
870   char ip_addr_str[MAX_IPADR_LEN];
871
872   unsigned int scope_id;  /* Scope id for IPv6 */
873
874   int socktype;  /* SOCK_STREAM or SOCK_DGRAM */
875
876   struct hostname host;
877   struct hostname proxy;
878
879   long port;       /* which port to use locally */
880   int remote_port; /* what remote port to connect to, not the proxy port! */
881
882   /* 'primary_ip' and 'primary_port' get filled with peer's numerical
883      ip address and port number whenever an outgoing connection is
884      *attempted* from the primary socket to a remote address. When more
885      than one address is tried for a connection these will hold data
886      for the last attempt. When the connection is actually established
887      these are updated with data which comes directly from the socket. */
888
889   char primary_ip[MAX_IPADR_LEN];
890   long primary_port;
891
892   /* 'local_ip' and 'local_port' get filled with local's numerical
893      ip address and port number whenever an outgoing connection is
894      **established** from the primary socket to a remote address. */
895
896   char local_ip[MAX_IPADR_LEN];
897   long local_port;
898
899   char *user;    /* user name string, allocated */
900   char *passwd;  /* password string, allocated */
901   char *options; /* options string, allocated */
902
903   char *oauth_bearer; /* bearer token for OAuth 2.0, allocated */
904
905   char *proxyuser;    /* proxy user name string, allocated */
906   char *proxypasswd;  /* proxy password string, allocated */
907   curl_proxytype proxytype; /* what kind of proxy that is in use */
908
909   int httpversion;        /* the HTTP version*10 reported by the server */
910   int rtspversion;        /* the RTSP version*10 reported by the server */
911
912   struct timeval now;     /* "current" time */
913   struct timeval created; /* creation time */
914   curl_socket_t sock[2]; /* two sockets, the second is used for the data
915                             transfer when doing FTP */
916   curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
917   bool sock_accepted[2]; /* TRUE if the socket on this index was created with
918                             accept() */
919   Curl_recv *recv[2];
920   Curl_send *send[2];
921
922   struct ssl_connect_data ssl[2]; /* this is for ssl-stuff */
923   struct ssl_config_data ssl_config;
924   bool tls_upgraded;
925
926   struct ConnectBits bits;    /* various state-flags for this connection */
927
928  /* connecttime: when connect() is called on the current IP address. Used to
929     be able to track when to move on to try next IP - but only when the multi
930     interface is used. */
931   struct timeval connecttime;
932   /* The two fields below get set in Curl_connecthost */
933   int num_addr; /* number of addresses to try to connect to */
934   long timeoutms_per_addr; /* how long time in milliseconds to spend on
935                               trying to connect to each IP address */
936
937   const struct Curl_handler *handler; /* Connection's protocol handler */
938   const struct Curl_handler *given;   /* The protocol first given */
939
940   long ip_version; /* copied from the SessionHandle at creation time */
941
942   /**** curl_get() phase fields */
943
944   curl_socket_t sockfd;   /* socket to read from or CURL_SOCKET_BAD */
945   curl_socket_t writesockfd; /* socket to write to, it may very
946                                 well be the same we read from.
947                                 CURL_SOCKET_BAD disables */
948
949   /** Dynamicly allocated strings, MUST be freed before this **/
950   /** struct is killed.                                      **/
951   struct dynamically_allocated_data {
952     char *proxyuserpwd;
953     char *uagent;
954     char *accept_encoding;
955     char *userpwd;
956     char *rangeline;
957     char *ref;
958     char *host;
959     char *cookiehost;
960     char *rtsp_transport;
961     char *te; /* TE: request header */
962   } allocptr;
963
964 #ifdef HAVE_GSSAPI
965   int sec_complete; /* if Kerberos is enabled for this connection */
966   enum protection_level command_prot;
967   enum protection_level data_prot;
968   enum protection_level request_data_prot;
969   size_t buffer_size;
970   struct krb5buffer in_buffer;
971   void *app_data;
972   const struct Curl_sec_client_mech *mech;
973   struct sockaddr_in local_addr;
974 #endif
975
976 #if defined(USE_KERBEROS5)    /* Consider moving some of the above GSS-API */
977   struct kerberos5data krb5;  /* variables into the structure definition, */
978 #endif                        /* however, some of them are ftp specific. */
979
980   /* the two following *_inuse fields are only flags, not counters in any way.
981      If TRUE it means the channel is in use, and if FALSE it means the channel
982      is up for grabs by one. */
983
984   bool readchannel_inuse;  /* whether the read channel is in use by an easy
985                               handle */
986   bool writechannel_inuse; /* whether the write channel is in use by an easy
987                               handle */
988   struct curl_llist *send_pipe; /* List of handles waiting to
989                                    send on this pipeline */
990   struct curl_llist *recv_pipe; /* List of handles waiting to read
991                                    their responses on this pipeline */
992   char* master_buffer; /* The master buffer allocated on-demand;
993                           used for pipelining. */
994   size_t read_pos; /* Current read position in the master buffer */
995   size_t buf_len; /* Length of the buffer?? */
996
997
998   curl_seek_callback seek_func; /* function that seeks the input */
999   void *seek_client;            /* pointer to pass to the seek() above */
1000
1001   /*************** Request - specific items ************/
1002
1003 #if defined(USE_NTLM)
1004   struct ntlmdata ntlm;     /* NTLM differs from other authentication schemes
1005                                because it authenticates connections, not
1006                                single requests! */
1007   struct ntlmdata proxyntlm; /* NTLM data for proxy */
1008
1009 #if defined(NTLM_WB_ENABLED)
1010   /* used for communication with Samba's winbind daemon helper ntlm_auth */
1011   curl_socket_t ntlm_auth_hlpr_socket;
1012   pid_t ntlm_auth_hlpr_pid;
1013   char* challenge_header;
1014   char* response_header;
1015 #endif
1016 #endif
1017
1018   char syserr_buf [256]; /* buffer for Curl_strerror() */
1019
1020 #ifdef CURLRES_ASYNCH
1021   /* data used for the asynch name resolve callback */
1022   struct Curl_async async;
1023 #endif
1024
1025   /* These three are used for chunked-encoding trailer support */
1026   char *trailer; /* allocated buffer to store trailer in */
1027   int trlMax;    /* allocated buffer size */
1028   int trlPos;    /* index of where to store data */
1029
1030   union {
1031     struct ftp_conn ftpc;
1032     struct http_conn httpc;
1033     struct ssh_conn sshc;
1034     struct tftp_state_data *tftpc;
1035     struct imap_conn imapc;
1036     struct pop3_conn pop3c;
1037     struct smtp_conn smtpc;
1038     struct rtsp_conn rtspc;
1039     struct smb_conn smbc;
1040     void *generic; /* RTMP and LDAP use this */
1041   } proto;
1042
1043   int cselect_bits; /* bitmask of socket events */
1044   int waitfor;      /* current READ/WRITE bits to wait for */
1045
1046 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
1047   int socks5_gssapi_enctype;
1048 #endif
1049
1050   bool verifypeer;
1051   bool verifyhost;
1052
1053   /* When this connection is created, store the conditions for the local end
1054      bind. This is stored before the actual bind and before any connection is
1055      made and will serve the purpose of being used for comparison reasons so
1056      that subsequent bound-requested connections aren't accidentally re-using
1057      wrong connections. */
1058   char *localdev;
1059   unsigned short localport;
1060   int localportrange;
1061
1062   /* tunnel as in tunnel through a HTTP proxy with CONNECT */
1063   enum {
1064     TUNNEL_INIT,    /* init/default/no tunnel state */
1065     TUNNEL_CONNECT, /* CONNECT has been sent off */
1066     TUNNEL_COMPLETE /* CONNECT response received completely */
1067   } tunnel_state[2]; /* two separate ones to allow FTP */
1068   struct connectbundle *bundle; /* The bundle we are member of */
1069
1070   int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
1071 };
1072
1073 /* The end of connectdata. */
1074
1075 /*
1076  * Struct to keep statistical and informational data.
1077  */
1078 struct PureInfo {
1079   int httpcode;  /* Recent HTTP, FTP, or RTSP response code */
1080   int httpproxycode; /* response code from proxy when received separate */
1081   int httpversion; /* the http version number X.Y = X*10+Y */
1082   long filetime; /* If requested, this is might get set. Set to -1 if the time
1083                     was unretrievable. We cannot have this of type time_t,
1084                     since time_t is unsigned on several platforms such as
1085                     OpenVMS. */
1086   bool timecond;  /* set to TRUE if the time condition didn't match, which
1087                      thus made the document NOT get fetched */
1088   long header_size;  /* size of read header(s) in bytes */
1089   long request_size; /* the amount of bytes sent in the request(s) */
1090   unsigned long proxyauthavail; /* what proxy auth types were announced */
1091   unsigned long httpauthavail;  /* what host auth types were announced */
1092   long numconnects; /* how many new connection did libcurl created */
1093   char *contenttype; /* the content type of the object */
1094   char *wouldredirect; /* URL this would've been redirected to if asked to */
1095
1096   /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
1097      and, 'conn_local_port' are copied over from the connectdata struct in
1098      order to allow curl_easy_getinfo() to return this information even when
1099      the session handle is no longer associated with a connection, and also
1100      allow curl_easy_reset() to clear this information from the session handle
1101      without disturbing information which is still alive, and that might be
1102      reused, in the connection cache. */
1103
1104   char conn_primary_ip[MAX_IPADR_LEN];
1105   long conn_primary_port;
1106
1107   char conn_local_ip[MAX_IPADR_LEN];
1108   long conn_local_port;
1109
1110   struct curl_certinfo certs; /* info about the certs, only populated in
1111                                  OpenSSL builds. Asked for with
1112                                  CURLOPT_CERTINFO / CURLINFO_CERTINFO */
1113 };
1114
1115
1116 struct Progress {
1117   long lastshow; /* time() of the last displayed progress meter or NULL to
1118                     force redraw at next call */
1119   curl_off_t size_dl; /* total expected size */
1120   curl_off_t size_ul; /* total expected size */
1121   curl_off_t downloaded; /* transferred so far */
1122   curl_off_t uploaded; /* transferred so far */
1123
1124   curl_off_t current_speed; /* uses the currently fastest transfer */
1125
1126   bool callback;  /* set when progress callback is used */
1127   int width; /* screen width at download start */
1128   int flags; /* see progress.h */
1129
1130   double timespent;
1131
1132   curl_off_t dlspeed;
1133   curl_off_t ulspeed;
1134
1135   double t_nslookup;
1136   double t_connect;
1137   double t_appconnect;
1138   double t_pretransfer;
1139   double t_starttransfer;
1140   double t_redirect;
1141
1142   struct timeval start;
1143   struct timeval t_startsingle;
1144   struct timeval t_startop;
1145   struct timeval t_acceptdata;
1146 #define CURR_TIME (5+1) /* 6 entries for 5 seconds */
1147
1148   curl_off_t speeder[ CURR_TIME ];
1149   struct timeval speeder_time[ CURR_TIME ];
1150   int speeder_c;
1151 };
1152
1153 typedef enum {
1154   HTTPREQ_NONE, /* first in list */
1155   HTTPREQ_GET,
1156   HTTPREQ_POST,
1157   HTTPREQ_POST_FORM, /* we make a difference internally */
1158   HTTPREQ_PUT,
1159   HTTPREQ_HEAD,
1160   HTTPREQ_CUSTOM,
1161   HTTPREQ_LAST /* last in list */
1162 } Curl_HttpReq;
1163
1164 typedef enum {
1165     RTSPREQ_NONE, /* first in list */
1166     RTSPREQ_OPTIONS,
1167     RTSPREQ_DESCRIBE,
1168     RTSPREQ_ANNOUNCE,
1169     RTSPREQ_SETUP,
1170     RTSPREQ_PLAY,
1171     RTSPREQ_PAUSE,
1172     RTSPREQ_TEARDOWN,
1173     RTSPREQ_GET_PARAMETER,
1174     RTSPREQ_SET_PARAMETER,
1175     RTSPREQ_RECORD,
1176     RTSPREQ_RECEIVE,
1177     RTSPREQ_LAST /* last in list */
1178 } Curl_RtspReq;
1179
1180 /*
1181  * Values that are generated, temporary or calculated internally for a
1182  * "session handle" must be defined within the 'struct UrlState'.  This struct
1183  * will be used within the SessionHandle struct. When the 'SessionHandle'
1184  * struct is cloned, this data MUST NOT be copied.
1185  *
1186  * Remember that any "state" information goes globally for the curl handle.
1187  * Session-data MUST be put in the connectdata struct and here.  */
1188 #define MAX_CURL_USER_LENGTH 256
1189 #define MAX_CURL_PASSWORD_LENGTH 256
1190
1191 struct auth {
1192   unsigned long want;  /* Bitmask set to the authentication methods wanted by
1193                           app (with CURLOPT_HTTPAUTH or CURLOPT_PROXYAUTH). */
1194   unsigned long picked;
1195   unsigned long avail; /* Bitmask for what the server reports to support for
1196                           this resource */
1197   bool done;  /* TRUE when the auth phase is done and ready to do the *actual*
1198                  request */
1199   bool multi; /* TRUE if this is not yet authenticated but within the auth
1200                  multipass negotiation */
1201   bool iestyle; /* TRUE if digest should be done IE-style or FALSE if it should
1202                    be RFC compliant */
1203 };
1204
1205 struct UrlState {
1206
1207   /* Points to the connection cache */
1208   struct conncache *conn_cache;
1209
1210   /* when curl_easy_perform() is called, the multi handle is "owned" by
1211      the easy handle so curl_easy_cleanup() on such an easy handle will
1212      also close the multi handle! */
1213   bool multi_owned_by_easy;
1214
1215   /* buffers to store authentication data in, as parsed from input options */
1216   struct timeval keeps_speed; /* for the progress meter really */
1217
1218   struct connectdata *lastconnect; /* The last connection, NULL if undefined */
1219
1220   char *headerbuff; /* allocated buffer to store headers in */
1221   size_t headersize;   /* size of the allocation */
1222
1223   char buffer[BUFSIZE+1]; /* download buffer */
1224   char uploadbuffer[BUFSIZE+1]; /* upload buffer */
1225   curl_off_t current_speed;  /* the ProgressShow() funcion sets this,
1226                                 bytes / second */
1227   bool this_is_a_follow; /* this is a followed Location: request */
1228
1229   char *first_host; /* if set, this should be the host name that we will
1230                        sent authorization to, no else. Used to make Location:
1231                        following not keep sending user+password... This is
1232                        strdup() data.
1233                     */
1234   struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
1235   long sessionage;                  /* number of the most recent session */
1236   char *tempwrite;      /* allocated buffer to keep data in when a write
1237                            callback returns to make the connection paused */
1238   size_t tempwritesize; /* size of the 'tempwrite' allocated buffer */
1239   int tempwritetype;    /* type of the 'tempwrite' buffer as a bitmask that is
1240                            used with Curl_client_write() */
1241   char *scratch; /* huge buffer[BUFSIZE*2] when doing upload CRLF replacing */
1242   bool errorbuf; /* Set to TRUE if the error buffer is already filled in.
1243                     This must be set to FALSE every time _easy_perform() is
1244                     called. */
1245   int os_errno;  /* filled in with errno whenever an error occurs */
1246 #ifdef HAVE_SIGNAL
1247   /* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
1248   void (*prev_signal)(int sig);
1249 #endif
1250   bool allow_port; /* Is set.use_port allowed to take effect or not. This
1251                       is always set TRUE when curl_easy_perform() is called. */
1252   struct digestdata digest;      /* state data for host Digest auth */
1253   struct digestdata proxydigest; /* state data for proxy Digest auth */
1254
1255 #ifdef USE_SPNEGO
1256   struct negotiatedata negotiate; /* state data for host Negotiate auth */
1257   struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */
1258 #endif
1259
1260   struct auth authhost;  /* auth details for host */
1261   struct auth authproxy; /* auth details for proxy */
1262
1263   bool authproblem; /* TRUE if there's some problem authenticating */
1264
1265   void *resolver; /* resolver state, if it is used in the URL state -
1266                      ares_channel f.e. */
1267
1268 #if defined(USE_OPENSSL) && defined(HAVE_OPENSSL_ENGINE_H)
1269   ENGINE *engine;
1270 #endif /* USE_OPENSSL */
1271   struct timeval expiretime; /* set this with Curl_expire() only */
1272   struct Curl_tree timenode; /* for the splay stuff */
1273   struct curl_llist *timeoutlist; /* list of pending timeouts */
1274
1275   /* a place to store the most recently set FTP entrypath */
1276   char *most_recent_ftp_entrypath;
1277
1278   /* set after initial USER failure, to prevent an authentication loop */
1279   bool ftp_trying_alternative;
1280
1281   int httpversion;       /* the lowest HTTP version*10 reported by any server
1282                             involved in this request */
1283   bool expect100header;  /* TRUE if we added Expect: 100-continue */
1284
1285   bool pipe_broke; /* TRUE if the connection we were pipelined on broke
1286                       and we need to restart from the beginning */
1287
1288 #if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
1289     !defined(__SYMBIAN32__)
1290 /* do FTP line-end conversions on most platforms */
1291 #define CURL_DO_LINEEND_CONV
1292   /* for FTP downloads: track CRLF sequences that span blocks */
1293   bool prev_block_had_trailing_cr;
1294   /* for FTP downloads: how many CRLFs did we converted to LFs? */
1295   curl_off_t crlf_conversions;
1296 #endif
1297   char *pathbuffer;/* allocated buffer to store the URL's path part in */
1298   char *path;      /* path to use, points to somewhere within the pathbuffer
1299                       area */
1300   bool slash_removed; /* set TRUE if the 'path' points to a path where the
1301                          initial URL slash separator has been taken off */
1302   bool use_range;
1303   bool rangestringalloc; /* the range string is malloc()'ed */
1304
1305   char *range; /* range, if used. See README for detailed specification on
1306                   this syntax. */
1307   curl_off_t resume_from; /* continue [ftp] transfer from here */
1308
1309   /* This RTSP state information survives requests and connections */
1310   long rtsp_next_client_CSeq; /* the session's next client CSeq */
1311   long rtsp_next_server_CSeq; /* the session's next server CSeq */
1312   long rtsp_CSeq_recv; /* most recent CSeq received */
1313
1314   curl_off_t infilesize; /* size of file to upload, -1 means unknown.
1315                             Copied from set.filesize at start of operation */
1316
1317   int drain; /* Increased when this stream has data to read, even if its
1318                 socket not necessarily is readable. Decreased when
1319                 checked. */
1320   bool done; /* set to FALSE when Curl_do() is called and set to TRUE when
1321                 Curl_done() is called, to prevent Curl_done() to get invoked
1322                 twice when the multi interface is used. */
1323
1324   curl_read_callback fread_func; /* read callback/function */
1325   void *in;                      /* CURLOPT_READDATA */
1326
1327   struct SessionHandle *stream_depends_on;
1328   bool stream_depends_e; /* set or don't set the Exclusive bit */
1329   int stream_weight;
1330 };
1331
1332
1333 /*
1334  * This 'DynamicStatic' struct defines dynamic states that actually change
1335  * values in the 'UserDefined' area, which MUST be taken into consideration
1336  * if the UserDefined struct is cloned or similar. You can probably just
1337  * copy these, but each one indicate a special action on other data.
1338  */
1339
1340 struct DynamicStatic {
1341   char *url;        /* work URL, copied from UserDefined */
1342   bool url_alloc;   /* URL string is malloc()'ed */
1343   char *referer;    /* referer string */
1344   bool referer_alloc; /* referer sting is malloc()ed */
1345   struct curl_slist *cookielist; /* list of cookie files set by
1346                                     curl_easy_setopt(COOKIEFILE) calls */
1347   struct curl_slist *resolve; /* set to point to the set.resolve list when
1348                                  this should be dealt with in pretransfer */
1349 };
1350
1351 /*
1352  * This 'UserDefined' struct must only contain data that is set once to go
1353  * for many (perhaps) independent connections. Values that are generated or
1354  * calculated internally for the "session handle" MUST be defined within the
1355  * 'struct UrlState' instead. The only exceptions MUST note the changes in
1356  * the 'DynamicStatic' struct.
1357  * Character pointer fields point to dynamic storage, unless otherwise stated.
1358  */
1359
1360 struct Curl_multi;    /* declared and used only in multi.c */
1361
1362 enum dupstring {
1363   STRING_CERT,            /* client certificate file name */
1364   STRING_CERT_TYPE,       /* format for certificate (default: PEM)*/
1365   STRING_COOKIE,          /* HTTP cookie string to send */
1366   STRING_COOKIEJAR,       /* dump all cookies to this file */
1367   STRING_CUSTOMREQUEST,   /* HTTP/FTP/RTSP request/method to use */
1368   STRING_DEFAULT_PROTOCOL, /* Protocol to use when the URL doesn't specify */
1369   STRING_DEVICE,          /* local network interface/address to use */
1370   STRING_ENCODING,        /* Accept-Encoding string */
1371   STRING_FTP_ACCOUNT,     /* ftp account data */
1372   STRING_FTP_ALTERNATIVE_TO_USER, /* command to send if USER/PASS fails */
1373   STRING_FTPPORT,         /* port to send with the FTP PORT command */
1374   STRING_KEY,             /* private key file name */
1375   STRING_KEY_PASSWD,      /* plain text private key password */
1376   STRING_KEY_TYPE,        /* format for private key (default: PEM) */
1377   STRING_KRB_LEVEL,       /* krb security level */
1378   STRING_NETRC_FILE,      /* if not NULL, use this instead of trying to find
1379                              $HOME/.netrc */
1380   STRING_PROXY,           /* proxy to use */
1381   STRING_SET_RANGE,       /* range, if used */
1382   STRING_SET_REFERER,     /* custom string for the HTTP referer field */
1383   STRING_SET_URL,         /* what original URL to work on */
1384   STRING_SSL_CAPATH,      /* CA directory name (doesn't work on windows) */
1385   STRING_SSL_CAFILE,      /* certificate file to verify peer against */
1386   STRING_SSL_PINNEDPUBLICKEY, /* public key file to verify peer against */
1387   STRING_SSL_CIPHER_LIST, /* list of ciphers to use */
1388   STRING_SSL_EGDSOCKET,   /* path to file containing the EGD daemon socket */
1389   STRING_SSL_RANDOM_FILE, /* path to file containing "random" data */
1390   STRING_USERAGENT,       /* User-Agent string */
1391   STRING_SSL_CRLFILE,     /* crl file to check certificate */
1392   STRING_SSL_ISSUERCERT,  /* issuer cert file to check certificate */
1393   STRING_USERNAME,        /* <username>, if used */
1394   STRING_PASSWORD,        /* <password>, if used */
1395   STRING_OPTIONS,         /* <options>, if used */
1396   STRING_PROXYUSERNAME,   /* Proxy <username>, if used */
1397   STRING_PROXYPASSWORD,   /* Proxy <password>, if used */
1398   STRING_NOPROXY,         /* List of hosts which should not use the proxy, if
1399                              used */
1400   STRING_RTSP_SESSION_ID, /* Session ID to use */
1401   STRING_RTSP_STREAM_URI, /* Stream URI for this request */
1402   STRING_RTSP_TRANSPORT,  /* Transport for this session */
1403 #ifdef USE_LIBSSH2
1404   STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
1405   STRING_SSH_PUBLIC_KEY,  /* path to the public key file for auth */
1406   STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
1407   STRING_SSH_KNOWNHOSTS,  /* file name of knownhosts file */
1408 #endif
1409 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
1410   STRING_SOCKS5_GSSAPI_SERVICE, /* GSSAPI service name */
1411   STRING_PROXY_SERVICE_NAME, /* Proxy service name */
1412   STRING_SERVICE_NAME,    /* Service name */
1413 #endif
1414   STRING_MAIL_FROM,
1415   STRING_MAIL_AUTH,
1416
1417 #ifdef USE_TLS_SRP
1418   STRING_TLSAUTH_USERNAME,      /* TLS auth <username> */
1419   STRING_TLSAUTH_PASSWORD,      /* TLS auth <password> */
1420 #endif
1421   STRING_BEARER,                /* <bearer>, if used */
1422 #ifdef USE_UNIX_SOCKETS
1423   STRING_UNIX_SOCKET_PATH,      /* path to Unix socket, if used */
1424 #endif
1425
1426   /* -- end of zero-terminated strings -- */
1427
1428   STRING_LASTZEROTERMINATED,
1429
1430   /* -- below this are pointers to binary data that cannot be strdup'ed.
1431      Each such pointer must be added manually to Curl_dupset() --- */
1432
1433   STRING_COPYPOSTFIELDS,  /* if POST, set the fields' values here */
1434
1435   STRING_LAST /* not used, just an end-of-list marker */
1436 };
1437
1438 struct UserDefined {
1439   FILE *err;         /* the stderr user data goes here */
1440   void *debugdata;   /* the data that will be passed to fdebug */
1441   char *errorbuffer; /* (Static) store failure messages in here */
1442   long proxyport; /* If non-zero, use this port number by default. If the
1443                      proxy string features a ":[port]" that one will override
1444                      this. */
1445   void *out;         /* CURLOPT_WRITEDATA */
1446   void *in_set;      /* CURLOPT_READDATA */
1447   void *writeheader; /* write the header to this if non-NULL */
1448   void *rtp_out;     /* write RTP to this if non-NULL */
1449   long use_port;     /* which port to use (when not using default) */
1450   unsigned long httpauth;  /* kind of HTTP authentication to use (bitmask) */
1451   unsigned long proxyauth; /* kind of proxy authentication to use (bitmask) */
1452   long followlocation; /* as in HTTP Location: */
1453   long maxredirs;    /* maximum no. of http(s) redirects to follow, set to -1
1454                         for infinity */
1455
1456   int keep_post;     /* keep POSTs as POSTs after a 30x request; each
1457                         bit represents a request, from 301 to 303 */
1458   bool free_referer; /* set TRUE if 'referer' points to a string we
1459                         allocated */
1460   void *postfields;  /* if POST, set the fields' values here */
1461   curl_seek_callback seek_func;      /* function that seeks the input */
1462   curl_off_t postfieldsize; /* if POST, this might have a size to use instead
1463                                of strlen(), and then the data *may* be binary
1464                                (contain zero bytes) */
1465   unsigned short localport; /* local port number to bind to */
1466   int localportrange; /* number of additional port numbers to test in case the
1467                          'localport' one can't be bind()ed */
1468   curl_write_callback fwrite_func;   /* function that stores the output */
1469   curl_write_callback fwrite_header; /* function that stores headers */
1470   curl_write_callback fwrite_rtp;    /* function that stores interleaved RTP */
1471   curl_read_callback fread_func_set; /* function that reads the input */
1472   int is_fread_set; /* boolean, has read callback been set to non-NULL? */
1473   int is_fwrite_set; /* boolean, has write callback been set to non-NULL? */
1474   curl_progress_callback fprogress; /* OLD and deprecated progress callback  */
1475   curl_xferinfo_callback fxferinfo; /* progress callback */
1476   curl_debug_callback fdebug;      /* function that write informational data */
1477   curl_ioctl_callback ioctl_func;  /* function for I/O control */
1478   curl_sockopt_callback fsockopt;  /* function for setting socket options */
1479   void *sockopt_client; /* pointer to pass to the socket options callback */
1480   curl_opensocket_callback fopensocket; /* function for checking/translating
1481                                            the address and opening the
1482                                            socket */
1483   void* opensocket_client;
1484   curl_closesocket_callback fclosesocket; /* function for closing the
1485                                              socket */
1486   void* closesocket_client;
1487
1488   void *seek_client;    /* pointer to pass to the seek callback */
1489   /* the 3 curl_conv_callback functions below are used on non-ASCII hosts */
1490   /* function to convert from the network encoding: */
1491   curl_conv_callback convfromnetwork;
1492   /* function to convert to the network encoding: */
1493   curl_conv_callback convtonetwork;
1494   /* function to convert from UTF-8 encoding: */
1495   curl_conv_callback convfromutf8;
1496
1497   void *progress_client; /* pointer to pass to the progress callback */
1498   void *ioctl_client;   /* pointer to pass to the ioctl callback */
1499   long timeout;         /* in milliseconds, 0 means no timeout */
1500   long connecttimeout;  /* in milliseconds, 0 means no timeout */
1501   long accepttimeout;   /* in milliseconds, 0 means no timeout */
1502   long server_response_timeout; /* in milliseconds, 0 means no timeout */
1503   long tftp_blksize;    /* in bytes, 0 means use default */
1504   bool tftp_no_options; /* do not send TFTP options requests */
1505   curl_off_t filesize;  /* size of file to upload, -1 means unknown */
1506   long low_speed_limit; /* bytes/second */
1507   long low_speed_time;  /* number of seconds */
1508   curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */
1509   curl_off_t max_recv_speed; /* high speed limit in bytes/second for
1510                                 download */
1511   curl_off_t set_resume_from;  /* continue [ftp] transfer from here */
1512   struct curl_slist *headers; /* linked list of extra headers */
1513   struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
1514   struct curl_httppost *httppost;  /* linked list of POST data */
1515   bool sep_headers;     /* handle host and proxy headers separately */
1516   bool cookiesession;   /* new cookie session? */
1517   bool crlf;            /* convert crlf on ftp upload(?) */
1518   struct curl_slist *quote;     /* after connection is established */
1519   struct curl_slist *postquote; /* after the transfer */
1520   struct curl_slist *prequote; /* before the transfer, after type */
1521   struct curl_slist *source_quote;  /* 3rd party quote */
1522   struct curl_slist *source_prequote;  /* in 3rd party transfer mode - before
1523                                           the transfer on source host */
1524   struct curl_slist *source_postquote; /* in 3rd party transfer mode - after
1525                                           the transfer on source host */
1526   struct curl_slist *telnet_options; /* linked list of telnet options */
1527   struct curl_slist *resolve;     /* list of names to add/remove from
1528                                      DNS cache */
1529   curl_TimeCond timecondition; /* kind of time/date comparison */
1530   time_t timevalue;       /* what time to compare with */
1531   Curl_HttpReq httpreq;   /* what kind of HTTP request (if any) is this */
1532   long httpversion; /* when non-zero, a specific HTTP version requested to
1533                        be used in the library's request(s) */
1534   struct ssl_config_data ssl;  /* user defined SSL stuff */
1535   curl_proxytype proxytype; /* what kind of proxy that is in use */
1536   long dns_cache_timeout; /* DNS cache timeout */
1537   long buffer_size;      /* size of receive buffer to use */
1538   void *private_data; /* application-private data */
1539
1540   struct curl_slist *http200aliases; /* linked list of aliases for http200 */
1541
1542   long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
1543                  0 - whatever, 1 - v2, 2 - v6 */
1544
1545   curl_off_t max_filesize; /* Maximum file size to download */
1546
1547   curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used  */
1548
1549   int ftp_create_missing_dirs; /* 1 - create directories that don't exist
1550                                   2 - the same but also allow MKD to fail once
1551                                */
1552
1553   curl_sshkeycallback ssh_keyfunc; /* key matching callback */
1554   void *ssh_keyfunc_userp;         /* custom pointer to callback */
1555
1556 /* Here follows boolean settings that define how to behave during
1557    this session. They are STATIC, set by libcurl users or at least initially
1558    and they don't change during operations. */
1559
1560   bool printhost;        /* printing host name in debug info */
1561   bool get_filetime;     /* get the time and get of the remote file */
1562   bool tunnel_thru_httpproxy; /* use CONNECT through a HTTP proxy */
1563   bool prefer_ascii;     /* ASCII rather than binary */
1564   bool ftp_append;       /* append, not overwrite, on upload */
1565   bool ftp_list_only;    /* switch FTP command for listing directories */
1566   bool ftp_use_port;     /* use the FTP PORT command */
1567   bool hide_progress;    /* don't use the progress meter */
1568   bool http_fail_on_error;  /* fail on HTTP error codes >= 400 */
1569   bool http_follow_location; /* follow HTTP redirects */
1570   bool http_transfer_encoding; /* request compressed HTTP transfer-encoding */
1571   bool http_disable_hostname_check_before_authentication;
1572   bool include_header;   /* include received protocol headers in data output */
1573   bool http_set_referer; /* is a custom referer used */
1574   bool http_auto_referer; /* set "correct" referer when following location: */
1575   bool opt_no_body;      /* as set with CURLOPT_NOBODY */
1576   bool set_port;         /* custom port number used */
1577   bool upload;           /* upload request */
1578   enum CURL_NETRC_OPTION
1579        use_netrc;        /* defined in include/curl.h */
1580   bool verbose;          /* output verbosity */
1581   bool krb;              /* Kerberos connection requested */
1582   bool reuse_forbid;     /* forbidden to be reused, close after use */
1583   bool reuse_fresh;      /* do not re-use an existing connection  */
1584   bool ftp_use_epsv;     /* if EPSV is to be attempted or not */
1585   bool ftp_use_eprt;     /* if EPRT is to be attempted or not */
1586   bool ftp_use_pret;     /* if PRET is to be used before PASV or not */
1587
1588   curl_usessl use_ssl;   /* if AUTH TLS is to be attempted etc, for FTP or
1589                             IMAP or POP3 or others! */
1590   curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
1591   curl_ftpccc ftp_ccc;   /* FTP CCC options */
1592   bool no_signal;        /* do not use any signal/alarm handler */
1593   bool global_dns_cache; /* subject for future removal */
1594   bool tcp_nodelay;      /* whether to enable TCP_NODELAY or not */
1595   bool ignorecl;         /* ignore content length */
1596   bool ftp_skip_ip;      /* skip the IP address the FTP server passes on to
1597                             us */
1598   bool connect_only;     /* make connection, let application use the socket */
1599   bool ssl_enable_beast; /* especially allow this flaw for interoperability's
1600                             sake*/
1601   bool ssl_no_revoke;    /* disable SSL certificate revocation checks */
1602   long ssh_auth_types;   /* allowed SSH auth types */
1603   bool http_te_skip;     /* pass the raw body data to the user, even when
1604                             transfer-encoded (chunked, compressed) */
1605   bool http_ce_skip;     /* pass the raw body data to the user, even when
1606                             content-encoded (chunked, compressed) */
1607   long new_file_perms;    /* Permissions to use when creating remote files */
1608   long new_directory_perms; /* Permissions to use when creating remote dirs */
1609   bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
1610                                via an HTTP proxy */
1611   char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
1612   unsigned int scope_id;  /* Scope id for IPv6 */
1613   long allowed_protocols;
1614   long redir_protocols;
1615 #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
1616   long socks5_gssapi_nec; /* flag to support nec socks5 server */
1617 #endif
1618   struct curl_slist *mail_rcpt; /* linked list of mail recipients */
1619   bool sasl_ir;         /* Enable/disable SASL initial response */
1620   /* Common RTSP header options */
1621   Curl_RtspReq rtspreq; /* RTSP request type */
1622   long rtspversion; /* like httpversion, for RTSP */
1623   bool wildcardmatch; /* enable wildcard matching */
1624   curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
1625                                         starts */
1626   curl_chunk_end_callback chunk_end; /* called after part transferring
1627                                         stopped */
1628   curl_fnmatch_callback fnmatch; /* callback to decide which file corresponds
1629                                     to pattern (e.g. if WILDCARDMATCH is on) */
1630   void *fnmatch_data;
1631
1632   long gssapi_delegation; /* GSS-API credential delegation, see the
1633                              documentation of CURLOPT_GSSAPI_DELEGATION */
1634
1635   bool tcp_keepalive;    /* use TCP keepalives */
1636   long tcp_keepidle;     /* seconds in idle before sending keepalive probe */
1637   long tcp_keepintvl;    /* seconds between TCP keepalive probes */
1638
1639   size_t maxconnects;  /* Max idle connections in the connection cache */
1640
1641   bool ssl_enable_npn;  /* TLS NPN extension? */
1642   bool ssl_enable_alpn; /* TLS ALPN extension? */
1643   bool path_as_is;      /* allow dotdots? */
1644   bool pipewait;        /* wait for pipe/multiplex status before starting a
1645                            new connection */
1646   long expect_100_timeout; /* in milliseconds */
1647
1648   struct SessionHandle *stream_depends_on;
1649   bool stream_depends_e; /* set or don't set the Exclusive bit */
1650   int stream_weight;
1651 };
1652
1653 struct Names {
1654   struct curl_hash *hostcache;
1655   enum {
1656     HCACHE_NONE,    /* not pointing to anything */
1657     HCACHE_GLOBAL,  /* points to the (shrug) global one */
1658     HCACHE_MULTI,   /* points to a shared one in the multi handle */
1659     HCACHE_SHARED   /* points to a shared one in a shared object */
1660   } hostcachetype;
1661 };
1662
1663 /*
1664  * The 'connectdata' struct MUST have all the connection oriented stuff as we
1665  * may have several simultaneous connections and connection structs in memory.
1666  *
1667  * The 'struct UserDefined' must only contain data that is set once to go for
1668  * many (perhaps) independent connections. Values that are generated or
1669  * calculated internally for the "session handle" must be defined within the
1670  * 'struct UrlState' instead.
1671  */
1672
1673 struct SessionHandle {
1674   /* first, two fields for the linked list of these */
1675   struct SessionHandle *next;
1676   struct SessionHandle *prev;
1677
1678   struct connectdata *easy_conn;     /* the "unit's" connection */
1679
1680   CURLMstate mstate;  /* the handle's state */
1681   CURLcode result;   /* previous result */
1682
1683   struct Curl_message msg; /* A single posted message. */
1684
1685   /* Array with the plain socket numbers this handle takes care of, in no
1686      particular order. Note that all sockets are added to the sockhash, where
1687      the state etc are also kept. This array is mostly used to detect when a
1688      socket is to be removed from the hash. See singlesocket(). */
1689   curl_socket_t sockets[MAX_SOCKSPEREASYHANDLE];
1690   int numsocks;
1691
1692   struct Names dns;
1693   struct Curl_multi *multi;    /* if non-NULL, points to the multi handle
1694                                   struct to which this "belongs" when used by
1695                                   the multi interface */
1696   struct Curl_multi *multi_easy; /* if non-NULL, points to the multi handle
1697                                     struct to which this "belongs" when used
1698                                     by the easy interface */
1699   struct Curl_share *share;    /* Share, handles global variable mutexing */
1700   struct SingleRequest req;    /* Request-specific data */
1701   struct UserDefined set;      /* values set by the libcurl user */
1702   struct DynamicStatic change; /* possibly modified userdefined data */
1703   struct CookieInfo *cookies;  /* the cookies, read from files and servers.
1704                                   NOTE that the 'cookie' field in the
1705                                   UserDefined struct defines if the "engine"
1706                                   is to be used or not. */
1707   struct Progress progress;    /* for all the progress meter data */
1708   struct UrlState state;       /* struct for fields used for state info and
1709                                   other dynamic purposes */
1710   struct WildcardData wildcard; /* wildcard download state info */
1711   struct PureInfo info;        /* stats, reports and info data */
1712   struct curl_tlssessioninfo tsi; /* Information about the TLS session, only
1713                                      valid after a client has asked for it */
1714 #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
1715   iconv_t outbound_cd;         /* for translating to the network encoding */
1716   iconv_t inbound_cd;          /* for translating from the network encoding */
1717   iconv_t utf8_cd;             /* for translating to UTF8 */
1718 #endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
1719   unsigned int magic;          /* set to a CURLEASY_MAGIC_NUMBER */
1720 };
1721
1722 #define LIBCURL_NAME "libcurl"
1723
1724 #endif /* HEADER_CURL_URLDATA_H */