Annotation of embedaddon/curl/lib/urldata.h, revision 1.1
1.1 ! misho 1: #ifndef HEADER_CURL_URLDATA_H
! 2: #define HEADER_CURL_URLDATA_H
! 3: /***************************************************************************
! 4: * _ _ ____ _
! 5: * Project ___| | | | _ \| |
! 6: * / __| | | | |_) | |
! 7: * | (__| |_| | _ <| |___
! 8: * \___|\___/|_| \_\_____|
! 9: *
! 10: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
! 11: *
! 12: * This software is licensed as described in the file COPYING, which
! 13: * you should have received as part of this distribution. The terms
! 14: * are also available at https://curl.haxx.se/docs/copyright.html.
! 15: *
! 16: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 17: * copies of the Software, and permit persons to whom the Software is
! 18: * furnished to do so, under the terms of the COPYING file.
! 19: *
! 20: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 21: * KIND, either express or implied.
! 22: *
! 23: ***************************************************************************/
! 24:
! 25: /* This file is for lib internal stuff */
! 26:
! 27: #include "curl_setup.h"
! 28:
! 29: #define PORT_FTP 21
! 30: #define PORT_FTPS 990
! 31: #define PORT_TELNET 23
! 32: #define PORT_HTTP 80
! 33: #define PORT_HTTPS 443
! 34: #define PORT_DICT 2628
! 35: #define PORT_LDAP 389
! 36: #define PORT_LDAPS 636
! 37: #define PORT_TFTP 69
! 38: #define PORT_SSH 22
! 39: #define PORT_IMAP 143
! 40: #define PORT_IMAPS 993
! 41: #define PORT_POP3 110
! 42: #define PORT_POP3S 995
! 43: #define PORT_SMB 445
! 44: #define PORT_SMBS 445
! 45: #define PORT_SMTP 25
! 46: #define PORT_SMTPS 465 /* sometimes called SSMTP */
! 47: #define PORT_RTSP 554
! 48: #define PORT_RTMP 1935
! 49: #define PORT_RTMPT PORT_HTTP
! 50: #define PORT_RTMPS PORT_HTTPS
! 51: #define PORT_GOPHER 70
! 52: #define PORT_MQTT 1883
! 53:
! 54: #define DICT_MATCH "/MATCH:"
! 55: #define DICT_MATCH2 "/M:"
! 56: #define DICT_MATCH3 "/FIND:"
! 57: #define DICT_DEFINE "/DEFINE:"
! 58: #define DICT_DEFINE2 "/D:"
! 59: #define DICT_DEFINE3 "/LOOKUP:"
! 60:
! 61: #define CURL_DEFAULT_USER "anonymous"
! 62: #define CURL_DEFAULT_PASSWORD "ftp@example.com"
! 63:
! 64: /* Convenience defines for checking protocols or their SSL based version. Each
! 65: protocol handler should only ever have a single CURLPROTO_ in its protocol
! 66: field. */
! 67: #define PROTO_FAMILY_HTTP (CURLPROTO_HTTP|CURLPROTO_HTTPS)
! 68: #define PROTO_FAMILY_FTP (CURLPROTO_FTP|CURLPROTO_FTPS)
! 69: #define PROTO_FAMILY_POP3 (CURLPROTO_POP3|CURLPROTO_POP3S)
! 70: #define PROTO_FAMILY_SMB (CURLPROTO_SMB|CURLPROTO_SMBS)
! 71: #define PROTO_FAMILY_SMTP (CURLPROTO_SMTP|CURLPROTO_SMTPS)
! 72: #define PROTO_FAMILY_SSH (CURLPROTO_SCP|CURLPROTO_SFTP)
! 73:
! 74: #define DEFAULT_CONNCACHE_SIZE 5
! 75:
! 76: /* length of longest IPv6 address string including the trailing null */
! 77: #define MAX_IPADR_LEN sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")
! 78:
! 79: /* Default FTP/IMAP etc response timeout in milliseconds.
! 80: Symbian OS panics when given a timeout much greater than 1/2 hour.
! 81: */
! 82: #define RESP_TIMEOUT (120*1000)
! 83:
! 84: /* Max string intput length is a precaution against abuse and to detect junk
! 85: input easier and better. */
! 86: #define CURL_MAX_INPUT_LENGTH 8000000
! 87:
! 88: #include "cookie.h"
! 89: #include "psl.h"
! 90: #include "formdata.h"
! 91:
! 92: #ifdef HAVE_NETINET_IN_H
! 93: #include <netinet/in.h>
! 94: #endif
! 95: #ifdef HAVE_NETINET_IN6_H
! 96: #include <netinet/in6.h>
! 97: #endif
! 98:
! 99: #include "timeval.h"
! 100:
! 101: #include <curl/curl.h>
! 102:
! 103: #include "http_chunks.h" /* for the structs and enum stuff */
! 104: #include "hostip.h"
! 105: #include "hash.h"
! 106: #include "splay.h"
! 107:
! 108: /* return the count of bytes sent, or -1 on error */
! 109: typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
! 110: int sockindex, /* socketindex */
! 111: const void *buf, /* data to write */
! 112: size_t len, /* max amount to write */
! 113: CURLcode *err); /* error to return */
! 114:
! 115: /* return the count of bytes read, or -1 on error */
! 116: typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
! 117: int sockindex, /* socketindex */
! 118: char *buf, /* store data here */
! 119: size_t len, /* max amount to read */
! 120: CURLcode *err); /* error to return */
! 121:
! 122: #include "mime.h"
! 123: #include "imap.h"
! 124: #include "pop3.h"
! 125: #include "smtp.h"
! 126: #include "ftp.h"
! 127: #include "file.h"
! 128: #include "vssh/ssh.h"
! 129: #include "http.h"
! 130: #include "rtsp.h"
! 131: #include "smb.h"
! 132: #include "mqtt.h"
! 133: #include "wildcard.h"
! 134: #include "multihandle.h"
! 135: #include "quic.h"
! 136:
! 137: #ifdef HAVE_GSSAPI
! 138: # ifdef HAVE_GSSGNU
! 139: # include <gss.h>
! 140: # elif defined HAVE_GSSAPI_GSSAPI_H
! 141: # include <gssapi/gssapi.h>
! 142: # else
! 143: # include <gssapi.h>
! 144: # endif
! 145: # ifdef HAVE_GSSAPI_GSSAPI_GENERIC_H
! 146: # include <gssapi/gssapi_generic.h>
! 147: # endif
! 148: #endif
! 149:
! 150: #ifdef HAVE_LIBSSH2_H
! 151: #include <libssh2.h>
! 152: #include <libssh2_sftp.h>
! 153: #endif /* HAVE_LIBSSH2_H */
! 154:
! 155: /* Initial size of the buffer to store headers in, it'll be enlarged in case
! 156: of need. */
! 157: #define HEADERSIZE 256
! 158:
! 159: #define CURLEASY_MAGIC_NUMBER 0xc0dedbadU
! 160: #define GOOD_EASY_HANDLE(x) \
! 161: ((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
! 162:
! 163: /* the type we use for storing a single boolean bit */
! 164: #ifdef _MSC_VER
! 165: typedef bool bit;
! 166: #define BIT(x) bool x
! 167: #else
! 168: typedef unsigned int bit;
! 169: #define BIT(x) bit x:1
! 170: #endif
! 171:
! 172: #ifdef HAVE_GSSAPI
! 173: /* Types needed for krb5-ftp connections */
! 174: struct krb5buffer {
! 175: void *data;
! 176: size_t size;
! 177: size_t index;
! 178: BIT(eof_flag);
! 179: };
! 180:
! 181: enum protection_level {
! 182: PROT_NONE, /* first in list */
! 183: PROT_CLEAR,
! 184: PROT_SAFE,
! 185: PROT_CONFIDENTIAL,
! 186: PROT_PRIVATE,
! 187: PROT_CMD,
! 188: PROT_LAST /* last in list */
! 189: };
! 190: #endif
! 191:
! 192: /* enum for the nonblocking SSL connection state machine */
! 193: typedef enum {
! 194: ssl_connect_1,
! 195: ssl_connect_2,
! 196: ssl_connect_2_reading,
! 197: ssl_connect_2_writing,
! 198: ssl_connect_3,
! 199: ssl_connect_done
! 200: } ssl_connect_state;
! 201:
! 202: typedef enum {
! 203: ssl_connection_none,
! 204: ssl_connection_negotiating,
! 205: ssl_connection_complete
! 206: } ssl_connection_state;
! 207:
! 208: /* SSL backend-specific data; declared differently by each SSL backend */
! 209: struct ssl_backend_data;
! 210:
! 211: /* struct for data related to each SSL connection */
! 212: struct ssl_connect_data {
! 213: /* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
! 214: but at least asked to or meaning to use it. See 'state' for the exact
! 215: current state of the connection. */
! 216: ssl_connection_state state;
! 217: ssl_connect_state connecting_state;
! 218: #if defined(USE_SSL)
! 219: struct ssl_backend_data *backend;
! 220: #endif
! 221: BIT(use);
! 222: };
! 223:
! 224: struct ssl_primary_config {
! 225: long version; /* what version the client wants to use */
! 226: long version_max; /* max supported version the client wants to use*/
! 227: char *CApath; /* certificate dir (doesn't work on windows) */
! 228: char *CAfile; /* certificate to verify peer against */
! 229: char *clientcert;
! 230: char *random_file; /* path to file containing "random" data */
! 231: char *egdsocket; /* path to file containing the EGD daemon socket */
! 232: char *cipher_list; /* list of ciphers to use */
! 233: char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
! 234: char *pinned_key;
! 235: BIT(verifypeer); /* set TRUE if this is desired */
! 236: BIT(verifyhost); /* set TRUE if CN/SAN must match hostname */
! 237: BIT(verifystatus); /* set TRUE if certificate status must be checked */
! 238: BIT(sessionid); /* cache session IDs or not */
! 239: };
! 240:
! 241: struct ssl_config_data {
! 242: struct ssl_primary_config primary;
! 243: long certverifyresult; /* result from the certificate verification */
! 244: char *CRLfile; /* CRL to check certificate revocation */
! 245: char *issuercert;/* optional issuer certificate filename */
! 246: curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
! 247: void *fsslctxp; /* parameter for call back */
! 248: char *cert; /* client certificate file name */
! 249: char *cert_type; /* format for certificate (default: PEM)*/
! 250: char *key; /* private key file name */
! 251: char *key_type; /* format for private key (default: PEM) */
! 252: char *key_passwd; /* plain text private key password */
! 253: #ifdef USE_TLS_SRP
! 254: char *username; /* TLS username (for, e.g., SRP) */
! 255: char *password; /* TLS password (for, e.g., SRP) */
! 256: enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
! 257: #endif
! 258: BIT(certinfo); /* gather lots of certificate info */
! 259: BIT(falsestart);
! 260: BIT(enable_beast); /* allow this flaw for interoperability's sake*/
! 261: BIT(no_revoke); /* disable SSL certificate revocation checks */
! 262: BIT(no_partialchain); /* don't accept partial certificate chains */
! 263: BIT(revoke_best_effort); /* ignore SSL revocation offline/missing revocation
! 264: list errors */
! 265: };
! 266:
! 267: struct ssl_general_config {
! 268: size_t max_ssl_sessions; /* SSL session id cache size */
! 269: };
! 270:
! 271: /* information stored about one single SSL session */
! 272: struct curl_ssl_session {
! 273: char *name; /* host name for which this ID was used */
! 274: char *conn_to_host; /* host name for the connection (may be NULL) */
! 275: const char *scheme; /* protocol scheme used */
! 276: void *sessionid; /* as returned from the SSL layer */
! 277: size_t idsize; /* if known, otherwise 0 */
! 278: long age; /* just a number, the higher the more recent */
! 279: int remote_port; /* remote port */
! 280: int conn_to_port; /* remote port for the connection (may be -1) */
! 281: struct ssl_primary_config ssl_config; /* setup for this session */
! 282: };
! 283:
! 284: #ifdef USE_WINDOWS_SSPI
! 285: #include "curl_sspi.h"
! 286: #endif
! 287:
! 288: /* Struct used for Digest challenge-response authentication */
! 289: struct digestdata {
! 290: #if defined(USE_WINDOWS_SSPI)
! 291: BYTE *input_token;
! 292: size_t input_token_len;
! 293: CtxtHandle *http_context;
! 294: /* copy of user/passwd used to make the identity for http_context.
! 295: either may be NULL. */
! 296: char *user;
! 297: char *passwd;
! 298: #else
! 299: char *nonce;
! 300: char *cnonce;
! 301: char *realm;
! 302: int algo;
! 303: char *opaque;
! 304: char *qop;
! 305: char *algorithm;
! 306: int nc; /* nounce count */
! 307: BIT(stale); /* set true for re-negotiation */
! 308: BIT(userhash);
! 309: #endif
! 310: };
! 311:
! 312: typedef enum {
! 313: NTLMSTATE_NONE,
! 314: NTLMSTATE_TYPE1,
! 315: NTLMSTATE_TYPE2,
! 316: NTLMSTATE_TYPE3,
! 317: NTLMSTATE_LAST
! 318: } curlntlm;
! 319:
! 320: typedef enum {
! 321: GSS_AUTHNONE,
! 322: GSS_AUTHRECV,
! 323: GSS_AUTHSENT,
! 324: GSS_AUTHDONE,
! 325: GSS_AUTHSUCC
! 326: } curlnegotiate;
! 327:
! 328: #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
! 329: #include <iconv.h>
! 330: #endif
! 331:
! 332: /* Struct used for GSSAPI (Kerberos V5) authentication */
! 333: #if defined(USE_KERBEROS5)
! 334: struct kerberos5data {
! 335: #if defined(USE_WINDOWS_SSPI)
! 336: CredHandle *credentials;
! 337: CtxtHandle *context;
! 338: TCHAR *spn;
! 339: SEC_WINNT_AUTH_IDENTITY identity;
! 340: SEC_WINNT_AUTH_IDENTITY *p_identity;
! 341: size_t token_max;
! 342: BYTE *output_token;
! 343: #else
! 344: gss_ctx_id_t context;
! 345: gss_name_t spn;
! 346: #endif
! 347: };
! 348: #endif
! 349:
! 350: /* Struct used for NTLM challenge-response authentication */
! 351: #if defined(USE_NTLM)
! 352: struct ntlmdata {
! 353: #ifdef USE_WINDOWS_SSPI
! 354: /* The sslContext is used for the Schannel bindings. The
! 355: * api is available on the Windows 7 SDK and later.
! 356: */
! 357: #ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
! 358: CtxtHandle *sslContext;
! 359: #endif
! 360: CredHandle *credentials;
! 361: CtxtHandle *context;
! 362: SEC_WINNT_AUTH_IDENTITY identity;
! 363: SEC_WINNT_AUTH_IDENTITY *p_identity;
! 364: size_t token_max;
! 365: BYTE *output_token;
! 366: BYTE *input_token;
! 367: size_t input_token_len;
! 368: TCHAR *spn;
! 369: #else
! 370: unsigned int flags;
! 371: unsigned char nonce[8];
! 372: void *target_info; /* TargetInfo received in the ntlm type-2 message */
! 373: unsigned int target_info_len;
! 374:
! 375: #if defined(NTLM_WB_ENABLED)
! 376: /* used for communication with Samba's winbind daemon helper ntlm_auth */
! 377: curl_socket_t ntlm_auth_hlpr_socket;
! 378: pid_t ntlm_auth_hlpr_pid;
! 379: char *challenge; /* The received base64 encoded ntlm type-2 message */
! 380: char *response; /* The generated base64 ntlm type-1/type-3 message */
! 381: #endif
! 382: #endif
! 383: };
! 384: #endif
! 385:
! 386: /* Struct used for Negotiate (SPNEGO) authentication */
! 387: #ifdef USE_SPNEGO
! 388: struct negotiatedata {
! 389: #ifdef HAVE_GSSAPI
! 390: OM_uint32 status;
! 391: gss_ctx_id_t context;
! 392: gss_name_t spn;
! 393: gss_buffer_desc output_token;
! 394: #else
! 395: #ifdef USE_WINDOWS_SSPI
! 396: #ifdef SECPKG_ATTR_ENDPOINT_BINDINGS
! 397: CtxtHandle *sslContext;
! 398: #endif
! 399: DWORD status;
! 400: CredHandle *credentials;
! 401: CtxtHandle *context;
! 402: SEC_WINNT_AUTH_IDENTITY identity;
! 403: SEC_WINNT_AUTH_IDENTITY *p_identity;
! 404: TCHAR *spn;
! 405: size_t token_max;
! 406: BYTE *output_token;
! 407: size_t output_token_length;
! 408: #endif
! 409: #endif
! 410: BIT(noauthpersist);
! 411: BIT(havenoauthpersist);
! 412: BIT(havenegdata);
! 413: BIT(havemultiplerequests);
! 414: };
! 415: #endif
! 416:
! 417:
! 418: /*
! 419: * Boolean values that concerns this connection.
! 420: */
! 421: struct ConnectBits {
! 422: /* always modify bits.close with the connclose() and connkeep() macros! */
! 423: bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
! 424: is complete */
! 425: bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
! 426: the first time on the first connect function call */
! 427: BIT(close); /* if set, we close the connection after this request */
! 428: BIT(reuse); /* if set, this is a re-used connection */
! 429: BIT(altused); /* this is an alt-svc "redirect" */
! 430: BIT(conn_to_host); /* if set, this connection has a "connect to host"
! 431: that overrides the host in the URL */
! 432: BIT(conn_to_port); /* if set, this connection has a "connect to port"
! 433: that overrides the port in the URL (remote port) */
! 434: BIT(proxy); /* if set, this transfer is done through a proxy - any type */
! 435: BIT(httpproxy); /* if set, this transfer is done through a http proxy */
! 436: BIT(socksproxy); /* if set, this transfer is done through a socks proxy */
! 437: BIT(user_passwd); /* do we use user+password for this connection? */
! 438: BIT(proxy_user_passwd); /* user+password for the proxy? */
! 439: BIT(ipv6_ip); /* we communicate with a remote site specified with pure IPv6
! 440: IP address */
! 441: BIT(ipv6); /* we communicate with a site using an IPv6 address */
! 442: BIT(do_more); /* this is set TRUE if the ->curl_do_more() function is
! 443: supposed to be called, after ->curl_do() */
! 444: BIT(protoconnstart);/* the protocol layer has STARTED its operation after
! 445: the TCP layer connect */
! 446: BIT(retry); /* this connection is about to get closed and then
! 447: re-attempted at another connection. */
! 448: BIT(tunnel_proxy); /* if CONNECT is used to "tunnel" through the proxy.
! 449: This is implicit when SSL-protocols are used through
! 450: proxies, but can also be enabled explicitly by
! 451: apps */
! 452: BIT(authneg); /* TRUE when the auth phase has started, which means
! 453: that we are creating a request with an auth header,
! 454: but it is not the final request in the auth
! 455: negotiation. */
! 456: BIT(rewindaftersend);/* TRUE when the sending couldn't be stopped even
! 457: though it will be discarded. When the whole send
! 458: operation is done, we must call the data rewind
! 459: callback. */
! 460: #ifndef CURL_DISABLE_FTP
! 461: BIT(ftp_use_epsv); /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
! 462: EPSV doesn't work we disable it for the forthcoming
! 463: requests */
! 464: BIT(ftp_use_eprt); /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
! 465: EPRT doesn't work we disable it for the forthcoming
! 466: requests */
! 467: BIT(ftp_use_data_ssl); /* Enabled SSL for the data connection */
! 468: #endif
! 469: BIT(netrc); /* name+password provided by netrc */
! 470: BIT(userpwd_in_url); /* name+password found in url */
! 471: BIT(proxy_connect_closed); /* TRUE if a proxy disconnected the connection
! 472: in a CONNECT request with auth, so that
! 473: libcurl should reconnect and continue. */
! 474: BIT(bound); /* set true if bind() has already been done on this socket/
! 475: connection */
! 476: BIT(type_set); /* type= was used in the URL */
! 477: BIT(multiplex); /* connection is multiplexed */
! 478: BIT(tcp_fastopen); /* use TCP Fast Open */
! 479: BIT(tls_enable_npn); /* TLS NPN extension? */
! 480: BIT(tls_enable_alpn); /* TLS ALPN extension? */
! 481: BIT(connect_only);
! 482: };
! 483:
! 484: struct hostname {
! 485: char *rawalloc; /* allocated "raw" version of the name */
! 486: char *encalloc; /* allocated IDN-encoded version of the name */
! 487: char *name; /* name to use internally, might be encoded, might be raw */
! 488: const char *dispname; /* name to display, as 'name' might be encoded */
! 489: };
! 490:
! 491: /*
! 492: * Flags on the keepon member of the Curl_transfer_keeper
! 493: */
! 494:
! 495: #define KEEP_NONE 0
! 496: #define KEEP_RECV (1<<0) /* there is or may be data to read */
! 497: #define KEEP_SEND (1<<1) /* there is or may be data to write */
! 498: #define KEEP_RECV_HOLD (1<<2) /* when set, no reading should be done but there
! 499: might still be data to read */
! 500: #define KEEP_SEND_HOLD (1<<3) /* when set, no writing should be done but there
! 501: might still be data to write */
! 502: #define KEEP_RECV_PAUSE (1<<4) /* reading is paused */
! 503: #define KEEP_SEND_PAUSE (1<<5) /* writing is paused */
! 504:
! 505: #define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE)
! 506: #define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
! 507:
! 508: struct Curl_async {
! 509: char *hostname;
! 510: int port;
! 511: struct Curl_dns_entry *dns;
! 512: int status; /* if done is TRUE, this is the status from the callback */
! 513: void *os_specific; /* 'struct thread_data' for Windows */
! 514: BIT(done); /* set TRUE when the lookup is complete */
! 515: };
! 516:
! 517: #define FIRSTSOCKET 0
! 518: #define SECONDARYSOCKET 1
! 519:
! 520: /* These function pointer types are here only to allow easier typecasting
! 521: within the source when we need to cast between data pointers (such as NULL)
! 522: and function pointers. */
! 523: typedef CURLcode (*Curl_do_more_func)(struct connectdata *, int *);
! 524: typedef CURLcode (*Curl_done_func)(struct connectdata *, CURLcode, bool);
! 525:
! 526: enum expect100 {
! 527: EXP100_SEND_DATA, /* enough waiting, just send the body now */
! 528: EXP100_AWAITING_CONTINUE, /* waiting for the 100 Continue header */
! 529: EXP100_SENDING_REQUEST, /* still sending the request but will wait for
! 530: the 100 header once done with the request */
! 531: EXP100_FAILED /* used on 417 Expectation Failed */
! 532: };
! 533:
! 534: enum upgrade101 {
! 535: UPGR101_INIT, /* default state */
! 536: UPGR101_REQUESTED, /* upgrade requested */
! 537: UPGR101_RECEIVED, /* response received */
! 538: UPGR101_WORKING /* talking upgraded protocol */
! 539: };
! 540:
! 541: enum doh_slots {
! 542: /* Explicit values for first two symbols so as to match hard-coded
! 543: * constants in existing code
! 544: */
! 545: DOH_PROBE_SLOT_IPADDR_V4 = 0, /* make 'V4' stand out for readability */
! 546: DOH_PROBE_SLOT_IPADDR_V6 = 1, /* 'V6' likewise */
! 547:
! 548: /* Space here for (possibly build-specific) additional slot definitions */
! 549:
! 550: /* for example */
! 551: /* #ifdef WANT_DOH_FOOBAR_TXT */
! 552: /* DOH_PROBE_SLOT_FOOBAR_TXT, */
! 553: /* #endif */
! 554:
! 555: /* AFTER all slot definitions, establish how many we have */
! 556: DOH_PROBE_SLOTS
! 557: };
! 558:
! 559: struct dohresponse {
! 560: unsigned char *memory;
! 561: size_t size;
! 562: };
! 563:
! 564: /* one of these for each DoH request */
! 565: struct dnsprobe {
! 566: CURL *easy;
! 567: int dnstype;
! 568: unsigned char dohbuffer[512];
! 569: size_t dohlen;
! 570: struct dohresponse serverdoh;
! 571: };
! 572:
! 573: struct dohdata {
! 574: struct curl_slist *headers;
! 575: struct dnsprobe probe[DOH_PROBE_SLOTS];
! 576: unsigned int pending; /* still outstanding requests */
! 577: const char *host;
! 578: int port;
! 579: };
! 580:
! 581: /*
! 582: * Request specific data in the easy handle (Curl_easy). Previously,
! 583: * these members were on the connectdata struct but since a conn struct may
! 584: * now be shared between different Curl_easys, we store connection-specific
! 585: * data here. This struct only keeps stuff that's interesting for *this*
! 586: * request, as it will be cleared between multiple ones
! 587: */
! 588: struct SingleRequest {
! 589: curl_off_t size; /* -1 if unknown at this point */
! 590: curl_off_t maxdownload; /* in bytes, the maximum amount of data to fetch,
! 591: -1 means unlimited */
! 592: curl_off_t bytecount; /* total number of bytes read */
! 593: curl_off_t writebytecount; /* number of bytes written */
! 594:
! 595: curl_off_t headerbytecount; /* only count received headers */
! 596: curl_off_t deductheadercount; /* this amount of bytes doesn't count when we
! 597: check if anything has been transferred at
! 598: the end of a connection. We use this
! 599: counter to make only a 100 reply (without a
! 600: following second response code) result in a
! 601: CURLE_GOT_NOTHING error code */
! 602:
! 603: struct curltime start; /* transfer started at this time */
! 604: struct curltime now; /* current time */
! 605: enum {
! 606: HEADER_NORMAL, /* no bad header at all */
! 607: HEADER_PARTHEADER, /* part of the chunk is a bad header, the rest
! 608: is normal data */
! 609: HEADER_ALLBAD /* all was believed to be header */
! 610: } badheader; /* the header was deemed bad and will be
! 611: written as body */
! 612: int headerline; /* counts header lines to better track the
! 613: first one */
! 614: char *hbufp; /* points at *end* of header line */
! 615: size_t hbuflen;
! 616: char *str; /* within buf */
! 617: char *str_start; /* within buf */
! 618: char *end_ptr; /* within buf */
! 619: char *p; /* within headerbuff */
! 620: curl_off_t offset; /* possible resume offset read from the
! 621: Content-Range: header */
! 622: int httpcode; /* error code from the 'HTTP/1.? XXX' or
! 623: 'RTSP/1.? XXX' line */
! 624: struct curltime start100; /* time stamp to wait for the 100 code from */
! 625: enum expect100 exp100; /* expect 100 continue state */
! 626: enum upgrade101 upgr101; /* 101 upgrade state */
! 627:
! 628: struct contenc_writer_s *writer_stack; /* Content unencoding stack. */
! 629: /* See sec 3.5, RFC2616. */
! 630: time_t timeofdoc;
! 631: long bodywrites;
! 632: char *buf;
! 633: int keepon;
! 634: char *location; /* This points to an allocated version of the Location:
! 635: header data */
! 636: char *newurl; /* Set to the new URL to use when a redirect or a retry is
! 637: wanted */
! 638:
! 639: /* 'upload_present' is used to keep a byte counter of how much data there is
! 640: still left in the buffer, aimed for upload. */
! 641: ssize_t upload_present;
! 642:
! 643: /* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
! 644: buffer, so the next read should read from where this pointer points to,
! 645: and the 'upload_present' contains the number of bytes available at this
! 646: position */
! 647: char *upload_fromhere;
! 648: void *protop; /* Allocated protocol-specific data. Each protocol
! 649: handler makes sure this points to data it needs. */
! 650: #ifndef CURL_DISABLE_DOH
! 651: struct dohdata doh; /* DoH specific data for this request */
! 652: #endif
! 653: BIT(header); /* incoming data has HTTP header */
! 654: BIT(content_range); /* set TRUE if Content-Range: was found */
! 655: BIT(upload_done); /* set to TRUE when doing chunked transfer-encoding
! 656: upload and we're uploading the last chunk */
! 657: BIT(ignorebody); /* we read a response-body but we ignore it! */
! 658: BIT(http_bodyless); /* HTTP response status code is between 100 and 199,
! 659: 204 or 304 */
! 660: BIT(chunk); /* if set, this is a chunked transfer-encoding */
! 661: BIT(upload_chunky); /* set TRUE if we are doing chunked transfer-encoding
! 662: on upload */
! 663: BIT(getheader); /* TRUE if header parsing is wanted */
! 664: BIT(forbidchunk); /* used only to explicitly forbid chunk-upload for
! 665: specific upload buffers. See readmoredata() in http.c
! 666: for details. */
! 667: };
! 668:
! 669: /*
! 670: * Specific protocol handler.
! 671: */
! 672:
! 673: struct Curl_handler {
! 674: const char *scheme; /* URL scheme name. */
! 675:
! 676: /* Complement to setup_connection_internals(). */
! 677: CURLcode (*setup_connection)(struct connectdata *);
! 678:
! 679: /* These two functions MUST be set to be protocol dependent */
! 680: CURLcode (*do_it)(struct connectdata *, bool *done);
! 681: Curl_done_func done;
! 682:
! 683: /* If the curl_do() function is better made in two halves, this
! 684: * curl_do_more() function will be called afterwards, if set. For example
! 685: * for doing the FTP stuff after the PASV/PORT command.
! 686: */
! 687: Curl_do_more_func do_more;
! 688:
! 689: /* This function *MAY* be set to a protocol-dependent function that is run
! 690: * after the connect() and everything is done, as a step in the connection.
! 691: * The 'done' pointer points to a bool that should be set to TRUE if the
! 692: * function completes before return. If it doesn't complete, the caller
! 693: * should call the curl_connecting() function until it is.
! 694: */
! 695: CURLcode (*connect_it)(struct connectdata *, bool *done);
! 696:
! 697: /* See above. */
! 698: CURLcode (*connecting)(struct connectdata *, bool *done);
! 699: CURLcode (*doing)(struct connectdata *, bool *done);
! 700:
! 701: /* Called from the multi interface during the PROTOCONNECT phase, and it
! 702: should then return a proper fd set */
! 703: int (*proto_getsock)(struct connectdata *conn,
! 704: curl_socket_t *socks);
! 705:
! 706: /* Called from the multi interface during the DOING phase, and it should
! 707: then return a proper fd set */
! 708: int (*doing_getsock)(struct connectdata *conn,
! 709: curl_socket_t *socks);
! 710:
! 711: /* Called from the multi interface during the DO_MORE phase, and it should
! 712: then return a proper fd set */
! 713: int (*domore_getsock)(struct connectdata *conn,
! 714: curl_socket_t *socks);
! 715:
! 716: /* Called from the multi interface during the DO_DONE, PERFORM and
! 717: WAITPERFORM phases, and it should then return a proper fd set. Not setting
! 718: this will make libcurl use the generic default one. */
! 719: int (*perform_getsock)(const struct connectdata *conn,
! 720: curl_socket_t *socks);
! 721:
! 722: /* This function *MAY* be set to a protocol-dependent function that is run
! 723: * by the curl_disconnect(), as a step in the disconnection. If the handler
! 724: * is called because the connection has been considered dead, dead_connection
! 725: * is set to TRUE.
! 726: */
! 727: CURLcode (*disconnect)(struct connectdata *, bool dead_connection);
! 728:
! 729: /* If used, this function gets called from transfer.c:readwrite_data() to
! 730: allow the protocol to do extra reads/writes */
! 731: CURLcode (*readwrite)(struct Curl_easy *data, struct connectdata *conn,
! 732: ssize_t *nread, bool *readmore);
! 733:
! 734: /* This function can perform various checks on the connection. See
! 735: CONNCHECK_* for more information about the checks that can be performed,
! 736: and CONNRESULT_* for the results that can be returned. */
! 737: unsigned int (*connection_check)(struct connectdata *conn,
! 738: unsigned int checks_to_perform);
! 739:
! 740: long defport; /* Default port. */
! 741: unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
! 742: specific protocol bit */
! 743: unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
! 744: };
! 745:
! 746: #define PROTOPT_NONE 0 /* nothing extra */
! 747: #define PROTOPT_SSL (1<<0) /* uses SSL */
! 748: #define PROTOPT_DUAL (1<<1) /* this protocol uses two connections */
! 749: #define PROTOPT_CLOSEACTION (1<<2) /* need action before socket close */
! 750: /* some protocols will have to call the underlying functions without regard to
! 751: what exact state the socket signals. IE even if the socket says "readable",
! 752: the send function might need to be called while uploading, or vice versa.
! 753: */
! 754: #define PROTOPT_DIRLOCK (1<<3)
! 755: #define PROTOPT_NONETWORK (1<<4) /* protocol doesn't use the network! */
! 756: #define PROTOPT_NEEDSPWD (1<<5) /* needs a password, and if none is set it
! 757: gets a default */
! 758: #define PROTOPT_NOURLQUERY (1<<6) /* protocol can't handle
! 759: url query strings (?foo=bar) ! */
! 760: #define PROTOPT_CREDSPERREQUEST (1<<7) /* requires login credentials per
! 761: request instead of per connection */
! 762: #define PROTOPT_ALPN_NPN (1<<8) /* set ALPN and/or NPN for this */
! 763: #define PROTOPT_STREAM (1<<9) /* a protocol with individual logical streams */
! 764: #define PROTOPT_URLOPTIONS (1<<10) /* allow options part in the userinfo field
! 765: of the URL */
! 766: #define PROTOPT_PROXY_AS_HTTP (1<<11) /* allow this non-HTTP scheme over a
! 767: HTTP proxy as HTTP proxies may know
! 768: this protocol and act as a gateway */
! 769: #define PROTOPT_WILDCARD (1<<12) /* protocol supports wildcard matching */
! 770:
! 771: #define CONNCHECK_NONE 0 /* No checks */
! 772: #define CONNCHECK_ISDEAD (1<<0) /* Check if the connection is dead. */
! 773: #define CONNCHECK_KEEPALIVE (1<<1) /* Perform any keepalive function. */
! 774:
! 775: #define CONNRESULT_NONE 0 /* No extra information. */
! 776: #define CONNRESULT_DEAD (1<<0) /* The connection is dead. */
! 777:
! 778: #ifdef USE_RECV_BEFORE_SEND_WORKAROUND
! 779: struct postponed_data {
! 780: char *buffer; /* Temporal store for received data during
! 781: sending, must be freed */
! 782: size_t allocated_size; /* Size of temporal store */
! 783: size_t recv_size; /* Size of received data during sending */
! 784: size_t recv_processed; /* Size of processed part of postponed data */
! 785: #ifdef DEBUGBUILD
! 786: curl_socket_t bindsock;/* Structure must be bound to specific socket,
! 787: used only for DEBUGASSERT */
! 788: #endif /* DEBUGBUILD */
! 789: };
! 790: #endif /* USE_RECV_BEFORE_SEND_WORKAROUND */
! 791:
! 792: struct proxy_info {
! 793: struct hostname host;
! 794: long port;
! 795: curl_proxytype proxytype; /* what kind of proxy that is in use */
! 796: char *user; /* proxy user name string, allocated */
! 797: char *passwd; /* proxy password string, allocated */
! 798: };
! 799:
! 800: #define CONNECT_BUFFER_SIZE 16384
! 801:
! 802: /* struct for HTTP CONNECT state data */
! 803: struct http_connect_state {
! 804: char connect_buffer[CONNECT_BUFFER_SIZE];
! 805: int perline; /* count bytes per line */
! 806: int keepon;
! 807: char *line_start;
! 808: char *ptr; /* where to store more data */
! 809: curl_off_t cl; /* size of content to read and ignore */
! 810: enum {
! 811: TUNNEL_INIT, /* init/default/no tunnel state */
! 812: TUNNEL_CONNECT, /* CONNECT has been sent off */
! 813: TUNNEL_COMPLETE /* CONNECT response received completely */
! 814: } tunnel_state;
! 815: BIT(chunked_encoding);
! 816: BIT(close_connection);
! 817: };
! 818:
! 819: struct ldapconninfo;
! 820:
! 821: /* for the (SOCKS) connect state machine */
! 822: enum connect_t {
! 823: CONNECT_INIT,
! 824: CONNECT_SOCKS_INIT, /* 1 */
! 825: CONNECT_SOCKS_SEND, /* 2 waiting to send more first data */
! 826: CONNECT_SOCKS_READ_INIT, /* 3 set up read */
! 827: CONNECT_SOCKS_READ, /* 4 read server response */
! 828: CONNECT_GSSAPI_INIT, /* 5 */
! 829: CONNECT_AUTH_INIT, /* 6 setup outgoing auth buffer */
! 830: CONNECT_AUTH_SEND, /* 7 send auth */
! 831: CONNECT_AUTH_READ, /* 8 read auth response */
! 832: CONNECT_REQ_INIT, /* 9 init SOCKS "request" */
! 833: CONNECT_RESOLVING, /* 10 */
! 834: CONNECT_RESOLVED, /* 11 */
! 835: CONNECT_RESOLVE_REMOTE, /* 12 */
! 836: CONNECT_REQ_SEND, /* 13 */
! 837: CONNECT_REQ_SENDING, /* 14 */
! 838: CONNECT_REQ_READ, /* 15 */
! 839: CONNECT_REQ_READ_MORE, /* 16 */
! 840: CONNECT_DONE /* 17 connected fine to the remote or the SOCKS proxy */
! 841: };
! 842:
! 843: #define SOCKS_STATE(x) (((x) >= CONNECT_SOCKS_INIT) && \
! 844: ((x) < CONNECT_DONE))
! 845: #define SOCKS_REQUEST_BUFSIZE 600 /* room for large user/pw (255 max each) */
! 846:
! 847: struct connstate {
! 848: enum connect_t state;
! 849: unsigned char socksreq[SOCKS_REQUEST_BUFSIZE];
! 850:
! 851: /* CONNECT_SOCKS_SEND */
! 852: ssize_t outstanding; /* send this many bytes more */
! 853: unsigned char *outp; /* send from this pointer */
! 854: };
! 855:
! 856: /*
! 857: * The connectdata struct contains all fields and variables that should be
! 858: * unique for an entire connection.
! 859: */
! 860: struct connectdata {
! 861: /* 'data' is the CURRENT Curl_easy using this connection -- take great
! 862: caution that this might very well vary between different times this
! 863: connection is used! */
! 864: struct Curl_easy *data;
! 865: struct connstate cnnct;
! 866: struct curl_llist_element bundle_node; /* conncache */
! 867:
! 868: /* chunk is for HTTP chunked encoding, but is in the general connectdata
! 869: struct only because we can do just about any protocol through a HTTP proxy
! 870: and a HTTP proxy may in fact respond using chunked encoding */
! 871: struct Curl_chunker chunk;
! 872:
! 873: curl_closesocket_callback fclosesocket; /* function closing the socket(s) */
! 874: void *closesocket_client;
! 875:
! 876: /* This is used by the connection cache logic. If this returns TRUE, this
! 877: handle is still used by one or more easy handles and can only used by any
! 878: other easy handle without careful consideration (== only for
! 879: multiplexing) and it cannot be used by another multi handle! */
! 880: #define CONN_INUSE(c) ((c)->easyq.size)
! 881:
! 882: /**** Fields set when inited and not modified again */
! 883: long connection_id; /* Contains a unique number to make it easier to
! 884: track the connections in the log output */
! 885:
! 886: /* 'dns_entry' is the particular host we use. This points to an entry in the
! 887: DNS cache and it will not get pruned while locked. It gets unlocked in
! 888: Curl_done(). This entry will be NULL if the connection is re-used as then
! 889: there is no name resolve done. */
! 890: struct Curl_dns_entry *dns_entry;
! 891:
! 892: /* 'ip_addr' is the particular IP we connected to. It points to a struct
! 893: within the DNS cache, so this pointer is only valid as long as the DNS
! 894: cache entry remains locked. It gets unlocked in Curl_done() */
! 895: Curl_addrinfo *ip_addr;
! 896: Curl_addrinfo *tempaddr[2]; /* for happy eyeballs */
! 897:
! 898: /* 'ip_addr_str' is the ip_addr data as a human readable string.
! 899: It remains available as long as the connection does, which is longer than
! 900: the ip_addr itself. */
! 901: char ip_addr_str[MAX_IPADR_LEN];
! 902:
! 903: unsigned int scope_id; /* Scope id for IPv6 */
! 904:
! 905: enum {
! 906: TRNSPRT_TCP = 3,
! 907: TRNSPRT_UDP = 4,
! 908: TRNSPRT_QUIC = 5
! 909: } transport;
! 910:
! 911: #ifdef ENABLE_QUIC
! 912: struct quicsocket hequic[2]; /* two, for happy eyeballs! */
! 913: struct quicsocket *quic;
! 914: #endif
! 915:
! 916: struct hostname host;
! 917: char *hostname_resolve; /* host name to resolve to address, allocated */
! 918: char *secondaryhostname; /* secondary socket host name (ftp) */
! 919: struct hostname conn_to_host; /* the host to connect to. valid only if
! 920: bits.conn_to_host is set */
! 921:
! 922: struct proxy_info socks_proxy;
! 923: struct proxy_info http_proxy;
! 924:
! 925: long port; /* which port to use locally */
! 926: int remote_port; /* the remote port, not the proxy port! */
! 927: int conn_to_port; /* the remote port to connect to. valid only if
! 928: bits.conn_to_port is set */
! 929: unsigned short secondary_port; /* secondary socket remote port to connect to
! 930: (ftp) */
! 931:
! 932: /* 'primary_ip' and 'primary_port' get filled with peer's numerical
! 933: ip address and port number whenever an outgoing connection is
! 934: *attempted* from the primary socket to a remote address. When more
! 935: than one address is tried for a connection these will hold data
! 936: for the last attempt. When the connection is actually established
! 937: these are updated with data which comes directly from the socket. */
! 938:
! 939: char primary_ip[MAX_IPADR_LEN];
! 940: long primary_port;
! 941:
! 942: /* 'local_ip' and 'local_port' get filled with local's numerical
! 943: ip address and port number whenever an outgoing connection is
! 944: **established** from the primary socket to a remote address. */
! 945:
! 946: char local_ip[MAX_IPADR_LEN];
! 947: long local_port;
! 948:
! 949: char *user; /* user name string, allocated */
! 950: char *passwd; /* password string, allocated */
! 951: char *options; /* options string, allocated */
! 952:
! 953: char *sasl_authzid; /* authorisation identity string, allocated */
! 954:
! 955: int httpversion; /* the HTTP version*10 reported by the server */
! 956: int rtspversion; /* the RTSP version*10 reported by the server */
! 957:
! 958: struct curltime now; /* "current" time */
! 959: struct curltime created; /* creation time */
! 960: struct curltime lastused; /* when returned to the connection cache */
! 961: curl_socket_t sock[2]; /* two sockets, the second is used for the data
! 962: transfer when doing FTP */
! 963: curl_socket_t tempsock[2]; /* temporary sockets for happy eyeballs */
! 964: int tempfamily[2]; /* family used for the temp sockets */
! 965: Curl_recv *recv[2];
! 966: Curl_send *send[2];
! 967:
! 968: #ifdef USE_RECV_BEFORE_SEND_WORKAROUND
! 969: struct postponed_data postponed[2]; /* two buffers for two sockets */
! 970: #endif /* USE_RECV_BEFORE_SEND_WORKAROUND */
! 971: struct ssl_connect_data ssl[2]; /* this is for ssl-stuff */
! 972: struct ssl_connect_data proxy_ssl[2]; /* this is for proxy ssl-stuff */
! 973: #ifdef USE_SSL
! 974: void *ssl_extra; /* separately allocated backend-specific data */
! 975: #endif
! 976: struct ssl_primary_config ssl_config;
! 977: struct ssl_primary_config proxy_ssl_config;
! 978: struct ConnectBits bits; /* various state-flags for this connection */
! 979:
! 980: /* connecttime: when connect() is called on the current IP address. Used to
! 981: be able to track when to move on to try next IP - but only when the multi
! 982: interface is used. */
! 983: struct curltime connecttime;
! 984: /* The two fields below get set in Curl_connecthost */
! 985: int num_addr; /* number of addresses to try to connect to */
! 986: timediff_t timeoutms_per_addr; /* how long time in milliseconds to spend on
! 987: trying to connect to each IP address */
! 988:
! 989: const struct Curl_handler *handler; /* Connection's protocol handler */
! 990: const struct Curl_handler *given; /* The protocol first given */
! 991:
! 992: long ip_version; /* copied from the Curl_easy at creation time */
! 993:
! 994: /* Protocols can use a custom keepalive mechanism to keep connections alive.
! 995: This allows those protocols to track the last time the keepalive mechanism
! 996: was used on this connection. */
! 997: struct curltime keepalive;
! 998:
! 999: long upkeep_interval_ms; /* Time between calls for connection upkeep. */
! 1000:
! 1001: /**** curl_get() phase fields */
! 1002:
! 1003: curl_socket_t sockfd; /* socket to read from or CURL_SOCKET_BAD */
! 1004: curl_socket_t writesockfd; /* socket to write to, it may very
! 1005: well be the same we read from.
! 1006: CURL_SOCKET_BAD disables */
! 1007:
! 1008: /** Dynamically allocated strings, MUST be freed before this **/
! 1009: /** struct is killed. **/
! 1010: struct dynamically_allocated_data {
! 1011: char *proxyuserpwd;
! 1012: char *uagent;
! 1013: char *accept_encoding;
! 1014: char *userpwd;
! 1015: char *rangeline;
! 1016: char *ref;
! 1017: char *host;
! 1018: char *cookiehost;
! 1019: char *rtsp_transport;
! 1020: char *te; /* TE: request header */
! 1021: } allocptr;
! 1022:
! 1023: #ifdef HAVE_GSSAPI
! 1024: BIT(sec_complete); /* if Kerberos is enabled for this connection */
! 1025: enum protection_level command_prot;
! 1026: enum protection_level data_prot;
! 1027: enum protection_level request_data_prot;
! 1028: size_t buffer_size;
! 1029: struct krb5buffer in_buffer;
! 1030: void *app_data;
! 1031: const struct Curl_sec_client_mech *mech;
! 1032: struct sockaddr_in local_addr;
! 1033: #endif
! 1034:
! 1035: #if defined(USE_KERBEROS5) /* Consider moving some of the above GSS-API */
! 1036: struct kerberos5data krb5; /* variables into the structure definition, */
! 1037: #endif /* however, some of them are ftp specific. */
! 1038:
! 1039: struct curl_llist easyq; /* List of easy handles using this connection */
! 1040: curl_seek_callback seek_func; /* function that seeks the input */
! 1041: void *seek_client; /* pointer to pass to the seek() above */
! 1042:
! 1043: /*************** Request - specific items ************/
! 1044: #if defined(USE_WINDOWS_SSPI) && defined(SECPKG_ATTR_ENDPOINT_BINDINGS)
! 1045: CtxtHandle *sslContext;
! 1046: #endif
! 1047:
! 1048: #if defined(USE_NTLM)
! 1049: curlntlm http_ntlm_state;
! 1050: curlntlm proxy_ntlm_state;
! 1051:
! 1052: struct ntlmdata ntlm; /* NTLM differs from other authentication schemes
! 1053: because it authenticates connections, not
! 1054: single requests! */
! 1055: struct ntlmdata proxyntlm; /* NTLM data for proxy */
! 1056: #endif
! 1057:
! 1058: #ifdef USE_SPNEGO
! 1059: curlnegotiate http_negotiate_state;
! 1060: curlnegotiate proxy_negotiate_state;
! 1061:
! 1062: struct negotiatedata negotiate; /* state data for host Negotiate auth */
! 1063: struct negotiatedata proxyneg; /* state data for proxy Negotiate auth */
! 1064: #endif
! 1065:
! 1066: /* data used for the asynch name resolve callback */
! 1067: struct Curl_async async;
! 1068:
! 1069: /* These three are used for chunked-encoding trailer support */
! 1070: char *trailer; /* allocated buffer to store trailer in */
! 1071: int trlMax; /* allocated buffer size */
! 1072: int trlPos; /* index of where to store data */
! 1073:
! 1074: union {
! 1075: struct ftp_conn ftpc;
! 1076: struct http_conn httpc;
! 1077: struct ssh_conn sshc;
! 1078: struct tftp_state_data *tftpc;
! 1079: struct imap_conn imapc;
! 1080: struct pop3_conn pop3c;
! 1081: struct smtp_conn smtpc;
! 1082: struct rtsp_conn rtspc;
! 1083: struct smb_conn smbc;
! 1084: void *rtmp;
! 1085: struct ldapconninfo *ldapc;
! 1086: struct mqtt_conn mqtt;
! 1087: } proto;
! 1088:
! 1089: int cselect_bits; /* bitmask of socket events */
! 1090: int waitfor; /* current READ/WRITE bits to wait for */
! 1091:
! 1092: #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
! 1093: int socks5_gssapi_enctype;
! 1094: #endif
! 1095:
! 1096: /* When this connection is created, store the conditions for the local end
! 1097: bind. This is stored before the actual bind and before any connection is
! 1098: made and will serve the purpose of being used for comparison reasons so
! 1099: that subsequent bound-requested connections aren't accidentally re-using
! 1100: wrong connections. */
! 1101: char *localdev;
! 1102: unsigned short localport;
! 1103: int localportrange;
! 1104: struct http_connect_state *connect_state; /* for HTTP CONNECT */
! 1105: struct connectbundle *bundle; /* The bundle we are member of */
! 1106: int negnpn; /* APLN or NPN TLS negotiated protocol, CURL_HTTP_VERSION* */
! 1107: int retrycount; /* number of retries on a new connection */
! 1108: #ifdef USE_UNIX_SOCKETS
! 1109: char *unix_domain_socket;
! 1110: BIT(abstract_unix_socket);
! 1111: #endif
! 1112: BIT(tls_upgraded);
! 1113: /* the two following *_inuse fields are only flags, not counters in any way.
! 1114: If TRUE it means the channel is in use, and if FALSE it means the channel
! 1115: is up for grabs by one. */
! 1116: BIT(readchannel_inuse); /* whether the read channel is in use by an easy
! 1117: handle */
! 1118: BIT(writechannel_inuse); /* whether the write channel is in use by an easy
! 1119: handle */
! 1120: BIT(sock_accepted); /* TRUE if the SECONDARYSOCKET was created with
! 1121: accept() */
! 1122: BIT(parallel_connect); /* set TRUE when a parallel connect attempt has
! 1123: started (happy eyeballs) */
! 1124: };
! 1125:
! 1126: /* The end of connectdata. */
! 1127:
! 1128: /*
! 1129: * Struct to keep statistical and informational data.
! 1130: * All variables in this struct must be initialized/reset in Curl_initinfo().
! 1131: */
! 1132: struct PureInfo {
! 1133: int httpcode; /* Recent HTTP, FTP, RTSP or SMTP response code */
! 1134: int httpproxycode; /* response code from proxy when received separate */
! 1135: int httpversion; /* the http version number X.Y = X*10+Y */
! 1136: time_t filetime; /* If requested, this is might get set. Set to -1 if the
! 1137: time was unretrievable. */
! 1138: curl_off_t header_size; /* size of read header(s) in bytes */
! 1139: curl_off_t request_size; /* the amount of bytes sent in the request(s) */
! 1140: unsigned long proxyauthavail; /* what proxy auth types were announced */
! 1141: unsigned long httpauthavail; /* what host auth types were announced */
! 1142: long numconnects; /* how many new connection did libcurl created */
! 1143: char *contenttype; /* the content type of the object */
! 1144: char *wouldredirect; /* URL this would've been redirected to if asked to */
! 1145: curl_off_t retry_after; /* info from Retry-After: header */
! 1146:
! 1147: /* PureInfo members 'conn_primary_ip', 'conn_primary_port', 'conn_local_ip'
! 1148: and, 'conn_local_port' are copied over from the connectdata struct in
! 1149: order to allow curl_easy_getinfo() to return this information even when
! 1150: the session handle is no longer associated with a connection, and also
! 1151: allow curl_easy_reset() to clear this information from the session handle
! 1152: without disturbing information which is still alive, and that might be
! 1153: reused, in the connection cache. */
! 1154:
! 1155: char conn_primary_ip[MAX_IPADR_LEN];
! 1156: long conn_primary_port;
! 1157: char conn_local_ip[MAX_IPADR_LEN];
! 1158: long conn_local_port;
! 1159: const char *conn_scheme;
! 1160: unsigned int conn_protocol;
! 1161: struct curl_certinfo certs; /* info about the certs, only populated in
! 1162: OpenSSL, GnuTLS, Schannel, NSS and GSKit
! 1163: builds. Asked for with CURLOPT_CERTINFO
! 1164: / CURLINFO_CERTINFO */
! 1165: BIT(timecond); /* set to TRUE if the time condition didn't match, which
! 1166: thus made the document NOT get fetched */
! 1167: };
! 1168:
! 1169:
! 1170: struct Progress {
! 1171: time_t lastshow; /* time() of the last displayed progress meter or NULL to
! 1172: force redraw at next call */
! 1173: curl_off_t size_dl; /* total expected size */
! 1174: curl_off_t size_ul; /* total expected size */
! 1175: curl_off_t downloaded; /* transferred so far */
! 1176: curl_off_t uploaded; /* transferred so far */
! 1177:
! 1178: curl_off_t current_speed; /* uses the currently fastest transfer */
! 1179:
! 1180: int width; /* screen width at download start */
! 1181: int flags; /* see progress.h */
! 1182:
! 1183: timediff_t timespent;
! 1184:
! 1185: curl_off_t dlspeed;
! 1186: curl_off_t ulspeed;
! 1187:
! 1188: timediff_t t_nslookup;
! 1189: timediff_t t_connect;
! 1190: timediff_t t_appconnect;
! 1191: timediff_t t_pretransfer;
! 1192: timediff_t t_starttransfer;
! 1193: timediff_t t_redirect;
! 1194:
! 1195: struct curltime start;
! 1196: struct curltime t_startsingle;
! 1197: struct curltime t_startop;
! 1198: struct curltime t_acceptdata;
! 1199:
! 1200:
! 1201: /* upload speed limit */
! 1202: struct curltime ul_limit_start;
! 1203: curl_off_t ul_limit_size;
! 1204: /* download speed limit */
! 1205: struct curltime dl_limit_start;
! 1206: curl_off_t dl_limit_size;
! 1207:
! 1208: #define CURR_TIME (5 + 1) /* 6 entries for 5 seconds */
! 1209:
! 1210: curl_off_t speeder[ CURR_TIME ];
! 1211: struct curltime speeder_time[ CURR_TIME ];
! 1212: int speeder_c;
! 1213: BIT(callback); /* set when progress callback is used */
! 1214: BIT(is_t_startransfer_set);
! 1215: };
! 1216:
! 1217: typedef enum {
! 1218: HTTPREQ_NONE, /* first in list */
! 1219: HTTPREQ_GET,
! 1220: HTTPREQ_POST,
! 1221: HTTPREQ_POST_FORM, /* we make a difference internally */
! 1222: HTTPREQ_POST_MIME, /* we make a difference internally */
! 1223: HTTPREQ_PUT,
! 1224: HTTPREQ_HEAD,
! 1225: HTTPREQ_OPTIONS,
! 1226: HTTPREQ_LAST /* last in list */
! 1227: } Curl_HttpReq;
! 1228:
! 1229: typedef enum {
! 1230: RTSPREQ_NONE, /* first in list */
! 1231: RTSPREQ_OPTIONS,
! 1232: RTSPREQ_DESCRIBE,
! 1233: RTSPREQ_ANNOUNCE,
! 1234: RTSPREQ_SETUP,
! 1235: RTSPREQ_PLAY,
! 1236: RTSPREQ_PAUSE,
! 1237: RTSPREQ_TEARDOWN,
! 1238: RTSPREQ_GET_PARAMETER,
! 1239: RTSPREQ_SET_PARAMETER,
! 1240: RTSPREQ_RECORD,
! 1241: RTSPREQ_RECEIVE,
! 1242: RTSPREQ_LAST /* last in list */
! 1243: } Curl_RtspReq;
! 1244:
! 1245: /*
! 1246: * Values that are generated, temporary or calculated internally for a
! 1247: * "session handle" must be defined within the 'struct UrlState'. This struct
! 1248: * will be used within the Curl_easy struct. When the 'Curl_easy'
! 1249: * struct is cloned, this data MUST NOT be copied.
! 1250: *
! 1251: * Remember that any "state" information goes globally for the curl handle.
! 1252: * Session-data MUST be put in the connectdata struct and here. */
! 1253: #define MAX_CURL_USER_LENGTH 256
! 1254: #define MAX_CURL_PASSWORD_LENGTH 256
! 1255:
! 1256: struct auth {
! 1257: unsigned long want; /* Bitmask set to the authentication methods wanted by
! 1258: app (with CURLOPT_HTTPAUTH or CURLOPT_PROXYAUTH). */
! 1259: unsigned long picked;
! 1260: unsigned long avail; /* Bitmask for what the server reports to support for
! 1261: this resource */
! 1262: BIT(done); /* TRUE when the auth phase is done and ready to do the
! 1263: actual request */
! 1264: BIT(multipass); /* TRUE if this is not yet authenticated but within the
! 1265: auth multipass negotiation */
! 1266: BIT(iestyle); /* TRUE if digest should be done IE-style or FALSE if it
! 1267: should be RFC compliant */
! 1268: };
! 1269:
! 1270: struct Curl_http2_dep {
! 1271: struct Curl_http2_dep *next;
! 1272: struct Curl_easy *data;
! 1273: };
! 1274:
! 1275: /*
! 1276: * This struct is for holding data that was attempted to get sent to the user's
! 1277: * callback but is held due to pausing. One instance per type (BOTH, HEADER,
! 1278: * BODY).
! 1279: */
! 1280: struct tempbuf {
! 1281: char *buf; /* allocated buffer to keep data in when a write callback
! 1282: returns to make the connection paused */
! 1283: size_t len; /* size of the 'tempwrite' allocated buffer */
! 1284: int type; /* type of the 'tempwrite' buffer as a bitmask that is used with
! 1285: Curl_client_write() */
! 1286: };
! 1287:
! 1288: /* Timers */
! 1289: typedef enum {
! 1290: EXPIRE_100_TIMEOUT,
! 1291: EXPIRE_ASYNC_NAME,
! 1292: EXPIRE_CONNECTTIMEOUT,
! 1293: EXPIRE_DNS_PER_NAME,
! 1294: EXPIRE_HAPPY_EYEBALLS_DNS, /* See asyn-ares.c */
! 1295: EXPIRE_HAPPY_EYEBALLS,
! 1296: EXPIRE_MULTI_PENDING,
! 1297: EXPIRE_RUN_NOW,
! 1298: EXPIRE_SPEEDCHECK,
! 1299: EXPIRE_TIMEOUT,
! 1300: EXPIRE_TOOFAST,
! 1301: EXPIRE_QUIC,
! 1302: EXPIRE_LAST /* not an actual timer, used as a marker only */
! 1303: } expire_id;
! 1304:
! 1305:
! 1306: typedef enum {
! 1307: TRAILERS_NONE,
! 1308: TRAILERS_INITIALIZED,
! 1309: TRAILERS_SENDING,
! 1310: TRAILERS_DONE
! 1311: } trailers_state;
! 1312:
! 1313:
! 1314: /*
! 1315: * One instance for each timeout an easy handle can set.
! 1316: */
! 1317: struct time_node {
! 1318: struct curl_llist_element list;
! 1319: struct curltime time;
! 1320: expire_id eid;
! 1321: };
! 1322:
! 1323: /* individual pieces of the URL */
! 1324: struct urlpieces {
! 1325: char *scheme;
! 1326: char *hostname;
! 1327: char *port;
! 1328: char *user;
! 1329: char *password;
! 1330: char *options;
! 1331: char *path;
! 1332: char *query;
! 1333: };
! 1334:
! 1335: struct UrlState {
! 1336: /* Points to the connection cache */
! 1337: struct conncache *conn_cache;
! 1338:
! 1339: /* buffers to store authentication data in, as parsed from input options */
! 1340: struct curltime keeps_speed; /* for the progress meter really */
! 1341:
! 1342: struct connectdata *lastconnect; /* The last connection, NULL if undefined */
! 1343:
! 1344: char *headerbuff; /* allocated buffer to store headers in */
! 1345: size_t headersize; /* size of the allocation */
! 1346:
! 1347: char *buffer; /* download buffer */
! 1348: char *ulbuf; /* allocated upload buffer or NULL */
! 1349: curl_off_t current_speed; /* the ProgressShow() function sets this,
! 1350: bytes / second */
! 1351: char *first_host; /* host name of the first (not followed) request.
! 1352: if set, this should be the host name that we will
! 1353: sent authorization to, no else. Used to make Location:
! 1354: following not keep sending user+password... This is
! 1355: strdup() data.
! 1356: */
! 1357: int first_remote_port; /* remote port of the first (not followed) request */
! 1358: struct curl_ssl_session *session; /* array of 'max_ssl_sessions' size */
! 1359: long sessionage; /* number of the most recent session */
! 1360: unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
! 1361: struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
! 1362: char *scratch; /* huge buffer[set.buffer_size*2] for upload CRLF replacing */
! 1363: int os_errno; /* filled in with errno whenever an error occurs */
! 1364: #ifdef HAVE_SIGNAL
! 1365: /* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
! 1366: void (*prev_signal)(int sig);
! 1367: #endif
! 1368: struct digestdata digest; /* state data for host Digest auth */
! 1369: struct digestdata proxydigest; /* state data for proxy Digest auth */
! 1370:
! 1371: struct auth authhost; /* auth details for host */
! 1372: struct auth authproxy; /* auth details for proxy */
! 1373: void *resolver; /* resolver state, if it is used in the URL state -
! 1374: ares_channel f.e. */
! 1375:
! 1376: #if defined(USE_OPENSSL)
! 1377: /* void instead of ENGINE to avoid bleeding OpenSSL into this header */
! 1378: void *engine;
! 1379: #endif /* USE_OPENSSL */
! 1380: struct curltime expiretime; /* set this with Curl_expire() only */
! 1381: struct Curl_tree timenode; /* for the splay stuff */
! 1382: struct curl_llist timeoutlist; /* list of pending timeouts */
! 1383: struct time_node expires[EXPIRE_LAST]; /* nodes for each expire type */
! 1384:
! 1385: /* a place to store the most recently set FTP entrypath */
! 1386: char *most_recent_ftp_entrypath;
! 1387:
! 1388: int httpversion; /* the lowest HTTP version*10 reported by any server
! 1389: involved in this request */
! 1390:
! 1391: #if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
! 1392: !defined(__SYMBIAN32__)
! 1393: /* do FTP line-end conversions on most platforms */
! 1394: #define CURL_DO_LINEEND_CONV
! 1395: /* for FTP downloads: track CRLF sequences that span blocks */
! 1396: BIT(prev_block_had_trailing_cr);
! 1397: /* for FTP downloads: how many CRLFs did we converted to LFs? */
! 1398: curl_off_t crlf_conversions;
! 1399: #endif
! 1400: char *range; /* range, if used. See README for detailed specification on
! 1401: this syntax. */
! 1402: curl_off_t resume_from; /* continue [ftp] transfer from here */
! 1403:
! 1404: /* This RTSP state information survives requests and connections */
! 1405: long rtsp_next_client_CSeq; /* the session's next client CSeq */
! 1406: long rtsp_next_server_CSeq; /* the session's next server CSeq */
! 1407: long rtsp_CSeq_recv; /* most recent CSeq received */
! 1408:
! 1409: curl_off_t infilesize; /* size of file to upload, -1 means unknown.
! 1410: Copied from set.filesize at start of operation */
! 1411:
! 1412: size_t drain; /* Increased when this stream has data to read, even if its
! 1413: socket is not necessarily is readable. Decreased when
! 1414: checked. */
! 1415:
! 1416: curl_read_callback fread_func; /* read callback/function */
! 1417: void *in; /* CURLOPT_READDATA */
! 1418:
! 1419: struct Curl_easy *stream_depends_on;
! 1420: int stream_weight;
! 1421: CURLU *uh; /* URL handle for the current parsed URL */
! 1422: struct urlpieces up;
! 1423: #ifndef CURL_DISABLE_HTTP
! 1424: size_t trailers_bytes_sent;
! 1425: Curl_send_buffer *trailers_buf; /* a buffer containing the compiled trailing
! 1426: headers */
! 1427: #endif
! 1428: trailers_state trailers_state; /* whether we are sending trailers
! 1429: and what stage are we at */
! 1430: #ifdef CURLDEBUG
! 1431: BIT(conncache_lock);
! 1432: #endif
! 1433: /* when curl_easy_perform() is called, the multi handle is "owned" by
! 1434: the easy handle so curl_easy_cleanup() on such an easy handle will
! 1435: also close the multi handle! */
! 1436: BIT(multi_owned_by_easy);
! 1437:
! 1438: BIT(this_is_a_follow); /* this is a followed Location: request */
! 1439: BIT(refused_stream); /* this was refused, try again */
! 1440: BIT(errorbuf); /* Set to TRUE if the error buffer is already filled in.
! 1441: This must be set to FALSE every time _easy_perform() is
! 1442: called. */
! 1443: BIT(allow_port); /* Is set.use_port allowed to take effect or not. This
! 1444: is always set TRUE when curl_easy_perform() is called. */
! 1445: BIT(authproblem); /* TRUE if there's some problem authenticating */
! 1446: /* set after initial USER failure, to prevent an authentication loop */
! 1447: BIT(ftp_trying_alternative);
! 1448: BIT(wildcardmatch); /* enable wildcard matching */
! 1449: BIT(expect100header); /* TRUE if we added Expect: 100-continue */
! 1450: BIT(disableexpect); /* TRUE if Expect: is disabled due to a previous
! 1451: 417 response */
! 1452: BIT(use_range);
! 1453: BIT(rangestringalloc); /* the range string is malloc()'ed */
! 1454: BIT(done); /* set to FALSE when Curl_init_do() is called and set to TRUE
! 1455: when multi_done() is called, to prevent multi_done() to get
! 1456: invoked twice when the multi interface is used. */
! 1457: BIT(stream_depends_e); /* set or don't set the Exclusive bit */
! 1458: BIT(previouslypending); /* this transfer WAS in the multi->pending queue */
! 1459: BIT(cookie_engine);
! 1460: };
! 1461:
! 1462:
! 1463: /*
! 1464: * This 'DynamicStatic' struct defines dynamic states that actually change
! 1465: * values in the 'UserDefined' area, which MUST be taken into consideration
! 1466: * if the UserDefined struct is cloned or similar. You can probably just
! 1467: * copy these, but each one indicate a special action on other data.
! 1468: */
! 1469:
! 1470: struct DynamicStatic {
! 1471: char *url; /* work URL, copied from UserDefined */
! 1472: char *referer; /* referer string */
! 1473: struct curl_slist *cookielist; /* list of cookie files set by
! 1474: curl_easy_setopt(COOKIEFILE) calls */
! 1475: struct curl_slist *resolve; /* set to point to the set.resolve list when
! 1476: this should be dealt with in pretransfer */
! 1477: BIT(url_alloc); /* URL string is malloc()'ed */
! 1478: BIT(referer_alloc); /* referer string is malloc()ed */
! 1479: BIT(wildcard_resolve); /* Set to true if any resolve change is a
! 1480: wildcard */
! 1481: };
! 1482:
! 1483: /*
! 1484: * This 'UserDefined' struct must only contain data that is set once to go
! 1485: * for many (perhaps) independent connections. Values that are generated or
! 1486: * calculated internally for the "session handle" MUST be defined within the
! 1487: * 'struct UrlState' instead. The only exceptions MUST note the changes in
! 1488: * the 'DynamicStatic' struct.
! 1489: * Character pointer fields point to dynamic storage, unless otherwise stated.
! 1490: */
! 1491:
! 1492: struct Curl_multi; /* declared and used only in multi.c */
! 1493:
! 1494: /*
! 1495: * This enumeration MUST not use conditional directives (#ifdefs), new
! 1496: * null terminated strings MUST be added to the enumeration immediately
! 1497: * before STRING_LASTZEROTERMINATED, binary fields immediately before
! 1498: * STRING_LAST. When doing so, ensure that the packages/OS400/chkstring.c
! 1499: * test is updated and applicable changes for EBCDIC to ASCII conversion
! 1500: * are catered for in curl_easy_setopt_ccsid()
! 1501: */
! 1502: enum dupstring {
! 1503: STRING_CERT_ORIG, /* client certificate file name */
! 1504: STRING_CERT_PROXY, /* client certificate file name */
! 1505: STRING_CERT_TYPE_ORIG, /* format for certificate (default: PEM)*/
! 1506: STRING_CERT_TYPE_PROXY, /* format for certificate (default: PEM)*/
! 1507: STRING_COOKIE, /* HTTP cookie string to send */
! 1508: STRING_COOKIEJAR, /* dump all cookies to this file */
! 1509: STRING_CUSTOMREQUEST, /* HTTP/FTP/RTSP request/method to use */
! 1510: STRING_DEFAULT_PROTOCOL, /* Protocol to use when the URL doesn't specify */
! 1511: STRING_DEVICE, /* local network interface/address to use */
! 1512: STRING_ENCODING, /* Accept-Encoding string */
! 1513: STRING_FTP_ACCOUNT, /* ftp account data */
! 1514: STRING_FTP_ALTERNATIVE_TO_USER, /* command to send if USER/PASS fails */
! 1515: STRING_FTPPORT, /* port to send with the FTP PORT command */
! 1516: STRING_KEY_ORIG, /* private key file name */
! 1517: STRING_KEY_PROXY, /* private key file name */
! 1518: STRING_KEY_PASSWD_ORIG, /* plain text private key password */
! 1519: STRING_KEY_PASSWD_PROXY, /* plain text private key password */
! 1520: STRING_KEY_TYPE_ORIG, /* format for private key (default: PEM) */
! 1521: STRING_KEY_TYPE_PROXY, /* format for private key (default: PEM) */
! 1522: STRING_KRB_LEVEL, /* krb security level */
! 1523: STRING_NETRC_FILE, /* if not NULL, use this instead of trying to find
! 1524: $HOME/.netrc */
! 1525: STRING_PROXY, /* proxy to use */
! 1526: STRING_PRE_PROXY, /* pre socks proxy to use */
! 1527: STRING_SET_RANGE, /* range, if used */
! 1528: STRING_SET_REFERER, /* custom string for the HTTP referer field */
! 1529: STRING_SET_URL, /* what original URL to work on */
! 1530: STRING_SSL_CAPATH_ORIG, /* CA directory name (doesn't work on windows) */
! 1531: STRING_SSL_CAPATH_PROXY, /* CA directory name (doesn't work on windows) */
! 1532: STRING_SSL_CAFILE_ORIG, /* certificate file to verify peer against */
! 1533: STRING_SSL_CAFILE_PROXY, /* certificate file to verify peer against */
! 1534: STRING_SSL_PINNEDPUBLICKEY_ORIG, /* public key file to verify peer against */
! 1535: STRING_SSL_PINNEDPUBLICKEY_PROXY, /* public key file to verify proxy */
! 1536: STRING_SSL_CIPHER_LIST_ORIG, /* list of ciphers to use */
! 1537: STRING_SSL_CIPHER_LIST_PROXY, /* list of ciphers to use */
! 1538: STRING_SSL_CIPHER13_LIST_ORIG, /* list of TLS 1.3 ciphers to use */
! 1539: STRING_SSL_CIPHER13_LIST_PROXY, /* list of TLS 1.3 ciphers to use */
! 1540: STRING_SSL_EGDSOCKET, /* path to file containing the EGD daemon socket */
! 1541: STRING_SSL_RANDOM_FILE, /* path to file containing "random" data */
! 1542: STRING_USERAGENT, /* User-Agent string */
! 1543: STRING_SSL_CRLFILE_ORIG, /* crl file to check certificate */
! 1544: STRING_SSL_CRLFILE_PROXY, /* crl file to check certificate */
! 1545: STRING_SSL_ISSUERCERT_ORIG, /* issuer cert file to check certificate */
! 1546: STRING_SSL_ISSUERCERT_PROXY, /* issuer cert file to check certificate */
! 1547: STRING_SSL_ENGINE, /* name of ssl engine */
! 1548: STRING_USERNAME, /* <username>, if used */
! 1549: STRING_PASSWORD, /* <password>, if used */
! 1550: STRING_OPTIONS, /* <options>, if used */
! 1551: STRING_PROXYUSERNAME, /* Proxy <username>, if used */
! 1552: STRING_PROXYPASSWORD, /* Proxy <password>, if used */
! 1553: STRING_NOPROXY, /* List of hosts which should not use the proxy, if
! 1554: used */
! 1555: STRING_RTSP_SESSION_ID, /* Session ID to use */
! 1556: STRING_RTSP_STREAM_URI, /* Stream URI for this request */
! 1557: STRING_RTSP_TRANSPORT, /* Transport for this session */
! 1558:
! 1559: STRING_SSH_PRIVATE_KEY, /* path to the private key file for auth */
! 1560: STRING_SSH_PUBLIC_KEY, /* path to the public key file for auth */
! 1561: STRING_SSH_HOST_PUBLIC_KEY_MD5, /* md5 of host public key in ascii hex */
! 1562: STRING_SSH_KNOWNHOSTS, /* file name of knownhosts file */
! 1563:
! 1564: STRING_PROXY_SERVICE_NAME, /* Proxy service name */
! 1565: STRING_SERVICE_NAME, /* Service name */
! 1566: STRING_MAIL_FROM,
! 1567: STRING_MAIL_AUTH,
! 1568:
! 1569: STRING_TLSAUTH_USERNAME_ORIG, /* TLS auth <username> */
! 1570: STRING_TLSAUTH_USERNAME_PROXY, /* TLS auth <username> */
! 1571: STRING_TLSAUTH_PASSWORD_ORIG, /* TLS auth <password> */
! 1572: STRING_TLSAUTH_PASSWORD_PROXY, /* TLS auth <password> */
! 1573:
! 1574: STRING_BEARER, /* <bearer>, if used */
! 1575:
! 1576: STRING_UNIX_SOCKET_PATH, /* path to Unix socket, if used */
! 1577:
! 1578: STRING_TARGET, /* CURLOPT_REQUEST_TARGET */
! 1579: STRING_DOH, /* CURLOPT_DOH_URL */
! 1580:
! 1581: STRING_ALTSVC, /* CURLOPT_ALTSVC */
! 1582:
! 1583: STRING_SASL_AUTHZID, /* CURLOPT_SASL_AUTHZID */
! 1584:
! 1585: STRING_TEMP_URL, /* temp URL storage for proxy use */
! 1586:
! 1587: STRING_DNS_SERVERS,
! 1588: STRING_DNS_INTERFACE,
! 1589: STRING_DNS_LOCAL_IP4,
! 1590: STRING_DNS_LOCAL_IP6,
! 1591:
! 1592: /* -- end of zero-terminated strings -- */
! 1593:
! 1594: STRING_LASTZEROTERMINATED,
! 1595:
! 1596: /* -- below this are pointers to binary data that cannot be strdup'ed. --- */
! 1597:
! 1598: STRING_COPYPOSTFIELDS, /* if POST, set the fields' values here */
! 1599:
! 1600:
! 1601: STRING_LAST /* not used, just an end-of-list marker */
! 1602: };
! 1603:
! 1604: /* callback that gets called when this easy handle is completed within a multi
! 1605: handle. Only used for internally created transfers, like for example
! 1606: DoH. */
! 1607: typedef int (*multidone_func)(struct Curl_easy *easy, CURLcode result);
! 1608:
! 1609: struct UserDefined {
! 1610: FILE *err; /* the stderr user data goes here */
! 1611: void *debugdata; /* the data that will be passed to fdebug */
! 1612: char *errorbuffer; /* (Static) store failure messages in here */
! 1613: long proxyport; /* If non-zero, use this port number by default. If the
! 1614: proxy string features a ":[port]" that one will override
! 1615: this. */
! 1616: void *out; /* CURLOPT_WRITEDATA */
! 1617: void *in_set; /* CURLOPT_READDATA */
! 1618: void *writeheader; /* write the header to this if non-NULL */
! 1619: void *rtp_out; /* write RTP to this if non-NULL */
! 1620: long use_port; /* which port to use (when not using default) */
! 1621: unsigned long httpauth; /* kind of HTTP authentication to use (bitmask) */
! 1622: unsigned long proxyauth; /* kind of proxy authentication to use (bitmask) */
! 1623: unsigned long socks5auth;/* kind of SOCKS5 authentication to use (bitmask) */
! 1624: long followlocation; /* as in HTTP Location: */
! 1625: long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1
! 1626: for infinity */
! 1627:
! 1628: int keep_post; /* keep POSTs as POSTs after a 30x request; each
! 1629: bit represents a request, from 301 to 303 */
! 1630: void *postfields; /* if POST, set the fields' values here */
! 1631: curl_seek_callback seek_func; /* function that seeks the input */
! 1632: curl_off_t postfieldsize; /* if POST, this might have a size to use instead
! 1633: of strlen(), and then the data *may* be binary
! 1634: (contain zero bytes) */
! 1635: unsigned short localport; /* local port number to bind to */
! 1636: int localportrange; /* number of additional port numbers to test in case the
! 1637: 'localport' one can't be bind()ed */
! 1638: curl_write_callback fwrite_func; /* function that stores the output */
! 1639: curl_write_callback fwrite_header; /* function that stores headers */
! 1640: curl_write_callback fwrite_rtp; /* function that stores interleaved RTP */
! 1641: curl_read_callback fread_func_set; /* function that reads the input */
! 1642: curl_progress_callback fprogress; /* OLD and deprecated progress callback */
! 1643: curl_xferinfo_callback fxferinfo; /* progress callback */
! 1644: curl_debug_callback fdebug; /* function that write informational data */
! 1645: curl_ioctl_callback ioctl_func; /* function for I/O control */
! 1646: curl_sockopt_callback fsockopt; /* function for setting socket options */
! 1647: void *sockopt_client; /* pointer to pass to the socket options callback */
! 1648: curl_opensocket_callback fopensocket; /* function for checking/translating
! 1649: the address and opening the
! 1650: socket */
! 1651: void *opensocket_client;
! 1652: curl_closesocket_callback fclosesocket; /* function for closing the
! 1653: socket */
! 1654: void *closesocket_client;
! 1655:
! 1656: void *seek_client; /* pointer to pass to the seek callback */
! 1657: /* the 3 curl_conv_callback functions below are used on non-ASCII hosts */
! 1658: /* function to convert from the network encoding: */
! 1659: curl_conv_callback convfromnetwork;
! 1660: /* function to convert to the network encoding: */
! 1661: curl_conv_callback convtonetwork;
! 1662: /* function to convert from UTF-8 encoding: */
! 1663: curl_conv_callback convfromutf8;
! 1664:
! 1665: void *progress_client; /* pointer to pass to the progress callback */
! 1666: void *ioctl_client; /* pointer to pass to the ioctl callback */
! 1667: long timeout; /* in milliseconds, 0 means no timeout */
! 1668: long connecttimeout; /* in milliseconds, 0 means no timeout */
! 1669: long accepttimeout; /* in milliseconds, 0 means no timeout */
! 1670: long happy_eyeballs_timeout; /* in milliseconds, 0 is a valid value */
! 1671: long server_response_timeout; /* in milliseconds, 0 means no timeout */
! 1672: long maxage_conn; /* in seconds, max idle time to allow a connection that
! 1673: is to be reused */
! 1674: long tftp_blksize; /* in bytes, 0 means use default */
! 1675: curl_off_t filesize; /* size of file to upload, -1 means unknown */
! 1676: long low_speed_limit; /* bytes/second */
! 1677: long low_speed_time; /* number of seconds */
! 1678: curl_off_t max_send_speed; /* high speed limit in bytes/second for upload */
! 1679: curl_off_t max_recv_speed; /* high speed limit in bytes/second for
! 1680: download */
! 1681: curl_off_t set_resume_from; /* continue [ftp] transfer from here */
! 1682: struct curl_slist *headers; /* linked list of extra headers */
! 1683: struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
! 1684: struct curl_httppost *httppost; /* linked list of old POST data */
! 1685: curl_mimepart mimepost; /* MIME/POST data. */
! 1686: struct curl_slist *quote; /* after connection is established */
! 1687: struct curl_slist *postquote; /* after the transfer */
! 1688: struct curl_slist *prequote; /* before the transfer, after type */
! 1689: struct curl_slist *source_quote; /* 3rd party quote */
! 1690: struct curl_slist *source_prequote; /* in 3rd party transfer mode - before
! 1691: the transfer on source host */
! 1692: struct curl_slist *source_postquote; /* in 3rd party transfer mode - after
! 1693: the transfer on source host */
! 1694: struct curl_slist *telnet_options; /* linked list of telnet options */
! 1695: struct curl_slist *resolve; /* list of names to add/remove from
! 1696: DNS cache */
! 1697: struct curl_slist *connect_to; /* list of host:port mappings to override
! 1698: the hostname and port to connect to */
! 1699: curl_TimeCond timecondition; /* kind of time/date comparison */
! 1700: time_t timevalue; /* what time to compare with */
! 1701: Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
! 1702: long httpversion; /* when non-zero, a specific HTTP version requested to
! 1703: be used in the library's request(s) */
! 1704: struct ssl_config_data ssl; /* user defined SSL stuff */
! 1705: struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */
! 1706: struct ssl_general_config general_ssl; /* general user defined SSL stuff */
! 1707: curl_proxytype proxytype; /* what kind of proxy that is in use */
! 1708: long dns_cache_timeout; /* DNS cache timeout */
! 1709: long buffer_size; /* size of receive buffer to use */
! 1710: size_t upload_buffer_size; /* size of upload buffer to use,
! 1711: keep it >= CURL_MAX_WRITE_SIZE */
! 1712: void *private_data; /* application-private data */
! 1713: struct curl_slist *http200aliases; /* linked list of aliases for http200 */
! 1714: long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
! 1715: 0 - whatever, 1 - v2, 2 - v6 */
! 1716: curl_off_t max_filesize; /* Maximum file size to download */
! 1717: #ifndef CURL_DISABLE_FTP
! 1718: curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used */
! 1719: curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
! 1720: curl_ftpccc ftp_ccc; /* FTP CCC options */
! 1721: #endif
! 1722: int ftp_create_missing_dirs; /* 1 - create directories that don't exist
! 1723: 2 - the same but also allow MKD to fail once
! 1724: */
! 1725: curl_sshkeycallback ssh_keyfunc; /* key matching callback */
! 1726: void *ssh_keyfunc_userp; /* custom pointer to callback */
! 1727: enum CURL_NETRC_OPTION
! 1728: use_netrc; /* defined in include/curl.h */
! 1729: curl_usessl use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
! 1730: IMAP or POP3 or others! */
! 1731: long new_file_perms; /* Permissions to use when creating remote files */
! 1732: long new_directory_perms; /* Permissions to use when creating remote dirs */
! 1733: long ssh_auth_types; /* allowed SSH auth types */
! 1734: char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
! 1735: unsigned int scope_id; /* Scope id for IPv6 */
! 1736: long allowed_protocols;
! 1737: long redir_protocols;
! 1738: struct curl_slist *mail_rcpt; /* linked list of mail recipients */
! 1739: /* Common RTSP header options */
! 1740: Curl_RtspReq rtspreq; /* RTSP request type */
! 1741: long rtspversion; /* like httpversion, for RTSP */
! 1742: curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
! 1743: starts */
! 1744: curl_chunk_end_callback chunk_end; /* called after part transferring
! 1745: stopped */
! 1746: curl_fnmatch_callback fnmatch; /* callback to decide which file corresponds
! 1747: to pattern (e.g. if WILDCARDMATCH is on) */
! 1748: void *fnmatch_data;
! 1749:
! 1750: long gssapi_delegation; /* GSS-API credential delegation, see the
! 1751: documentation of CURLOPT_GSSAPI_DELEGATION */
! 1752:
! 1753: long tcp_keepidle; /* seconds in idle before sending keepalive probe */
! 1754: long tcp_keepintvl; /* seconds between TCP keepalive probes */
! 1755:
! 1756: size_t maxconnects; /* Max idle connections in the connection cache */
! 1757:
! 1758: long expect_100_timeout; /* in milliseconds */
! 1759: struct Curl_easy *stream_depends_on;
! 1760: int stream_weight;
! 1761: struct Curl_http2_dep *stream_dependents;
! 1762:
! 1763: curl_resolver_start_callback resolver_start; /* optional callback called
! 1764: before resolver start */
! 1765: void *resolver_start_client; /* pointer to pass to resolver start callback */
! 1766: long upkeep_interval_ms; /* Time between calls for connection upkeep. */
! 1767: multidone_func fmultidone;
! 1768: struct Curl_easy *dohfor; /* this is a DoH request for that transfer */
! 1769: CURLU *uh; /* URL handle for the current parsed URL */
! 1770: void *trailer_data; /* pointer to pass to trailer data callback */
! 1771: curl_trailer_callback trailer_callback; /* trailing data callback */
! 1772: BIT(is_fread_set); /* has read callback been set to non-NULL? */
! 1773: BIT(is_fwrite_set); /* has write callback been set to non-NULL? */
! 1774: BIT(free_referer); /* set TRUE if 'referer' points to a string we
! 1775: allocated */
! 1776: BIT(tftp_no_options); /* do not send TFTP options requests */
! 1777: BIT(sep_headers); /* handle host and proxy headers separately */
! 1778: BIT(cookiesession); /* new cookie session? */
! 1779: BIT(crlf); /* convert crlf on ftp upload(?) */
! 1780: BIT(strip_path_slash); /* strip off initial slash from path */
! 1781: BIT(ssh_compression); /* enable SSH compression */
! 1782:
! 1783: /* Here follows boolean settings that define how to behave during
! 1784: this session. They are STATIC, set by libcurl users or at least initially
! 1785: and they don't change during operations. */
! 1786: BIT(get_filetime); /* get the time and get of the remote file */
! 1787: BIT(tunnel_thru_httpproxy); /* use CONNECT through a HTTP proxy */
! 1788: BIT(prefer_ascii); /* ASCII rather than binary */
! 1789: BIT(ftp_append); /* append, not overwrite, on upload */
! 1790: BIT(ftp_list_only); /* switch FTP command for listing directories */
! 1791: #ifndef CURL_DISABLE_FTP
! 1792: BIT(ftp_use_port); /* use the FTP PORT command */
! 1793: BIT(ftp_use_epsv); /* if EPSV is to be attempted or not */
! 1794: BIT(ftp_use_eprt); /* if EPRT is to be attempted or not */
! 1795: BIT(ftp_use_pret); /* if PRET is to be used before PASV or not */
! 1796: BIT(ftp_skip_ip); /* skip the IP address the FTP server passes on to
! 1797: us */
! 1798: #endif
! 1799: BIT(hide_progress); /* don't use the progress meter */
! 1800: BIT(http_fail_on_error); /* fail on HTTP error codes >= 400 */
! 1801: BIT(http_keep_sending_on_error); /* for HTTP status codes >= 300 */
! 1802: BIT(http_follow_location); /* follow HTTP redirects */
! 1803: BIT(http_transfer_encoding); /* request compressed HTTP transfer-encoding */
! 1804: BIT(allow_auth_to_other_hosts);
! 1805: BIT(include_header); /* include received protocol headers in data output */
! 1806: BIT(http_set_referer); /* is a custom referer used */
! 1807: BIT(http_auto_referer); /* set "correct" referer when following
! 1808: location: */
! 1809: BIT(opt_no_body); /* as set with CURLOPT_NOBODY */
! 1810: BIT(upload); /* upload request */
! 1811: BIT(verbose); /* output verbosity */
! 1812: BIT(krb); /* Kerberos connection requested */
! 1813: BIT(reuse_forbid); /* forbidden to be reused, close after use */
! 1814: BIT(reuse_fresh); /* do not re-use an existing connection */
! 1815: BIT(no_signal); /* do not use any signal/alarm handler */
! 1816: BIT(tcp_nodelay); /* whether to enable TCP_NODELAY or not */
! 1817: BIT(ignorecl); /* ignore content length */
! 1818: BIT(connect_only); /* make connection, let application use the socket */
! 1819: BIT(http_te_skip); /* pass the raw body data to the user, even when
! 1820: transfer-encoded (chunked, compressed) */
! 1821: BIT(http_ce_skip); /* pass the raw body data to the user, even when
! 1822: content-encoded (chunked, compressed) */
! 1823: BIT(proxy_transfer_mode); /* set transfer mode (;type=<a|i>) when doing
! 1824: FTP via an HTTP proxy */
! 1825: #if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
! 1826: BIT(socks5_gssapi_nec); /* Flag to support NEC SOCKS5 server */
! 1827: #endif
! 1828: BIT(sasl_ir); /* Enable/disable SASL initial response */
! 1829: BIT(wildcard_enabled); /* enable wildcard matching */
! 1830: BIT(tcp_keepalive); /* use TCP keepalives */
! 1831: BIT(tcp_fastopen); /* use TCP Fast Open */
! 1832: BIT(ssl_enable_npn); /* TLS NPN extension? */
! 1833: BIT(ssl_enable_alpn);/* TLS ALPN extension? */
! 1834: BIT(path_as_is); /* allow dotdots? */
! 1835: BIT(pipewait); /* wait for multiplex status before starting a new
! 1836: connection */
! 1837: BIT(suppress_connect_headers); /* suppress proxy CONNECT response headers
! 1838: from user callbacks */
! 1839: BIT(dns_shuffle_addresses); /* whether to shuffle addresses before use */
! 1840: BIT(stream_depends_e); /* set or don't set the Exclusive bit */
! 1841: BIT(haproxyprotocol); /* whether to send HAProxy PROXY protocol v1
! 1842: header */
! 1843: BIT(abstract_unix_socket);
! 1844: BIT(disallow_username_in_url); /* disallow username in url */
! 1845: BIT(doh); /* DNS-over-HTTPS enabled */
! 1846: BIT(doh_get); /* use GET for DoH requests, instead of POST */
! 1847: BIT(http09_allowed); /* allow HTTP/0.9 responses */
! 1848: BIT(mail_rcpt_allowfails); /* allow RCPT TO command to fail for some
! 1849: recipients */
! 1850: };
! 1851:
! 1852: struct Names {
! 1853: struct curl_hash *hostcache;
! 1854: enum {
! 1855: HCACHE_NONE, /* not pointing to anything */
! 1856: HCACHE_MULTI, /* points to a shared one in the multi handle */
! 1857: HCACHE_SHARED /* points to a shared one in a shared object */
! 1858: } hostcachetype;
! 1859: };
! 1860:
! 1861: /*
! 1862: * The 'connectdata' struct MUST have all the connection oriented stuff as we
! 1863: * may have several simultaneous connections and connection structs in memory.
! 1864: *
! 1865: * The 'struct UserDefined' must only contain data that is set once to go for
! 1866: * many (perhaps) independent connections. Values that are generated or
! 1867: * calculated internally for the "session handle" must be defined within the
! 1868: * 'struct UrlState' instead.
! 1869: */
! 1870:
! 1871: struct Curl_easy {
! 1872: /* first, two fields for the linked list of these */
! 1873: struct Curl_easy *next;
! 1874: struct Curl_easy *prev;
! 1875:
! 1876: struct connectdata *conn;
! 1877: struct curl_llist_element connect_queue;
! 1878: struct curl_llist_element conn_queue; /* list per connectdata */
! 1879:
! 1880: CURLMstate mstate; /* the handle's state */
! 1881: CURLcode result; /* previous result */
! 1882:
! 1883: struct Curl_message msg; /* A single posted message. */
! 1884:
! 1885: /* Array with the plain socket numbers this handle takes care of, in no
! 1886: particular order. Note that all sockets are added to the sockhash, where
! 1887: the state etc are also kept. This array is mostly used to detect when a
! 1888: socket is to be removed from the hash. See singlesocket(). */
! 1889: curl_socket_t sockets[MAX_SOCKSPEREASYHANDLE];
! 1890: int actions[MAX_SOCKSPEREASYHANDLE]; /* action for each socket in
! 1891: sockets[] */
! 1892: int numsocks;
! 1893:
! 1894: struct Names dns;
! 1895: struct Curl_multi *multi; /* if non-NULL, points to the multi handle
! 1896: struct to which this "belongs" when used by
! 1897: the multi interface */
! 1898: struct Curl_multi *multi_easy; /* if non-NULL, points to the multi handle
! 1899: struct to which this "belongs" when used
! 1900: by the easy interface */
! 1901: struct Curl_share *share; /* Share, handles global variable mutexing */
! 1902: #ifdef USE_LIBPSL
! 1903: struct PslCache *psl; /* The associated PSL cache. */
! 1904: #endif
! 1905: struct SingleRequest req; /* Request-specific data */
! 1906: struct UserDefined set; /* values set by the libcurl user */
! 1907: struct DynamicStatic change; /* possibly modified userdefined data */
! 1908: struct CookieInfo *cookies; /* the cookies, read from files and servers.
! 1909: NOTE that the 'cookie' field in the
! 1910: UserDefined struct defines if the "engine"
! 1911: is to be used or not. */
! 1912: #ifdef USE_ALTSVC
! 1913: struct altsvcinfo *asi; /* the alt-svc cache */
! 1914: #endif
! 1915: struct Progress progress; /* for all the progress meter data */
! 1916: struct UrlState state; /* struct for fields used for state info and
! 1917: other dynamic purposes */
! 1918: #ifndef CURL_DISABLE_FTP
! 1919: struct WildcardData wildcard; /* wildcard download state info */
! 1920: #endif
! 1921: struct PureInfo info; /* stats, reports and info data */
! 1922: struct curl_tlssessioninfo tsi; /* Information about the TLS session, only
! 1923: valid after a client has asked for it */
! 1924: #if defined(CURL_DOES_CONVERSIONS) && defined(HAVE_ICONV)
! 1925: iconv_t outbound_cd; /* for translating to the network encoding */
! 1926: iconv_t inbound_cd; /* for translating from the network encoding */
! 1927: iconv_t utf8_cd; /* for translating to UTF8 */
! 1928: #endif /* CURL_DOES_CONVERSIONS && HAVE_ICONV */
! 1929: unsigned int magic; /* set to a CURLEASY_MAGIC_NUMBER */
! 1930: };
! 1931:
! 1932: #define LIBCURL_NAME "libcurl"
! 1933:
! 1934: #endif /* HEADER_CURL_URLDATA_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>