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