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