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