mirror of
https://github.com/moparisthebest/curl
synced 2024-08-13 17:03:50 -04:00
urldata: convert bools to bitfields and move to end
This allows the compiler to pack and align the structs better in memory. For a rather feature-complete build on x86_64 Linux, gcc 8.1.2 makes the Curl_easy struct 4.9% smaller. From 6312 bytes to 6000. Removed an unused struct field. No functionality changes. Closes #3610
This commit is contained in:
parent
50482b8c0a
commit
62a2534e4c
@ -1434,7 +1434,7 @@ void Curl_conncontrol(struct connectdata *conn,
|
|||||||
if((ctrl == CONNCTRL_STREAM) &&
|
if((ctrl == CONNCTRL_STREAM) &&
|
||||||
(conn->handler->flags & PROTOPT_STREAM))
|
(conn->handler->flags & PROTOPT_STREAM))
|
||||||
DEBUGF(infof(conn->data, "Kill stream: %s\n", reason));
|
DEBUGF(infof(conn->data, "Kill stream: %s\n", reason));
|
||||||
else if(closeit != conn->bits.close) {
|
else if((bit)closeit != conn->bits.close) {
|
||||||
DEBUGF(infof(conn->data, "Marked for [%s]: %s\n",
|
DEBUGF(infof(conn->data, "Marked for [%s]: %s\n",
|
||||||
closeit?"closure":"keep alive", reason));
|
closeit?"closure":"keep alive", reason));
|
||||||
conn->bits.close = closeit; /* the only place in the source code that
|
conn->bits.close = closeit; /* the only place in the source code that
|
||||||
|
@ -4395,7 +4395,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
ftp->path = &data->state.up.path[1]; /* don't include the initial slash */
|
ftp->path = &data->state.up.path[1]; /* don't include the initial slash */
|
||||||
data->state.slash_removed = TRUE; /* we've skipped the slash */
|
|
||||||
|
|
||||||
/* FTP URLs support an extension like ";type=<typecode>" that
|
/* FTP URLs support an extension like ";type=<typecode>" that
|
||||||
* we'll try to get now! */
|
* we'll try to get now! */
|
||||||
|
@ -751,7 +751,7 @@ Curl_http_output_auth(struct connectdata *conn,
|
|||||||
#ifndef CURL_DISABLE_PROXY
|
#ifndef CURL_DISABLE_PROXY
|
||||||
/* Send proxy authentication header if needed */
|
/* Send proxy authentication header if needed */
|
||||||
if(conn->bits.httpproxy &&
|
if(conn->bits.httpproxy &&
|
||||||
(conn->bits.tunnel_proxy == proxytunnel)) {
|
(conn->bits.tunnel_proxy == (bit)proxytunnel)) {
|
||||||
result = output_auth_headers(conn, authproxy, request, path, TRUE);
|
result = output_auth_headers(conn, authproxy, request, path, TRUE);
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
14
lib/setopt.c
14
lib/setopt.c
@ -682,7 +682,7 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
|
|||||||
* Set header option.
|
* Set header option.
|
||||||
*/
|
*/
|
||||||
arg = va_arg(param, long);
|
arg = va_arg(param, long);
|
||||||
data->set.sep_headers = (arg & CURLHEADER_SEPARATE)? TRUE: FALSE;
|
data->set.sep_headers = (bool)((arg & CURLHEADER_SEPARATE)? TRUE: FALSE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CURLOPT_HTTP200ALIASES:
|
case CURLOPT_HTTP200ALIASES:
|
||||||
@ -884,7 +884,8 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
|
|||||||
|
|
||||||
/* the DIGEST_IE bit is only used to set a special marker, for all the
|
/* the DIGEST_IE bit is only used to set a special marker, for all the
|
||||||
rest we need to handle it as normal DIGEST */
|
rest we need to handle it as normal DIGEST */
|
||||||
data->state.authhost.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
|
data->state.authhost.iestyle =
|
||||||
|
(bool)((auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE);
|
||||||
|
|
||||||
if(auth & CURLAUTH_DIGEST_IE) {
|
if(auth & CURLAUTH_DIGEST_IE) {
|
||||||
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
|
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
|
||||||
@ -967,7 +968,8 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
|
|||||||
|
|
||||||
/* the DIGEST_IE bit is only used to set a special marker, for all the
|
/* the DIGEST_IE bit is only used to set a special marker, for all the
|
||||||
rest we need to handle it as normal DIGEST */
|
rest we need to handle it as normal DIGEST */
|
||||||
data->state.authproxy.iestyle = (auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE;
|
data->state.authproxy.iestyle =
|
||||||
|
(bool)((auth & CURLAUTH_DIGEST_IE) ? TRUE : FALSE);
|
||||||
|
|
||||||
if(auth & CURLAUTH_DIGEST_IE) {
|
if(auth & CURLAUTH_DIGEST_IE) {
|
||||||
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
|
auth |= CURLAUTH_DIGEST; /* set standard digest bit */
|
||||||
@ -2076,13 +2078,15 @@ static CURLcode vsetopt(struct Curl_easy *data, CURLoption option,
|
|||||||
|
|
||||||
case CURLOPT_SSL_OPTIONS:
|
case CURLOPT_SSL_OPTIONS:
|
||||||
arg = va_arg(param, long);
|
arg = va_arg(param, long);
|
||||||
data->set.ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
|
data->set.ssl.enable_beast =
|
||||||
|
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
|
||||||
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
|
data->set.ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CURLOPT_PROXY_SSL_OPTIONS:
|
case CURLOPT_PROXY_SSL_OPTIONS:
|
||||||
arg = va_arg(param, long);
|
arg = va_arg(param, long);
|
||||||
data->set.proxy_ssl.enable_beast = arg&CURLSSLOPT_ALLOW_BEAST?TRUE:FALSE;
|
data->set.proxy_ssl.enable_beast =
|
||||||
|
(bool)((arg&CURLSSLOPT_ALLOW_BEAST) ? TRUE : FALSE);
|
||||||
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
|
data->set.proxy_ssl.no_revoke = !!(arg & CURLSSLOPT_NO_REVOKE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
477
lib/urldata.h
477
lib/urldata.h
@ -156,13 +156,16 @@ typedef ssize_t (Curl_recv)(struct connectdata *conn, /* connection data */
|
|||||||
#define GOOD_EASY_HANDLE(x) \
|
#define GOOD_EASY_HANDLE(x) \
|
||||||
((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
|
((x) && ((x)->magic == CURLEASY_MAGIC_NUMBER))
|
||||||
|
|
||||||
|
/* the type we use for storing a single boolean bit */
|
||||||
|
typedef unsigned int bit;
|
||||||
|
|
||||||
#ifdef HAVE_GSSAPI
|
#ifdef HAVE_GSSAPI
|
||||||
/* Types needed for krb5-ftp connections */
|
/* Types needed for krb5-ftp connections */
|
||||||
struct krb5buffer {
|
struct krb5buffer {
|
||||||
void *data;
|
void *data;
|
||||||
size_t size;
|
size_t size;
|
||||||
size_t index;
|
size_t index;
|
||||||
int eof_flag;
|
bit eof_flag:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum protection_level {
|
enum protection_level {
|
||||||
@ -200,21 +203,17 @@ struct ssl_connect_data {
|
|||||||
/* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
|
/* Use ssl encrypted communications TRUE/FALSE, not necessarily using it atm
|
||||||
but at least asked to or meaning to use it. See 'state' for the exact
|
but at least asked to or meaning to use it. See 'state' for the exact
|
||||||
current state of the connection. */
|
current state of the connection. */
|
||||||
bool use;
|
|
||||||
ssl_connection_state state;
|
ssl_connection_state state;
|
||||||
ssl_connect_state connecting_state;
|
ssl_connect_state connecting_state;
|
||||||
#if defined(USE_SSL)
|
#if defined(USE_SSL)
|
||||||
struct ssl_backend_data *backend;
|
struct ssl_backend_data *backend;
|
||||||
#endif
|
#endif
|
||||||
|
bit use:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssl_primary_config {
|
struct ssl_primary_config {
|
||||||
long version; /* what version the client wants to use */
|
long version; /* what version the client wants to use */
|
||||||
long version_max; /* max supported version the client wants to use*/
|
long version_max; /* max supported version the client wants to use*/
|
||||||
bool verifypeer; /* set TRUE if this is desired */
|
|
||||||
bool verifyhost; /* set TRUE if CN/SAN must match hostname */
|
|
||||||
bool verifystatus; /* set TRUE if certificate status must be checked */
|
|
||||||
bool sessionid; /* cache session IDs or not */
|
|
||||||
char *CApath; /* certificate dir (doesn't work on windows) */
|
char *CApath; /* certificate dir (doesn't work on windows) */
|
||||||
char *CAfile; /* certificate to verify peer against */
|
char *CAfile; /* certificate to verify peer against */
|
||||||
char *clientcert;
|
char *clientcert;
|
||||||
@ -222,32 +221,33 @@ struct ssl_primary_config {
|
|||||||
char *egdsocket; /* path to file containing the EGD daemon socket */
|
char *egdsocket; /* path to file containing the EGD daemon socket */
|
||||||
char *cipher_list; /* list of ciphers to use */
|
char *cipher_list; /* list of ciphers to use */
|
||||||
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
|
char *cipher_list13; /* list of TLS 1.3 cipher suites to use */
|
||||||
|
bit verifypeer:1; /* set TRUE if this is desired */
|
||||||
|
bit verifyhost:1; /* set TRUE if CN/SAN must match hostname */
|
||||||
|
bit verifystatus:1; /* set TRUE if certificate status must be checked */
|
||||||
|
bit sessionid:1; /* cache session IDs or not */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssl_config_data {
|
struct ssl_config_data {
|
||||||
struct ssl_primary_config primary;
|
struct ssl_primary_config primary;
|
||||||
bool enable_beast; /* especially allow this flaw for interoperability's
|
|
||||||
sake*/
|
|
||||||
bool no_revoke; /* disable SSL certificate revocation checks */
|
|
||||||
long certverifyresult; /* result from the certificate verification */
|
long certverifyresult; /* result from the certificate verification */
|
||||||
char *CRLfile; /* CRL to check certificate revocation */
|
char *CRLfile; /* CRL to check certificate revocation */
|
||||||
char *issuercert;/* optional issuer certificate filename */
|
char *issuercert;/* optional issuer certificate filename */
|
||||||
curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
|
curl_ssl_ctx_callback fsslctx; /* function to initialize ssl ctx */
|
||||||
void *fsslctxp; /* parameter for call back */
|
void *fsslctxp; /* parameter for call back */
|
||||||
bool certinfo; /* gather lots of certificate info */
|
|
||||||
bool falsestart;
|
|
||||||
|
|
||||||
char *cert; /* client certificate file name */
|
char *cert; /* client certificate file name */
|
||||||
char *cert_type; /* format for certificate (default: PEM)*/
|
char *cert_type; /* format for certificate (default: PEM)*/
|
||||||
char *key; /* private key file name */
|
char *key; /* private key file name */
|
||||||
char *key_type; /* format for private key (default: PEM) */
|
char *key_type; /* format for private key (default: PEM) */
|
||||||
char *key_passwd; /* plain text private key password */
|
char *key_passwd; /* plain text private key password */
|
||||||
|
|
||||||
#ifdef USE_TLS_SRP
|
#ifdef USE_TLS_SRP
|
||||||
char *username; /* TLS username (for, e.g., SRP) */
|
char *username; /* TLS username (for, e.g., SRP) */
|
||||||
char *password; /* TLS password (for, e.g., SRP) */
|
char *password; /* TLS password (for, e.g., SRP) */
|
||||||
enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
|
enum CURL_TLSAUTH authtype; /* TLS authentication type (default SRP) */
|
||||||
#endif
|
#endif
|
||||||
|
bit certinfo:1; /* gather lots of certificate info */
|
||||||
|
bit falsestart:1;
|
||||||
|
bit enable_beast:1; /* allow this flaw for interoperability's sake*/
|
||||||
|
bit no_revoke:1; /* disable SSL certificate revocation checks */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssl_general_config {
|
struct ssl_general_config {
|
||||||
@ -286,12 +286,12 @@ struct digestdata {
|
|||||||
char *cnonce;
|
char *cnonce;
|
||||||
char *realm;
|
char *realm;
|
||||||
int algo;
|
int algo;
|
||||||
bool stale; /* set true for re-negotiation */
|
|
||||||
char *opaque;
|
char *opaque;
|
||||||
char *qop;
|
char *qop;
|
||||||
char *algorithm;
|
char *algorithm;
|
||||||
int nc; /* nounce count */
|
int nc; /* nounce count */
|
||||||
bool userhash;
|
bit stale:1; /* set true for re-negotiation */
|
||||||
|
bit userhash:1;
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -389,70 +389,65 @@ struct negotiatedata {
|
|||||||
*/
|
*/
|
||||||
struct ConnectBits {
|
struct ConnectBits {
|
||||||
/* always modify bits.close with the connclose() and connkeep() macros! */
|
/* always modify bits.close with the connclose() and connkeep() macros! */
|
||||||
bool close; /* if set, we close the connection after this request */
|
|
||||||
bool reuse; /* if set, this is a re-used connection */
|
|
||||||
bool conn_to_host; /* if set, this connection has a "connect to host"
|
|
||||||
that overrides the host in the URL */
|
|
||||||
bool conn_to_port; /* if set, this connection has a "connect to port"
|
|
||||||
that overrides the port in the URL (remote port) */
|
|
||||||
bool proxy; /* if set, this transfer is done through a proxy - any type */
|
|
||||||
bool httpproxy; /* if set, this transfer is done through a http proxy */
|
|
||||||
bool socksproxy; /* if set, this transfer is done through a socks proxy */
|
|
||||||
bool user_passwd; /* do we use user+password for this connection? */
|
|
||||||
bool proxy_user_passwd; /* user+password for the proxy? */
|
|
||||||
bool ipv6_ip; /* we communicate with a remote site specified with pure IPv6
|
|
||||||
IP address */
|
|
||||||
bool ipv6; /* we communicate with a site using an IPv6 address */
|
|
||||||
|
|
||||||
bool do_more; /* this is set TRUE if the ->curl_do_more() function is
|
|
||||||
supposed to be called, after ->curl_do() */
|
|
||||||
bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
|
|
||||||
the first time on the first connect function call */
|
|
||||||
bool protoconnstart;/* the protocol layer has STARTED its operation after
|
|
||||||
the TCP layer connect */
|
|
||||||
|
|
||||||
bool retry; /* this connection is about to get closed and then
|
|
||||||
re-attempted at another connection. */
|
|
||||||
bool tunnel_proxy; /* if CONNECT is used to "tunnel" through the proxy.
|
|
||||||
This is implicit when SSL-protocols are used through
|
|
||||||
proxies, but can also be enabled explicitly by
|
|
||||||
apps */
|
|
||||||
bool authneg; /* TRUE when the auth phase has started, which means
|
|
||||||
that we are creating a request with an auth header,
|
|
||||||
but it is not the final request in the auth
|
|
||||||
negotiation. */
|
|
||||||
bool rewindaftersend;/* TRUE when the sending couldn't be stopped even
|
|
||||||
though it will be discarded. When the whole send
|
|
||||||
operation is done, we must call the data rewind
|
|
||||||
callback. */
|
|
||||||
bool ftp_use_epsv; /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
|
|
||||||
EPSV doesn't work we disable it for the forthcoming
|
|
||||||
requests */
|
|
||||||
|
|
||||||
bool ftp_use_eprt; /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
|
|
||||||
EPRT doesn't work we disable it for the forthcoming
|
|
||||||
requests */
|
|
||||||
bool ftp_use_data_ssl; /* Enabled SSL for the data connection */
|
|
||||||
bool netrc; /* name+password provided by netrc */
|
|
||||||
bool userpwd_in_url; /* name+password found in url */
|
|
||||||
bool stream_was_rewound; /* Indicates that the stream was rewound after a
|
|
||||||
request read past the end of its response byte
|
|
||||||
boundary */
|
|
||||||
bool proxy_connect_closed; /* set true if a proxy disconnected the
|
|
||||||
connection in a CONNECT request with auth, so
|
|
||||||
that libcurl should reconnect and continue. */
|
|
||||||
bool bound; /* set true if bind() has already been done on this socket/
|
|
||||||
connection */
|
|
||||||
bool type_set; /* type= was used in the URL */
|
|
||||||
bool multiplex; /* connection is multiplexed */
|
|
||||||
|
|
||||||
bool tcp_fastopen; /* use TCP Fast Open */
|
|
||||||
bool tls_enable_npn; /* TLS NPN extension? */
|
|
||||||
bool tls_enable_alpn; /* TLS ALPN extension? */
|
|
||||||
bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
|
bool proxy_ssl_connected[2]; /* TRUE when SSL initialization for HTTPS proxy
|
||||||
is complete */
|
is complete */
|
||||||
bool socksproxy_connecting; /* connecting through a socks proxy */
|
bool tcpconnect[2]; /* the TCP layer (or similar) is connected, this is set
|
||||||
bool connect_only;
|
the first time on the first connect function call */
|
||||||
|
bit close:1; /* if set, we close the connection after this request */
|
||||||
|
bit reuse:1; /* if set, this is a re-used connection */
|
||||||
|
bit conn_to_host:1; /* if set, this connection has a "connect to host"
|
||||||
|
that overrides the host in the URL */
|
||||||
|
bit conn_to_port:1; /* if set, this connection has a "connect to port"
|
||||||
|
that overrides the port in the URL (remote port) */
|
||||||
|
bit proxy:1; /* if set, this transfer is done through a proxy - any type */
|
||||||
|
bit httpproxy:1; /* if set, this transfer is done through a http proxy */
|
||||||
|
bit socksproxy:1; /* if set, this transfer is done through a socks proxy */
|
||||||
|
bit user_passwd:1; /* do we use user+password for this connection? */
|
||||||
|
bit proxy_user_passwd:1; /* user+password for the proxy? */
|
||||||
|
bit ipv6_ip:1; /* we communicate with a remote site specified with pure IPv6
|
||||||
|
IP address */
|
||||||
|
bit ipv6:1; /* we communicate with a site using an IPv6 address */
|
||||||
|
bit do_more:1; /* this is set TRUE if the ->curl_do_more() function is
|
||||||
|
supposed to be called, after ->curl_do() */
|
||||||
|
bit protoconnstart:1;/* the protocol layer has STARTED its operation after
|
||||||
|
the TCP layer connect */
|
||||||
|
bit retry:1; /* this connection is about to get closed and then
|
||||||
|
re-attempted at another connection. */
|
||||||
|
bit tunnel_proxy:1; /* if CONNECT is used to "tunnel" through the proxy.
|
||||||
|
This is implicit when SSL-protocols are used through
|
||||||
|
proxies, but can also be enabled explicitly by
|
||||||
|
apps */
|
||||||
|
bit authneg:1; /* TRUE when the auth phase has started, which means
|
||||||
|
that we are creating a request with an auth header,
|
||||||
|
but it is not the final request in the auth
|
||||||
|
negotiation. */
|
||||||
|
bit rewindaftersend:1;/* TRUE when the sending couldn't be stopped even
|
||||||
|
though it will be discarded. When the whole send
|
||||||
|
operation is done, we must call the data rewind
|
||||||
|
callback. */
|
||||||
|
bit ftp_use_epsv:1; /* As set with CURLOPT_FTP_USE_EPSV, but if we find out
|
||||||
|
EPSV doesn't work we disable it for the forthcoming
|
||||||
|
requests */
|
||||||
|
bit ftp_use_eprt:1; /* As set with CURLOPT_FTP_USE_EPRT, but if we find out
|
||||||
|
EPRT doesn't work we disable it for the forthcoming
|
||||||
|
requests */
|
||||||
|
bit ftp_use_data_ssl:1; /* Enabled SSL for the data connection */
|
||||||
|
bit netrc:1; /* name+password provided by netrc */
|
||||||
|
bit userpwd_in_url:1; /* name+password found in url */
|
||||||
|
bit stream_was_rewound:1; /* The stream was rewound after a request read
|
||||||
|
past the end of its response byte boundary */
|
||||||
|
bit proxy_connect_closed:1; /* TRUE if a proxy disconnected the connection
|
||||||
|
in a CONNECT request with auth, so that
|
||||||
|
libcurl should reconnect and continue. */
|
||||||
|
bit bound:1; /* set true if bind() has already been done on this socket/
|
||||||
|
connection */
|
||||||
|
bit type_set:1; /* type= was used in the URL */
|
||||||
|
bit multiplex:1; /* connection is multiplexed */
|
||||||
|
bit tcp_fastopen:1; /* use TCP Fast Open */
|
||||||
|
bit tls_enable_npn:1; /* TLS NPN extension? */
|
||||||
|
bit tls_enable_alpn:1; /* TLS ALPN extension? */
|
||||||
|
bit socksproxy_connecting:1; /* connecting through a socks proxy */
|
||||||
|
bit connect_only:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct hostname {
|
struct hostname {
|
||||||
@ -479,14 +474,13 @@ struct hostname {
|
|||||||
#define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE)
|
#define KEEP_RECVBITS (KEEP_RECV | KEEP_RECV_HOLD | KEEP_RECV_PAUSE)
|
||||||
#define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
|
#define KEEP_SENDBITS (KEEP_SEND | KEEP_SEND_HOLD | KEEP_SEND_PAUSE)
|
||||||
|
|
||||||
|
|
||||||
struct Curl_async {
|
struct Curl_async {
|
||||||
char *hostname;
|
char *hostname;
|
||||||
int port;
|
int port;
|
||||||
struct Curl_dns_entry *dns;
|
struct Curl_dns_entry *dns;
|
||||||
bool done; /* set TRUE when the lookup is complete */
|
|
||||||
int status; /* if done is TRUE, this is the status from the callback */
|
int status; /* if done is TRUE, this is the status from the callback */
|
||||||
void *os_specific; /* 'struct thread_data' for Windows */
|
void *os_specific; /* 'struct thread_data' for Windows */
|
||||||
|
bit done:1; /* set TRUE when the lookup is complete */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define FIRSTSOCKET 0
|
#define FIRSTSOCKET 0
|
||||||
@ -562,7 +556,6 @@ struct SingleRequest {
|
|||||||
|
|
||||||
struct curltime start; /* transfer started at this time */
|
struct curltime start; /* transfer started at this time */
|
||||||
struct curltime now; /* current time */
|
struct curltime now; /* current time */
|
||||||
bool header; /* incoming data has HTTP header */
|
|
||||||
enum {
|
enum {
|
||||||
HEADER_NORMAL, /* no bad header at all */
|
HEADER_NORMAL, /* no bad header at all */
|
||||||
HEADER_PARTHEADER, /* part of the chunk is a bad header, the rest
|
HEADER_PARTHEADER, /* part of the chunk is a bad header, the rest
|
||||||
@ -578,7 +571,6 @@ struct SingleRequest {
|
|||||||
char *str_start; /* within buf */
|
char *str_start; /* within buf */
|
||||||
char *end_ptr; /* within buf */
|
char *end_ptr; /* within buf */
|
||||||
char *p; /* within headerbuff */
|
char *p; /* within headerbuff */
|
||||||
bool content_range; /* set TRUE if Content-Range: was found */
|
|
||||||
curl_off_t offset; /* possible resume offset read from the
|
curl_off_t offset; /* possible resume offset read from the
|
||||||
Content-Range: header */
|
Content-Range: header */
|
||||||
int httpcode; /* error code from the 'HTTP/1.? XXX' or
|
int httpcode; /* error code from the 'HTTP/1.? XXX' or
|
||||||
@ -591,19 +583,9 @@ struct SingleRequest {
|
|||||||
/* See sec 3.5, RFC2616. */
|
/* See sec 3.5, RFC2616. */
|
||||||
time_t timeofdoc;
|
time_t timeofdoc;
|
||||||
long bodywrites;
|
long bodywrites;
|
||||||
|
|
||||||
char *buf;
|
char *buf;
|
||||||
curl_socket_t maxfd;
|
curl_socket_t maxfd;
|
||||||
|
|
||||||
int keepon;
|
int keepon;
|
||||||
|
|
||||||
bool upload_done; /* set to TRUE when doing chunked transfer-encoding upload
|
|
||||||
and we're uploading the last chunk */
|
|
||||||
|
|
||||||
bool ignorebody; /* we read a response-body but we ignore it! */
|
|
||||||
bool ignorecl; /* This HTTP response has no body so we ignore the Content-
|
|
||||||
Length: header */
|
|
||||||
|
|
||||||
char *location; /* This points to an allocated version of the Location:
|
char *location; /* This points to an allocated version of the Location:
|
||||||
header data */
|
header data */
|
||||||
char *newurl; /* Set to the new URL to use when a redirect or a retry is
|
char *newurl; /* Set to the new URL to use when a redirect or a retry is
|
||||||
@ -613,24 +595,28 @@ struct SingleRequest {
|
|||||||
still left in the buffer, aimed for upload. */
|
still left in the buffer, aimed for upload. */
|
||||||
ssize_t upload_present;
|
ssize_t upload_present;
|
||||||
|
|
||||||
/* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
|
/* 'upload_fromhere' is used as a read-pointer when we uploaded parts of a
|
||||||
buffer, so the next read should read from where this pointer points to,
|
buffer, so the next read should read from where this pointer points to,
|
||||||
and the 'upload_present' contains the number of bytes available at this
|
and the 'upload_present' contains the number of bytes available at this
|
||||||
position */
|
position */
|
||||||
char *upload_fromhere;
|
char *upload_fromhere;
|
||||||
|
|
||||||
bool chunk; /* if set, this is a chunked transfer-encoding */
|
|
||||||
bool upload_chunky; /* set TRUE if we are doing chunked transfer-encoding
|
|
||||||
on upload */
|
|
||||||
bool getheader; /* TRUE if header parsing is wanted */
|
|
||||||
|
|
||||||
bool forbidchunk; /* used only to explicitly forbid chunk-upload for
|
|
||||||
specific upload buffers. See readmoredata() in
|
|
||||||
http.c for details. */
|
|
||||||
|
|
||||||
void *protop; /* Allocated protocol-specific data. Each protocol
|
void *protop; /* Allocated protocol-specific data. Each protocol
|
||||||
handler makes sure this points to data it needs. */
|
handler makes sure this points to data it needs. */
|
||||||
struct dohdata doh; /* DoH specific data for this request */
|
struct dohdata doh; /* DoH specific data for this request */
|
||||||
|
bit header:1; /* incoming data has HTTP header */
|
||||||
|
bit content_range:1; /* set TRUE if Content-Range: was found */
|
||||||
|
bit upload_done:1; /* set to TRUE when doing chunked transfer-encoding
|
||||||
|
upload and we're uploading the last chunk */
|
||||||
|
bit ignorebody:1; /* we read a response-body but we ignore it! */
|
||||||
|
bit ignorecl:1; /* This HTTP response has no body so we ignore the
|
||||||
|
Content-Length: header */
|
||||||
|
bit chunk:1; /* if set, this is a chunked transfer-encoding */
|
||||||
|
bit upload_chunky:1; /* set TRUE if we are doing chunked transfer-encoding
|
||||||
|
on upload */
|
||||||
|
bit getheader:1; /* TRUE if header parsing is wanted */
|
||||||
|
bit forbidchunk:1; /* used only to explicitly forbid chunk-upload for
|
||||||
|
specific upload buffers. See readmoredata() in http.c
|
||||||
|
for details. */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -778,13 +764,13 @@ struct http_connect_state {
|
|||||||
char *line_start;
|
char *line_start;
|
||||||
char *ptr; /* where to store more data */
|
char *ptr; /* where to store more data */
|
||||||
curl_off_t cl; /* size of content to read and ignore */
|
curl_off_t cl; /* size of content to read and ignore */
|
||||||
bool chunked_encoding;
|
|
||||||
enum {
|
enum {
|
||||||
TUNNEL_INIT, /* init/default/no tunnel state */
|
TUNNEL_INIT, /* init/default/no tunnel state */
|
||||||
TUNNEL_CONNECT, /* CONNECT has been sent off */
|
TUNNEL_CONNECT, /* CONNECT has been sent off */
|
||||||
TUNNEL_COMPLETE /* CONNECT response received completely */
|
TUNNEL_COMPLETE /* CONNECT response received completely */
|
||||||
} tunnel_state;
|
} tunnel_state;
|
||||||
bool close_connection;
|
bit chunked_encoding:1;
|
||||||
|
bit close_connection:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -901,8 +887,6 @@ struct connectdata {
|
|||||||
#endif
|
#endif
|
||||||
struct ssl_primary_config ssl_config;
|
struct ssl_primary_config ssl_config;
|
||||||
struct ssl_primary_config proxy_ssl_config;
|
struct ssl_primary_config proxy_ssl_config;
|
||||||
bool tls_upgraded;
|
|
||||||
|
|
||||||
struct ConnectBits bits; /* various state-flags for this connection */
|
struct ConnectBits bits; /* various state-flags for this connection */
|
||||||
|
|
||||||
/* connecttime: when connect() is called on the current IP address. Used to
|
/* connecttime: when connect() is called on the current IP address. Used to
|
||||||
@ -949,7 +933,7 @@ struct connectdata {
|
|||||||
} allocptr;
|
} allocptr;
|
||||||
|
|
||||||
#ifdef HAVE_GSSAPI
|
#ifdef HAVE_GSSAPI
|
||||||
int sec_complete; /* if Kerberos is enabled for this connection */
|
bit sec_complete:1; /* if Kerberos is enabled for this connection */
|
||||||
enum protection_level command_prot;
|
enum protection_level command_prot;
|
||||||
enum protection_level data_prot;
|
enum protection_level data_prot;
|
||||||
enum protection_level request_data_prot;
|
enum protection_level request_data_prot;
|
||||||
@ -964,14 +948,6 @@ struct connectdata {
|
|||||||
struct kerberos5data krb5; /* variables into the structure definition, */
|
struct kerberos5data krb5; /* variables into the structure definition, */
|
||||||
#endif /* however, some of them are ftp specific. */
|
#endif /* however, some of them are ftp specific. */
|
||||||
|
|
||||||
/* the two following *_inuse fields are only flags, not counters in any way.
|
|
||||||
If TRUE it means the channel is in use, and if FALSE it means the channel
|
|
||||||
is up for grabs by one. */
|
|
||||||
|
|
||||||
bool readchannel_inuse; /* whether the read channel is in use by an easy
|
|
||||||
handle */
|
|
||||||
bool writechannel_inuse; /* whether the write channel is in use by an easy
|
|
||||||
handle */
|
|
||||||
struct curl_llist send_pipe; /* List of handles waiting to send on this
|
struct curl_llist send_pipe; /* List of handles waiting to send on this
|
||||||
pipeline */
|
pipeline */
|
||||||
struct curl_llist recv_pipe; /* List of handles waiting to read their
|
struct curl_llist recv_pipe; /* List of handles waiting to read their
|
||||||
@ -1047,8 +1023,16 @@ struct connectdata {
|
|||||||
|
|
||||||
#ifdef USE_UNIX_SOCKETS
|
#ifdef USE_UNIX_SOCKETS
|
||||||
char *unix_domain_socket;
|
char *unix_domain_socket;
|
||||||
bool abstract_unix_socket;
|
bit abstract_unix_socket:1;
|
||||||
#endif
|
#endif
|
||||||
|
bit tls_upgraded:1;
|
||||||
|
/* the two following *_inuse fields are only flags, not counters in any way.
|
||||||
|
If TRUE it means the channel is in use, and if FALSE it means the channel
|
||||||
|
is up for grabs by one. */
|
||||||
|
bit readchannel_inuse:1; /* whether the read channel is in use by an easy
|
||||||
|
handle */
|
||||||
|
bit writechannel_inuse:1; /* whether the write channel is in use by an easy
|
||||||
|
handle */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The end of connectdata. */
|
/* The end of connectdata. */
|
||||||
@ -1063,8 +1047,6 @@ struct PureInfo {
|
|||||||
int httpversion; /* the http version number X.Y = X*10+Y */
|
int httpversion; /* the http version number X.Y = X*10+Y */
|
||||||
time_t filetime; /* If requested, this is might get set. Set to -1 if the
|
time_t filetime; /* If requested, this is might get set. Set to -1 if the
|
||||||
time was unretrievable. */
|
time was unretrievable. */
|
||||||
bool timecond; /* set to TRUE if the time condition didn't match, which
|
|
||||||
thus made the document NOT get fetched */
|
|
||||||
long header_size; /* size of read header(s) in bytes */
|
long header_size; /* size of read header(s) in bytes */
|
||||||
long request_size; /* the amount of bytes sent in the request(s) */
|
long request_size; /* the amount of bytes sent in the request(s) */
|
||||||
unsigned long proxyauthavail; /* what proxy auth types were announced */
|
unsigned long proxyauthavail; /* what proxy auth types were announced */
|
||||||
@ -1083,16 +1065,16 @@ struct PureInfo {
|
|||||||
|
|
||||||
char conn_primary_ip[MAX_IPADR_LEN];
|
char conn_primary_ip[MAX_IPADR_LEN];
|
||||||
long conn_primary_port;
|
long conn_primary_port;
|
||||||
|
|
||||||
char conn_local_ip[MAX_IPADR_LEN];
|
char conn_local_ip[MAX_IPADR_LEN];
|
||||||
long conn_local_port;
|
long conn_local_port;
|
||||||
|
|
||||||
const char *conn_scheme;
|
const char *conn_scheme;
|
||||||
unsigned int conn_protocol;
|
unsigned int conn_protocol;
|
||||||
|
|
||||||
struct curl_certinfo certs; /* info about the certs, only populated in
|
struct curl_certinfo certs; /* info about the certs, only populated in
|
||||||
OpenSSL builds. Asked for with
|
OpenSSL builds. Asked for with
|
||||||
CURLOPT_CERTINFO / CURLINFO_CERTINFO */
|
CURLOPT_CERTINFO / CURLINFO_CERTINFO */
|
||||||
|
|
||||||
|
bit timecond:1; /* set to TRUE if the time condition didn't match, which
|
||||||
|
thus made the document NOT get fetched */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1106,7 +1088,6 @@ struct Progress {
|
|||||||
|
|
||||||
curl_off_t current_speed; /* uses the currently fastest transfer */
|
curl_off_t current_speed; /* uses the currently fastest transfer */
|
||||||
|
|
||||||
bool callback; /* set when progress callback is used */
|
|
||||||
int width; /* screen width at download start */
|
int width; /* screen width at download start */
|
||||||
int flags; /* see progress.h */
|
int flags; /* see progress.h */
|
||||||
|
|
||||||
@ -1127,7 +1108,6 @@ struct Progress {
|
|||||||
struct curltime t_startop;
|
struct curltime t_startop;
|
||||||
struct curltime t_acceptdata;
|
struct curltime t_acceptdata;
|
||||||
|
|
||||||
bool is_t_startransfer_set;
|
|
||||||
|
|
||||||
/* upload speed limit */
|
/* upload speed limit */
|
||||||
struct curltime ul_limit_start;
|
struct curltime ul_limit_start;
|
||||||
@ -1141,6 +1121,8 @@ struct Progress {
|
|||||||
curl_off_t speeder[ CURR_TIME ];
|
curl_off_t speeder[ CURR_TIME ];
|
||||||
struct curltime speeder_time[ CURR_TIME ];
|
struct curltime speeder_time[ CURR_TIME ];
|
||||||
int speeder_c;
|
int speeder_c;
|
||||||
|
bit callback:1; /* set when progress callback is used */
|
||||||
|
bit is_t_startransfer_set:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -1188,12 +1170,12 @@ struct auth {
|
|||||||
unsigned long picked;
|
unsigned long picked;
|
||||||
unsigned long avail; /* Bitmask for what the server reports to support for
|
unsigned long avail; /* Bitmask for what the server reports to support for
|
||||||
this resource */
|
this resource */
|
||||||
bool done; /* TRUE when the auth phase is done and ready to do the *actual*
|
bit done:1; /* TRUE when the auth phase is done and ready to do the
|
||||||
request */
|
*actual* request */
|
||||||
bool multipass; /* TRUE if this is not yet authenticated but within the
|
bit multipass:1; /* TRUE if this is not yet authenticated but within the
|
||||||
auth multipass negotiation */
|
auth multipass negotiation */
|
||||||
bool iestyle; /* TRUE if digest should be done IE-style or FALSE if it should
|
bit iestyle:1; /* TRUE if digest should be done IE-style or FALSE if it
|
||||||
be RFC compliant */
|
should be RFC compliant */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Curl_http2_dep {
|
struct Curl_http2_dep {
|
||||||
@ -1264,11 +1246,6 @@ struct UrlState {
|
|||||||
/* Points to the connection cache */
|
/* Points to the connection cache */
|
||||||
struct conncache *conn_cache;
|
struct conncache *conn_cache;
|
||||||
|
|
||||||
/* when curl_easy_perform() is called, the multi handle is "owned" by
|
|
||||||
the easy handle so curl_easy_cleanup() on such an easy handle will
|
|
||||||
also close the multi handle! */
|
|
||||||
bool multi_owned_by_easy;
|
|
||||||
|
|
||||||
/* buffers to store authentication data in, as parsed from input options */
|
/* buffers to store authentication data in, as parsed from input options */
|
||||||
struct curltime keeps_speed; /* for the progress meter really */
|
struct curltime keeps_speed; /* for the progress meter really */
|
||||||
|
|
||||||
@ -1281,8 +1258,6 @@ struct UrlState {
|
|||||||
char *ulbuf; /* allocated upload buffer or NULL */
|
char *ulbuf; /* allocated upload buffer or NULL */
|
||||||
curl_off_t current_speed; /* the ProgressShow() function sets this,
|
curl_off_t current_speed; /* the ProgressShow() function sets this,
|
||||||
bytes / second */
|
bytes / second */
|
||||||
bool this_is_a_follow; /* this is a followed Location: request */
|
|
||||||
bool refused_stream; /* this was refused, try again */
|
|
||||||
char *first_host; /* host name of the first (not followed) request.
|
char *first_host; /* host name of the first (not followed) request.
|
||||||
if set, this should be the host name that we will
|
if set, this should be the host name that we will
|
||||||
sent authorization to, no else. Used to make Location:
|
sent authorization to, no else. Used to make Location:
|
||||||
@ -1295,16 +1270,11 @@ struct UrlState {
|
|||||||
unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
|
unsigned int tempcount; /* number of entries in use in tempwrite, 0 - 3 */
|
||||||
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
|
struct tempbuf tempwrite[3]; /* BOTH, HEADER, BODY */
|
||||||
char *scratch; /* huge buffer[set.buffer_size*2] for upload CRLF replacing */
|
char *scratch; /* huge buffer[set.buffer_size*2] for upload CRLF replacing */
|
||||||
bool errorbuf; /* Set to TRUE if the error buffer is already filled in.
|
|
||||||
This must be set to FALSE every time _easy_perform() is
|
|
||||||
called. */
|
|
||||||
int os_errno; /* filled in with errno whenever an error occurs */
|
int os_errno; /* filled in with errno whenever an error occurs */
|
||||||
#ifdef HAVE_SIGNAL
|
#ifdef HAVE_SIGNAL
|
||||||
/* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
|
/* storage for the previous bag^H^H^HSIGPIPE signal handler :-) */
|
||||||
void (*prev_signal)(int sig);
|
void (*prev_signal)(int sig);
|
||||||
#endif
|
#endif
|
||||||
bool allow_port; /* Is set.use_port allowed to take effect or not. This
|
|
||||||
is always set TRUE when curl_easy_perform() is called. */
|
|
||||||
struct digestdata digest; /* state data for host Digest auth */
|
struct digestdata digest; /* state data for host Digest auth */
|
||||||
struct digestdata proxydigest; /* state data for proxy Digest auth */
|
struct digestdata proxydigest; /* state data for proxy Digest auth */
|
||||||
|
|
||||||
@ -1316,8 +1286,6 @@ struct UrlState {
|
|||||||
struct auth authhost; /* auth details for host */
|
struct auth authhost; /* auth details for host */
|
||||||
struct auth authproxy; /* auth details for proxy */
|
struct auth authproxy; /* auth details for proxy */
|
||||||
|
|
||||||
bool authproblem; /* TRUE if there's some problem authenticating */
|
|
||||||
|
|
||||||
void *resolver; /* resolver state, if it is used in the URL state -
|
void *resolver; /* resolver state, if it is used in the URL state -
|
||||||
ares_channel f.e. */
|
ares_channel f.e. */
|
||||||
|
|
||||||
@ -1333,27 +1301,18 @@ struct UrlState {
|
|||||||
/* a place to store the most recently set FTP entrypath */
|
/* a place to store the most recently set FTP entrypath */
|
||||||
char *most_recent_ftp_entrypath;
|
char *most_recent_ftp_entrypath;
|
||||||
|
|
||||||
/* set after initial USER failure, to prevent an authentication loop */
|
|
||||||
bool ftp_trying_alternative;
|
|
||||||
bool wildcardmatch; /* enable wildcard matching */
|
|
||||||
int httpversion; /* the lowest HTTP version*10 reported by any server
|
int httpversion; /* the lowest HTTP version*10 reported by any server
|
||||||
involved in this request */
|
involved in this request */
|
||||||
bool expect100header; /* TRUE if we added Expect: 100-continue */
|
|
||||||
|
|
||||||
#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
|
#if !defined(WIN32) && !defined(MSDOS) && !defined(__EMX__) && \
|
||||||
!defined(__SYMBIAN32__)
|
!defined(__SYMBIAN32__)
|
||||||
/* do FTP line-end conversions on most platforms */
|
/* do FTP line-end conversions on most platforms */
|
||||||
#define CURL_DO_LINEEND_CONV
|
#define CURL_DO_LINEEND_CONV
|
||||||
/* for FTP downloads: track CRLF sequences that span blocks */
|
/* for FTP downloads: track CRLF sequences that span blocks */
|
||||||
bool prev_block_had_trailing_cr;
|
bit prev_block_had_trailing_cr:1;
|
||||||
/* for FTP downloads: how many CRLFs did we converted to LFs? */
|
/* for FTP downloads: how many CRLFs did we converted to LFs? */
|
||||||
curl_off_t crlf_conversions;
|
curl_off_t crlf_conversions;
|
||||||
#endif
|
#endif
|
||||||
bool slash_removed; /* set TRUE if the 'path' points to a path where the
|
|
||||||
initial URL slash separator has been taken off */
|
|
||||||
bool use_range;
|
|
||||||
bool rangestringalloc; /* the range string is malloc()'ed */
|
|
||||||
|
|
||||||
char *range; /* range, if used. See README for detailed specification on
|
char *range; /* range, if used. See README for detailed specification on
|
||||||
this syntax. */
|
this syntax. */
|
||||||
curl_off_t resume_from; /* continue [ftp] transfer from here */
|
curl_off_t resume_from; /* continue [ftp] transfer from here */
|
||||||
@ -1369,19 +1328,12 @@ struct UrlState {
|
|||||||
size_t drain; /* Increased when this stream has data to read, even if its
|
size_t drain; /* Increased when this stream has data to read, even if its
|
||||||
socket is not necessarily is readable. Decreased when
|
socket is not necessarily is readable. Decreased when
|
||||||
checked. */
|
checked. */
|
||||||
bool done; /* set to FALSE when Curl_init_do() is called and set to TRUE
|
|
||||||
when multi_done() is called, to prevent multi_done() to get
|
|
||||||
invoked twice when the multi interface is used. */
|
|
||||||
|
|
||||||
curl_read_callback fread_func; /* read callback/function */
|
curl_read_callback fread_func; /* read callback/function */
|
||||||
void *in; /* CURLOPT_READDATA */
|
void *in; /* CURLOPT_READDATA */
|
||||||
|
|
||||||
struct Curl_easy *stream_depends_on;
|
struct Curl_easy *stream_depends_on;
|
||||||
bool stream_depends_e; /* set or don't set the Exclusive bit */
|
|
||||||
int stream_weight;
|
int stream_weight;
|
||||||
#ifdef CURLDEBUG
|
|
||||||
bool conncache_lock;
|
|
||||||
#endif
|
|
||||||
CURLU *uh; /* URL handle for the current parsed URL */
|
CURLU *uh; /* URL handle for the current parsed URL */
|
||||||
struct urlpieces up;
|
struct urlpieces up;
|
||||||
#ifndef CURL_DISABLE_HTTP
|
#ifndef CURL_DISABLE_HTTP
|
||||||
@ -1391,6 +1343,32 @@ struct UrlState {
|
|||||||
#endif
|
#endif
|
||||||
trailers_state trailers_state; /* whether we are sending trailers
|
trailers_state trailers_state; /* whether we are sending trailers
|
||||||
and what stage are we at */
|
and what stage are we at */
|
||||||
|
#ifdef CURLDEBUG
|
||||||
|
bit conncache_lock:1;
|
||||||
|
#endif
|
||||||
|
/* when curl_easy_perform() is called, the multi handle is "owned" by
|
||||||
|
the easy handle so curl_easy_cleanup() on such an easy handle will
|
||||||
|
also close the multi handle! */
|
||||||
|
bit multi_owned_by_easy:1;
|
||||||
|
|
||||||
|
bit this_is_a_follow:1; /* this is a followed Location: request */
|
||||||
|
bit refused_stream:1; /* this was refused, try again */
|
||||||
|
bit errorbuf:1; /* Set to TRUE if the error buffer is already filled in.
|
||||||
|
This must be set to FALSE every time _easy_perform() is
|
||||||
|
called. */
|
||||||
|
bit allow_port:1; /* Is set.use_port allowed to take effect or not. This
|
||||||
|
is always set TRUE when curl_easy_perform() is called. */
|
||||||
|
bit authproblem:1; /* TRUE if there's some problem authenticating */
|
||||||
|
/* set after initial USER failure, to prevent an authentication loop */
|
||||||
|
bit ftp_trying_alternative:1;
|
||||||
|
bit wildcardmatch:1; /* enable wildcard matching */
|
||||||
|
bit expect100header:1; /* TRUE if we added Expect: 100-continue */
|
||||||
|
bit use_range:1;
|
||||||
|
bit rangestringalloc:1; /* the range string is malloc()'ed */
|
||||||
|
bit done:1; /* set to FALSE when Curl_init_do() is called and set to TRUE
|
||||||
|
when multi_done() is called, to prevent multi_done() to get
|
||||||
|
invoked twice when the multi interface is used. */
|
||||||
|
bit stream_depends_e:1; /* set or don't set the Exclusive bit */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1403,14 +1381,15 @@ struct UrlState {
|
|||||||
|
|
||||||
struct DynamicStatic {
|
struct DynamicStatic {
|
||||||
char *url; /* work URL, copied from UserDefined */
|
char *url; /* work URL, copied from UserDefined */
|
||||||
bool url_alloc; /* URL string is malloc()'ed */
|
|
||||||
char *referer; /* referer string */
|
char *referer; /* referer string */
|
||||||
bool referer_alloc; /* referer string is malloc()ed */
|
|
||||||
struct curl_slist *cookielist; /* list of cookie files set by
|
struct curl_slist *cookielist; /* list of cookie files set by
|
||||||
curl_easy_setopt(COOKIEFILE) calls */
|
curl_easy_setopt(COOKIEFILE) calls */
|
||||||
struct curl_slist *resolve; /* set to point to the set.resolve list when
|
struct curl_slist *resolve; /* set to point to the set.resolve list when
|
||||||
this should be dealt with in pretransfer */
|
this should be dealt with in pretransfer */
|
||||||
bool wildcard_resolve; /* Set to true if any resolve change is a wildcard */
|
bit url_alloc:1; /* URL string is malloc()'ed */
|
||||||
|
bit referer_alloc:1; /* referer string is malloc()ed */
|
||||||
|
bit wildcard_resolve:1; /* Set to true if any resolve change is a
|
||||||
|
wildcard */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1540,8 +1519,6 @@ struct UserDefined {
|
|||||||
|
|
||||||
int keep_post; /* keep POSTs as POSTs after a 30x request; each
|
int keep_post; /* keep POSTs as POSTs after a 30x request; each
|
||||||
bit represents a request, from 301 to 303 */
|
bit represents a request, from 301 to 303 */
|
||||||
bool free_referer; /* set TRUE if 'referer' points to a string we
|
|
||||||
allocated */
|
|
||||||
void *postfields; /* if POST, set the fields' values here */
|
void *postfields; /* if POST, set the fields' values here */
|
||||||
curl_seek_callback seek_func; /* function that seeks the input */
|
curl_seek_callback seek_func; /* function that seeks the input */
|
||||||
curl_off_t postfieldsize; /* if POST, this might have a size to use instead
|
curl_off_t postfieldsize; /* if POST, this might have a size to use instead
|
||||||
@ -1554,8 +1531,6 @@ struct UserDefined {
|
|||||||
curl_write_callback fwrite_header; /* function that stores headers */
|
curl_write_callback fwrite_header; /* function that stores headers */
|
||||||
curl_write_callback fwrite_rtp; /* function that stores interleaved RTP */
|
curl_write_callback fwrite_rtp; /* function that stores interleaved RTP */
|
||||||
curl_read_callback fread_func_set; /* function that reads the input */
|
curl_read_callback fread_func_set; /* function that reads the input */
|
||||||
int is_fread_set; /* boolean, has read callback been set to non-NULL? */
|
|
||||||
int is_fwrite_set; /* boolean, has write callback been set to non-NULL? */
|
|
||||||
curl_progress_callback fprogress; /* OLD and deprecated progress callback */
|
curl_progress_callback fprogress; /* OLD and deprecated progress callback */
|
||||||
curl_xferinfo_callback fxferinfo; /* progress callback */
|
curl_xferinfo_callback fxferinfo; /* progress callback */
|
||||||
curl_debug_callback fdebug; /* function that write informational data */
|
curl_debug_callback fdebug; /* function that write informational data */
|
||||||
@ -1587,7 +1562,6 @@ struct UserDefined {
|
|||||||
long happy_eyeballs_timeout; /* in milliseconds, 0 is a valid value */
|
long happy_eyeballs_timeout; /* in milliseconds, 0 is a valid value */
|
||||||
long server_response_timeout; /* in milliseconds, 0 means no timeout */
|
long server_response_timeout; /* in milliseconds, 0 means no timeout */
|
||||||
long tftp_blksize; /* in bytes, 0 means use default */
|
long tftp_blksize; /* in bytes, 0 means use default */
|
||||||
bool tftp_no_options; /* do not send TFTP options requests */
|
|
||||||
curl_off_t filesize; /* size of file to upload, -1 means unknown */
|
curl_off_t filesize; /* size of file to upload, -1 means unknown */
|
||||||
long low_speed_limit; /* bytes/second */
|
long low_speed_limit; /* bytes/second */
|
||||||
long low_speed_time; /* number of seconds */
|
long low_speed_time; /* number of seconds */
|
||||||
@ -1599,9 +1573,6 @@ struct UserDefined {
|
|||||||
struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
|
struct curl_slist *proxyheaders; /* linked list of extra CONNECT headers */
|
||||||
struct curl_httppost *httppost; /* linked list of old POST data */
|
struct curl_httppost *httppost; /* linked list of old POST data */
|
||||||
curl_mimepart mimepost; /* MIME/POST data. */
|
curl_mimepart mimepost; /* MIME/POST data. */
|
||||||
bool sep_headers; /* handle host and proxy headers separately */
|
|
||||||
bool cookiesession; /* new cookie session? */
|
|
||||||
bool crlf; /* convert crlf on ftp upload(?) */
|
|
||||||
struct curl_slist *quote; /* after connection is established */
|
struct curl_slist *quote; /* after connection is established */
|
||||||
struct curl_slist *postquote; /* after the transfer */
|
struct curl_slist *postquote; /* after the transfer */
|
||||||
struct curl_slist *prequote; /* before the transfer, after type */
|
struct curl_slist *prequote; /* before the transfer, after type */
|
||||||
@ -1620,7 +1591,6 @@ struct UserDefined {
|
|||||||
Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
|
Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
|
||||||
long httpversion; /* when non-zero, a specific HTTP version requested to
|
long httpversion; /* when non-zero, a specific HTTP version requested to
|
||||||
be used in the library's request(s) */
|
be used in the library's request(s) */
|
||||||
bool strip_path_slash; /* strip off initial slash from path */
|
|
||||||
struct ssl_config_data ssl; /* user defined SSL stuff */
|
struct ssl_config_data ssl; /* user defined SSL stuff */
|
||||||
struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */
|
struct ssl_config_data proxy_ssl; /* user defined SSL stuff for proxy */
|
||||||
struct ssl_general_config general_ssl; /* general user defined SSL stuff */
|
struct ssl_general_config general_ssl; /* general user defined SSL stuff */
|
||||||
@ -1630,87 +1600,33 @@ struct UserDefined {
|
|||||||
size_t upload_buffer_size; /* size of upload buffer to use,
|
size_t upload_buffer_size; /* size of upload buffer to use,
|
||||||
keep it >= CURL_MAX_WRITE_SIZE */
|
keep it >= CURL_MAX_WRITE_SIZE */
|
||||||
void *private_data; /* application-private data */
|
void *private_data; /* application-private data */
|
||||||
|
|
||||||
struct curl_slist *http200aliases; /* linked list of aliases for http200 */
|
struct curl_slist *http200aliases; /* linked list of aliases for http200 */
|
||||||
|
|
||||||
long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
|
long ipver; /* the CURL_IPRESOLVE_* defines in the public header file
|
||||||
0 - whatever, 1 - v2, 2 - v6 */
|
0 - whatever, 1 - v2, 2 - v6 */
|
||||||
|
|
||||||
curl_off_t max_filesize; /* Maximum file size to download */
|
curl_off_t max_filesize; /* Maximum file size to download */
|
||||||
|
|
||||||
curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used */
|
curl_ftpfile ftp_filemethod; /* how to get to a file when FTP is used */
|
||||||
|
|
||||||
int ftp_create_missing_dirs; /* 1 - create directories that don't exist
|
int ftp_create_missing_dirs; /* 1 - create directories that don't exist
|
||||||
2 - the same but also allow MKD to fail once
|
2 - the same but also allow MKD to fail once
|
||||||
*/
|
*/
|
||||||
|
|
||||||
curl_sshkeycallback ssh_keyfunc; /* key matching callback */
|
curl_sshkeycallback ssh_keyfunc; /* key matching callback */
|
||||||
void *ssh_keyfunc_userp; /* custom pointer to callback */
|
void *ssh_keyfunc_userp; /* custom pointer to callback */
|
||||||
bool ssh_compression; /* enable SSH compression */
|
|
||||||
|
|
||||||
/* Here follows boolean settings that define how to behave during
|
|
||||||
this session. They are STATIC, set by libcurl users or at least initially
|
|
||||||
and they don't change during operations. */
|
|
||||||
bool get_filetime; /* get the time and get of the remote file */
|
|
||||||
bool tunnel_thru_httpproxy; /* use CONNECT through a HTTP proxy */
|
|
||||||
bool prefer_ascii; /* ASCII rather than binary */
|
|
||||||
bool ftp_append; /* append, not overwrite, on upload */
|
|
||||||
bool ftp_list_only; /* switch FTP command for listing directories */
|
|
||||||
bool ftp_use_port; /* use the FTP PORT command */
|
|
||||||
bool hide_progress; /* don't use the progress meter */
|
|
||||||
bool http_fail_on_error; /* fail on HTTP error codes >= 400 */
|
|
||||||
bool http_keep_sending_on_error; /* for HTTP status codes >= 300 */
|
|
||||||
bool http_follow_location; /* follow HTTP redirects */
|
|
||||||
bool http_transfer_encoding; /* request compressed HTTP transfer-encoding */
|
|
||||||
bool allow_auth_to_other_hosts;
|
|
||||||
bool include_header; /* include received protocol headers in data output */
|
|
||||||
bool http_set_referer; /* is a custom referer used */
|
|
||||||
bool http_auto_referer; /* set "correct" referer when following location: */
|
|
||||||
bool opt_no_body; /* as set with CURLOPT_NOBODY */
|
|
||||||
bool upload; /* upload request */
|
|
||||||
enum CURL_NETRC_OPTION
|
enum CURL_NETRC_OPTION
|
||||||
use_netrc; /* defined in include/curl.h */
|
use_netrc; /* defined in include/curl.h */
|
||||||
bool verbose; /* output verbosity */
|
|
||||||
bool krb; /* Kerberos connection requested */
|
|
||||||
bool reuse_forbid; /* forbidden to be reused, close after use */
|
|
||||||
bool reuse_fresh; /* do not re-use an existing connection */
|
|
||||||
bool ftp_use_epsv; /* if EPSV is to be attempted or not */
|
|
||||||
bool ftp_use_eprt; /* if EPRT is to be attempted or not */
|
|
||||||
bool ftp_use_pret; /* if PRET is to be used before PASV or not */
|
|
||||||
|
|
||||||
curl_usessl use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
|
curl_usessl use_ssl; /* if AUTH TLS is to be attempted etc, for FTP or
|
||||||
IMAP or POP3 or others! */
|
IMAP or POP3 or others! */
|
||||||
curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
|
curl_ftpauth ftpsslauth; /* what AUTH XXX to be attempted */
|
||||||
curl_ftpccc ftp_ccc; /* FTP CCC options */
|
curl_ftpccc ftp_ccc; /* FTP CCC options */
|
||||||
bool no_signal; /* do not use any signal/alarm handler */
|
|
||||||
bool global_dns_cache; /* subject for future removal */
|
|
||||||
bool tcp_nodelay; /* whether to enable TCP_NODELAY or not */
|
|
||||||
bool ignorecl; /* ignore content length */
|
|
||||||
bool ftp_skip_ip; /* skip the IP address the FTP server passes on to
|
|
||||||
us */
|
|
||||||
bool connect_only; /* make connection, let application use the socket */
|
|
||||||
long ssh_auth_types; /* allowed SSH auth types */
|
|
||||||
bool http_te_skip; /* pass the raw body data to the user, even when
|
|
||||||
transfer-encoded (chunked, compressed) */
|
|
||||||
bool http_ce_skip; /* pass the raw body data to the user, even when
|
|
||||||
content-encoded (chunked, compressed) */
|
|
||||||
long new_file_perms; /* Permissions to use when creating remote files */
|
long new_file_perms; /* Permissions to use when creating remote files */
|
||||||
long new_directory_perms; /* Permissions to use when creating remote dirs */
|
long new_directory_perms; /* Permissions to use when creating remote dirs */
|
||||||
bool proxy_transfer_mode; /* set transfer mode (;type=<a|i>) when doing FTP
|
long ssh_auth_types; /* allowed SSH auth types */
|
||||||
via an HTTP proxy */
|
|
||||||
char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
|
char *str[STRING_LAST]; /* array of strings, pointing to allocated memory */
|
||||||
unsigned int scope_id; /* Scope id for IPv6 */
|
unsigned int scope_id; /* Scope id for IPv6 */
|
||||||
long allowed_protocols;
|
long allowed_protocols;
|
||||||
long redir_protocols;
|
long redir_protocols;
|
||||||
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
|
|
||||||
bool socks5_gssapi_nec; /* Flag to support NEC SOCKS5 server */
|
|
||||||
#endif
|
|
||||||
struct curl_slist *mail_rcpt; /* linked list of mail recipients */
|
struct curl_slist *mail_rcpt; /* linked list of mail recipients */
|
||||||
bool sasl_ir; /* Enable/disable SASL initial response */
|
|
||||||
/* Common RTSP header options */
|
/* Common RTSP header options */
|
||||||
Curl_RtspReq rtspreq; /* RTSP request type */
|
Curl_RtspReq rtspreq; /* RTSP request type */
|
||||||
long rtspversion; /* like httpversion, for RTSP */
|
long rtspversion; /* like httpversion, for RTSP */
|
||||||
bool wildcard_enabled; /* enable wildcard matching */
|
|
||||||
curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
|
curl_chunk_bgn_callback chunk_bgn; /* called before part of transfer
|
||||||
starts */
|
starts */
|
||||||
curl_chunk_end_callback chunk_end; /* called after part transferring
|
curl_chunk_end_callback chunk_end; /* called after part transferring
|
||||||
@ -1722,47 +1638,102 @@ struct UserDefined {
|
|||||||
long gssapi_delegation; /* GSS-API credential delegation, see the
|
long gssapi_delegation; /* GSS-API credential delegation, see the
|
||||||
documentation of CURLOPT_GSSAPI_DELEGATION */
|
documentation of CURLOPT_GSSAPI_DELEGATION */
|
||||||
|
|
||||||
bool tcp_keepalive; /* use TCP keepalives */
|
|
||||||
long tcp_keepidle; /* seconds in idle before sending keepalive probe */
|
long tcp_keepidle; /* seconds in idle before sending keepalive probe */
|
||||||
long tcp_keepintvl; /* seconds between TCP keepalive probes */
|
long tcp_keepintvl; /* seconds between TCP keepalive probes */
|
||||||
bool tcp_fastopen; /* use TCP Fast Open */
|
|
||||||
|
|
||||||
size_t maxconnects; /* Max idle connections in the connection cache */
|
size_t maxconnects; /* Max idle connections in the connection cache */
|
||||||
|
|
||||||
bool ssl_enable_npn; /* TLS NPN extension? */
|
|
||||||
bool ssl_enable_alpn; /* TLS ALPN extension? */
|
|
||||||
bool path_as_is; /* allow dotdots? */
|
|
||||||
bool pipewait; /* wait for pipe/multiplex status before starting a
|
|
||||||
new connection */
|
|
||||||
long expect_100_timeout; /* in milliseconds */
|
long expect_100_timeout; /* in milliseconds */
|
||||||
bool suppress_connect_headers; /* suppress proxy CONNECT response headers
|
|
||||||
from user callbacks */
|
|
||||||
|
|
||||||
bool dns_shuffle_addresses; /* whether to shuffle addresses before use */
|
|
||||||
|
|
||||||
struct Curl_easy *stream_depends_on;
|
struct Curl_easy *stream_depends_on;
|
||||||
bool stream_depends_e; /* set or don't set the Exclusive bit */
|
|
||||||
int stream_weight;
|
int stream_weight;
|
||||||
|
|
||||||
bool haproxyprotocol; /* whether to send HAProxy PROXY protocol v1 header */
|
|
||||||
|
|
||||||
struct Curl_http2_dep *stream_dependents;
|
struct Curl_http2_dep *stream_dependents;
|
||||||
|
|
||||||
bool abstract_unix_socket;
|
|
||||||
|
|
||||||
curl_resolver_start_callback resolver_start; /* optional callback called
|
curl_resolver_start_callback resolver_start; /* optional callback called
|
||||||
before resolver start */
|
before resolver start */
|
||||||
void *resolver_start_client; /* pointer to pass to resolver start callback */
|
void *resolver_start_client; /* pointer to pass to resolver start callback */
|
||||||
bool disallow_username_in_url; /* disallow username in url */
|
|
||||||
long upkeep_interval_ms; /* Time between calls for connection upkeep. */
|
long upkeep_interval_ms; /* Time between calls for connection upkeep. */
|
||||||
bool doh; /* DNS-over-HTTPS enabled */
|
|
||||||
bool doh_get; /* use GET for DoH requests, instead of POST */
|
|
||||||
bool http09_allowed; /* allow HTTP/0.9 responses */
|
|
||||||
multidone_func fmultidone;
|
multidone_func fmultidone;
|
||||||
struct Curl_easy *dohfor; /* this is a DoH request for that transfer */
|
struct Curl_easy *dohfor; /* this is a DoH request for that transfer */
|
||||||
CURLU *uh; /* URL handle for the current parsed URL */
|
CURLU *uh; /* URL handle for the current parsed URL */
|
||||||
void *trailer_data; /* pointer to pass to trailer data callback */
|
void *trailer_data; /* pointer to pass to trailer data callback */
|
||||||
curl_trailer_callback trailer_callback; /* trailing data callback */
|
curl_trailer_callback trailer_callback; /* trailing data callback */
|
||||||
|
bit is_fread_set:1; /* has read callback been set to non-NULL? */
|
||||||
|
bit is_fwrite_set:1; /* has write callback been set to non-NULL? */
|
||||||
|
bit free_referer:1; /* set TRUE if 'referer' points to a string we
|
||||||
|
allocated */
|
||||||
|
bit tftp_no_options:1; /* do not send TFTP options requests */
|
||||||
|
bit sep_headers:1; /* handle host and proxy headers separately */
|
||||||
|
bit cookiesession:1; /* new cookie session? */
|
||||||
|
bit crlf:1; /* convert crlf on ftp upload(?) */
|
||||||
|
bit strip_path_slash:1; /* strip off initial slash from path */
|
||||||
|
bit ssh_compression:1; /* enable SSH compression */
|
||||||
|
|
||||||
|
/* Here follows boolean settings that define how to behave during
|
||||||
|
this session. They are STATIC, set by libcurl users or at least initially
|
||||||
|
and they don't change during operations. */
|
||||||
|
bit get_filetime:1; /* get the time and get of the remote file */
|
||||||
|
bit tunnel_thru_httpproxy:1; /* use CONNECT through a HTTP proxy */
|
||||||
|
bit prefer_ascii:1; /* ASCII rather than binary */
|
||||||
|
bit ftp_append:1; /* append, not overwrite, on upload */
|
||||||
|
bit ftp_list_only:1; /* switch FTP command for listing directories */
|
||||||
|
bit ftp_use_port:1; /* use the FTP PORT command */
|
||||||
|
bit hide_progress:1; /* don't use the progress meter */
|
||||||
|
bit http_fail_on_error:1; /* fail on HTTP error codes >= 400 */
|
||||||
|
bit http_keep_sending_on_error:1; /* for HTTP status codes >= 300 */
|
||||||
|
bit http_follow_location:1; /* follow HTTP redirects */
|
||||||
|
bit http_transfer_encoding:1; /* request compressed HTTP
|
||||||
|
transfer-encoding */
|
||||||
|
bit allow_auth_to_other_hosts:1;
|
||||||
|
bit include_header:1; /* include received protocol headers in data output */
|
||||||
|
bit http_set_referer:1; /* is a custom referer used */
|
||||||
|
bit http_auto_referer:1; /* set "correct" referer when following
|
||||||
|
location: */
|
||||||
|
bit opt_no_body:1; /* as set with CURLOPT_NOBODY */
|
||||||
|
bit upload:1; /* upload request */
|
||||||
|
bit verbose:1; /* output verbosity */
|
||||||
|
bit krb:1; /* Kerberos connection requested */
|
||||||
|
bit reuse_forbid:1; /* forbidden to be reused, close after use */
|
||||||
|
bit reuse_fresh:1; /* do not re-use an existing connection */
|
||||||
|
bit ftp_use_epsv:1; /* if EPSV is to be attempted or not */
|
||||||
|
bit ftp_use_eprt:1; /* if EPRT is to be attempted or not */
|
||||||
|
bit ftp_use_pret:1; /* if PRET is to be used before PASV or not */
|
||||||
|
|
||||||
|
bit no_signal:1; /* do not use any signal/alarm handler */
|
||||||
|
bit global_dns_cache:1; /* subject for future removal */
|
||||||
|
bit tcp_nodelay:1; /* whether to enable TCP_NODELAY or not */
|
||||||
|
bit ignorecl:1; /* ignore content length */
|
||||||
|
bit ftp_skip_ip:1; /* skip the IP address the FTP server passes on to
|
||||||
|
us */
|
||||||
|
bit connect_only:1; /* make connection, let application use the socket */
|
||||||
|
bit http_te_skip:1; /* pass the raw body data to the user, even when
|
||||||
|
transfer-encoded (chunked, compressed) */
|
||||||
|
bit http_ce_skip:1; /* pass the raw body data to the user, even when
|
||||||
|
content-encoded (chunked, compressed) */
|
||||||
|
bit proxy_transfer_mode:1; /* set transfer mode (;type=<a|i>) when doing
|
||||||
|
FTP via an HTTP proxy */
|
||||||
|
#if defined(HAVE_GSSAPI) || defined(USE_WINDOWS_SSPI)
|
||||||
|
bit socks5_gssapi_nec:1; /* Flag to support NEC SOCKS5 server */
|
||||||
|
#endif
|
||||||
|
bit sasl_ir:1; /* Enable/disable SASL initial response */
|
||||||
|
bit wildcard_enabled:1; /* enable wildcard matching */
|
||||||
|
bit tcp_keepalive:1; /* use TCP keepalives */
|
||||||
|
bit tcp_fastopen:1; /* use TCP Fast Open */
|
||||||
|
bit ssl_enable_npn:1; /* TLS NPN extension? */
|
||||||
|
bit ssl_enable_alpn:1;/* TLS ALPN extension? */
|
||||||
|
bit path_as_is:1; /* allow dotdots? */
|
||||||
|
bit pipewait:1; /* wait for pipe/multiplex status before starting a
|
||||||
|
new connection */
|
||||||
|
bit suppress_connect_headers:1; /* suppress proxy CONNECT response headers
|
||||||
|
from user callbacks */
|
||||||
|
bit dns_shuffle_addresses:1; /* whether to shuffle addresses before use */
|
||||||
|
bit stream_depends_e:1; /* set or don't set the Exclusive bit */
|
||||||
|
bit haproxyprotocol:1; /* whether to send HAProxy PROXY protocol v1
|
||||||
|
header */
|
||||||
|
bit abstract_unix_socket:1;
|
||||||
|
bit disallow_username_in_url:1; /* disallow username in url */
|
||||||
|
bit doh:1; /* DNS-over-HTTPS enabled */
|
||||||
|
bit doh_get:1; /* use GET for DoH requests, instead of POST */
|
||||||
|
bit http09_allowed:1; /* allow HTTP/0.9 responses */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Names {
|
struct Names {
|
||||||
|
Loading…
Reference in New Issue
Block a user