mirror of
https://github.com/moparisthebest/curl
synced 2025-01-10 21:48:10 -05:00
Curl_handler: add 'family' to each protocol
Makes get_protocol_family() faster and it moves the knowledge about the "families" to each protocol handler, where it belongs. Closes #5986
This commit is contained in:
parent
2e645e21de
commit
6434a73984
@ -5,7 +5,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2012 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2012 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2010, Howard Chu, <hyc@highlandsun.com>
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
@ -79,6 +79,7 @@ const struct Curl_handler Curl_handler_rtmp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMP, /* defport */
|
||||
CURLPROTO_RTMP, /* protocol */
|
||||
CURLPROTO_RTMP, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
@ -100,6 +101,7 @@ const struct Curl_handler Curl_handler_rtmpt = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMPT, /* defport */
|
||||
CURLPROTO_RTMPT, /* protocol */
|
||||
CURLPROTO_RTMPT, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
@ -121,6 +123,7 @@ const struct Curl_handler Curl_handler_rtmpe = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMP, /* defport */
|
||||
CURLPROTO_RTMPE, /* protocol */
|
||||
CURLPROTO_RTMPE, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
@ -142,6 +145,7 @@ const struct Curl_handler Curl_handler_rtmpte = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMPT, /* defport */
|
||||
CURLPROTO_RTMPTE, /* protocol */
|
||||
CURLPROTO_RTMPTE, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
@ -163,6 +167,7 @@ const struct Curl_handler Curl_handler_rtmps = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMPS, /* defport */
|
||||
CURLPROTO_RTMPS, /* protocol */
|
||||
CURLPROTO_RTMP, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
@ -184,6 +189,7 @@ const struct Curl_handler Curl_handler_rtmpts = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_RTMPS, /* defport */
|
||||
CURLPROTO_RTMPTS, /* protocol */
|
||||
CURLPROTO_RTMPT, /* family */
|
||||
PROTOPT_NONE /* flags*/
|
||||
};
|
||||
|
||||
|
@ -90,7 +90,8 @@ const struct Curl_handler Curl_handler_dict = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_DICT, /* defport */
|
||||
CURLPROTO_DICT, /* protocol */
|
||||
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
|
||||
CURLPROTO_DICT, /* family */
|
||||
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
||||
static char *unescape_word(struct Curl_easy *data, const char *inputbuff)
|
||||
|
@ -112,6 +112,7 @@ const struct Curl_handler Curl_handler_file = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
0, /* defport */
|
||||
CURLPROTO_FILE, /* protocol */
|
||||
CURLPROTO_FILE, /* family */
|
||||
PROTOPT_NONETWORK | PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
||||
|
@ -170,6 +170,7 @@ const struct Curl_handler Curl_handler_ftp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_FTP, /* defport */
|
||||
CURLPROTO_FTP, /* protocol */
|
||||
CURLPROTO_FTP, /* family */
|
||||
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
|
||||
PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP |
|
||||
PROTOPT_WILDCARD /* flags */
|
||||
@ -199,6 +200,7 @@ const struct Curl_handler Curl_handler_ftps = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_FTPS, /* defport */
|
||||
CURLPROTO_FTPS, /* protocol */
|
||||
CURLPROTO_FTP, /* family */
|
||||
PROTOPT_SSL | PROTOPT_DUAL | PROTOPT_CLOSEACTION |
|
||||
PROTOPT_NEEDSPWD | PROTOPT_NOURLQUERY | PROTOPT_WILDCARD /* flags */
|
||||
};
|
||||
|
@ -71,6 +71,7 @@ const struct Curl_handler Curl_handler_gopher = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_GOPHER, /* defport */
|
||||
CURLPROTO_GOPHER, /* protocol */
|
||||
CURLPROTO_GOPHER, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
|
@ -125,6 +125,7 @@ const struct Curl_handler Curl_handler_http = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_HTTP, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_CREDSPERREQUEST | /* flags */
|
||||
PROTOPT_USERPWDCTRL
|
||||
};
|
||||
@ -151,6 +152,7 @@ const struct Curl_handler Curl_handler_https = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_HTTPS, /* defport */
|
||||
CURLPROTO_HTTPS, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_SSL | PROTOPT_CREDSPERREQUEST | PROTOPT_ALPN_NPN | /* flags */
|
||||
PROTOPT_USERPWDCTRL
|
||||
};
|
||||
|
@ -300,6 +300,7 @@ static const struct Curl_handler Curl_handler_http2 = {
|
||||
http2_conncheck, /* connection_check */
|
||||
PORT_HTTP, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_STREAM /* flags */
|
||||
};
|
||||
|
||||
@ -321,6 +322,7 @@ static const struct Curl_handler Curl_handler_http2_ssl = {
|
||||
http2_conncheck, /* connection_check */
|
||||
PORT_HTTP, /* defport */
|
||||
CURLPROTO_HTTPS, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_SSL | PROTOPT_STREAM /* flags */
|
||||
};
|
||||
|
||||
|
@ -132,6 +132,7 @@ const struct Curl_handler Curl_handler_imap = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_IMAP, /* defport */
|
||||
CURLPROTO_IMAP, /* protocol */
|
||||
CURLPROTO_IMAP, /* family */
|
||||
PROTOPT_CLOSEACTION| /* flags */
|
||||
PROTOPT_URLOPTIONS
|
||||
};
|
||||
@ -159,6 +160,7 @@ const struct Curl_handler Curl_handler_imaps = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_IMAPS, /* defport */
|
||||
CURLPROTO_IMAPS, /* protocol */
|
||||
CURLPROTO_IMAP, /* family */
|
||||
PROTOPT_CLOSEACTION | PROTOPT_SSL | /* flags */
|
||||
PROTOPT_URLOPTIONS
|
||||
};
|
||||
|
@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_ldap = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_LDAP, /* defport */
|
||||
CURLPROTO_LDAP, /* protocol */
|
||||
CURLPROTO_LDAP, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
@ -176,6 +177,7 @@ const struct Curl_handler Curl_handler_ldaps = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_LDAPS, /* defport */
|
||||
CURLPROTO_LDAPS, /* protocol */
|
||||
CURLPROTO_LDAP, /* family */
|
||||
PROTOPT_SSL /* flags */
|
||||
};
|
||||
#endif
|
||||
|
@ -86,6 +86,7 @@ const struct Curl_handler Curl_handler_mqtt = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_MQTT, /* defport */
|
||||
CURLPROTO_MQTT, /* protocol */
|
||||
CURLPROTO_MQTT, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
|
@ -107,6 +107,7 @@ const struct Curl_handler Curl_handler_ldap = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_LDAP, /* defport */
|
||||
CURLPROTO_LDAP, /* protocol */
|
||||
CURLPROTO_LDAP, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
@ -132,7 +133,8 @@ const struct Curl_handler Curl_handler_ldaps = {
|
||||
ZERO_NULL, /* readwrite */
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_LDAPS, /* defport */
|
||||
CURLPROTO_LDAP, /* protocol */
|
||||
CURLPROTO_LDAPS, /* protocol */
|
||||
CURLPROTO_LDAP, /* family */
|
||||
PROTOPT_SSL /* flags */
|
||||
};
|
||||
#endif
|
||||
|
@ -128,6 +128,7 @@ const struct Curl_handler Curl_handler_pop3 = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_POP3, /* defport */
|
||||
CURLPROTO_POP3, /* protocol */
|
||||
CURLPROTO_POP3, /* family */
|
||||
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
|
||||
PROTOPT_URLOPTIONS
|
||||
};
|
||||
@ -155,6 +156,7 @@ const struct Curl_handler Curl_handler_pop3s = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_POP3S, /* defport */
|
||||
CURLPROTO_POP3S, /* protocol */
|
||||
CURLPROTO_POP3, /* family */
|
||||
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
||||
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
|
||||
};
|
||||
|
@ -106,6 +106,7 @@ const struct Curl_handler Curl_handler_rtsp = {
|
||||
rtsp_conncheck, /* connection_check */
|
||||
PORT_RTSP, /* defport */
|
||||
CURLPROTO_RTSP, /* protocol */
|
||||
CURLPROTO_RTSP, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
|
@ -86,6 +86,7 @@ const struct Curl_handler Curl_handler_smb = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SMB, /* defport */
|
||||
CURLPROTO_SMB, /* protocol */
|
||||
CURLPROTO_SMB, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
@ -111,6 +112,7 @@ const struct Curl_handler Curl_handler_smbs = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SMBS, /* defport */
|
||||
CURLPROTO_SMBS, /* protocol */
|
||||
CURLPROTO_SMB, /* family */
|
||||
PROTOPT_SSL /* flags */
|
||||
};
|
||||
#endif
|
||||
|
@ -133,6 +133,7 @@ const struct Curl_handler Curl_handler_smtp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SMTP, /* defport */
|
||||
CURLPROTO_SMTP, /* protocol */
|
||||
CURLPROTO_SMTP, /* family */
|
||||
PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY | /* flags */
|
||||
PROTOPT_URLOPTIONS
|
||||
};
|
||||
@ -160,6 +161,7 @@ const struct Curl_handler Curl_handler_smtps = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SMTPS, /* defport */
|
||||
CURLPROTO_SMTPS, /* protocol */
|
||||
CURLPROTO_SMTP, /* family */
|
||||
PROTOPT_CLOSEACTION | PROTOPT_SSL
|
||||
| PROTOPT_NOURLQUERY | PROTOPT_URLOPTIONS /* flags */
|
||||
};
|
||||
|
@ -188,6 +188,7 @@ const struct Curl_handler Curl_handler_telnet = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_TELNET, /* defport */
|
||||
CURLPROTO_TELNET, /* protocol */
|
||||
CURLPROTO_TELNET, /* family */
|
||||
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
||||
|
@ -183,6 +183,7 @@ const struct Curl_handler Curl_handler_tftp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_TFTP, /* defport */
|
||||
CURLPROTO_TFTP, /* protocol */
|
||||
CURLPROTO_TFTP, /* family */
|
||||
PROTOPT_NONE | PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
||||
|
134
lib/url.c
134
lib/url.c
@ -130,7 +130,6 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
|
||||
#include "memdebug.h"
|
||||
|
||||
static void conn_free(struct connectdata *conn);
|
||||
static unsigned int get_protocol_family(unsigned int protocol);
|
||||
|
||||
/* Some parts of the code (e.g. chunked encoding) assume this buffer has at
|
||||
* more than just a few bytes to play with. Don't let it become too small or
|
||||
@ -140,6 +139,24 @@ static unsigned int get_protocol_family(unsigned int protocol);
|
||||
# error READBUFFER_SIZE is too small
|
||||
#endif
|
||||
|
||||
/*
|
||||
* get_protocol_family()
|
||||
*
|
||||
* This is used to return the protocol family for a given protocol.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* 'h' [in] - struct Curl_handler pointer.
|
||||
*
|
||||
* Returns the family as a single bit protocol identifier.
|
||||
*/
|
||||
static unsigned int get_protocol_family(const struct Curl_handler *h)
|
||||
{
|
||||
DEBUGASSERT(h);
|
||||
DEBUGASSERT(h->family);
|
||||
return h->family;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Protocol table. Schemes (roughly) in 2019 popularity order:
|
||||
@ -273,6 +290,7 @@ static const struct Curl_handler Curl_handler_dummy = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
0, /* defport */
|
||||
0, /* protocol */
|
||||
0, /* family */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
@ -1173,7 +1191,7 @@ ConnectionExists(struct Curl_easy *data,
|
||||
if((needle->handler->flags&PROTOPT_SSL) !=
|
||||
(check->handler->flags&PROTOPT_SSL))
|
||||
/* don't do mixed SSL and non-SSL connections */
|
||||
if(get_protocol_family(check->handler->protocol) !=
|
||||
if(get_protocol_family(check->handler) !=
|
||||
needle->handler->protocol || !check->bits.tls_upgraded)
|
||||
/* except protocols that have been upgraded via TLS */
|
||||
continue;
|
||||
@ -1278,7 +1296,7 @@ ConnectionExists(struct Curl_easy *data,
|
||||
is allowed to be upgraded via TLS */
|
||||
|
||||
if((strcasecompare(needle->handler->scheme, check->handler->scheme) ||
|
||||
(get_protocol_family(check->handler->protocol) ==
|
||||
(get_protocol_family(check->handler) ==
|
||||
needle->handler->protocol && check->bits.tls_upgraded)) &&
|
||||
(!needle->bits.conn_to_host || strcasecompare(
|
||||
needle->conn_to_host.name, check->conn_to_host.name)) &&
|
||||
@ -4028,113 +4046,3 @@ CURLcode Curl_init_do(struct Curl_easy *data, struct connectdata *conn)
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_protocol_family()
|
||||
*
|
||||
* This is used to return the protocol family for a given protocol.
|
||||
*
|
||||
* Parameters:
|
||||
*
|
||||
* protocol [in] - A single bit protocol identifier such as HTTP or HTTPS.
|
||||
*
|
||||
* Returns the family as a single bit protocol identifier.
|
||||
*/
|
||||
|
||||
static unsigned int get_protocol_family(unsigned int protocol)
|
||||
{
|
||||
unsigned int family;
|
||||
|
||||
switch(protocol) {
|
||||
case CURLPROTO_HTTP:
|
||||
case CURLPROTO_HTTPS:
|
||||
family = CURLPROTO_HTTP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_FTP:
|
||||
case CURLPROTO_FTPS:
|
||||
family = CURLPROTO_FTP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_SCP:
|
||||
family = CURLPROTO_SCP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_SFTP:
|
||||
family = CURLPROTO_SFTP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_TELNET:
|
||||
family = CURLPROTO_TELNET;
|
||||
break;
|
||||
|
||||
case CURLPROTO_LDAP:
|
||||
case CURLPROTO_LDAPS:
|
||||
family = CURLPROTO_LDAP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_DICT:
|
||||
family = CURLPROTO_DICT;
|
||||
break;
|
||||
|
||||
case CURLPROTO_FILE:
|
||||
family = CURLPROTO_FILE;
|
||||
break;
|
||||
|
||||
case CURLPROTO_TFTP:
|
||||
family = CURLPROTO_TFTP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_IMAP:
|
||||
case CURLPROTO_IMAPS:
|
||||
family = CURLPROTO_IMAP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_POP3:
|
||||
case CURLPROTO_POP3S:
|
||||
family = CURLPROTO_POP3;
|
||||
break;
|
||||
|
||||
case CURLPROTO_SMTP:
|
||||
case CURLPROTO_SMTPS:
|
||||
family = CURLPROTO_SMTP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_RTSP:
|
||||
family = CURLPROTO_RTSP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_RTMP:
|
||||
case CURLPROTO_RTMPS:
|
||||
family = CURLPROTO_RTMP;
|
||||
break;
|
||||
|
||||
case CURLPROTO_RTMPT:
|
||||
case CURLPROTO_RTMPTS:
|
||||
family = CURLPROTO_RTMPT;
|
||||
break;
|
||||
|
||||
case CURLPROTO_RTMPE:
|
||||
family = CURLPROTO_RTMPE;
|
||||
break;
|
||||
|
||||
case CURLPROTO_RTMPTE:
|
||||
family = CURLPROTO_RTMPTE;
|
||||
break;
|
||||
|
||||
case CURLPROTO_GOPHER:
|
||||
family = CURLPROTO_GOPHER;
|
||||
break;
|
||||
|
||||
case CURLPROTO_SMB:
|
||||
case CURLPROTO_SMBS:
|
||||
family = CURLPROTO_SMB;
|
||||
break;
|
||||
|
||||
default:
|
||||
family = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
return family;
|
||||
}
|
||||
|
@ -739,6 +739,8 @@ struct Curl_handler {
|
||||
long defport; /* Default port. */
|
||||
unsigned int protocol; /* See CURLPROTO_* - this needs to be the single
|
||||
specific protocol bit */
|
||||
unsigned int family; /* single bit for protocol family; basically the
|
||||
non-TLS name of the protocol this is */
|
||||
unsigned int flags; /* Extra particular characteristics, see PROTOPT_* */
|
||||
};
|
||||
|
||||
|
@ -954,6 +954,7 @@ static const struct Curl_handler Curl_handler_http3 = {
|
||||
ng_conncheck, /* connection_check */
|
||||
PORT_HTTP, /* defport */
|
||||
CURLPROTO_HTTPS, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_SSL | PROTOPT_STREAM /* flags */
|
||||
};
|
||||
|
||||
|
@ -154,6 +154,7 @@ static const struct Curl_handler Curl_handler_http3 = {
|
||||
quiche_conncheck, /* connection_check */
|
||||
PORT_HTTP, /* defport */
|
||||
CURLPROTO_HTTPS, /* protocol */
|
||||
CURLPROTO_HTTP, /* family */
|
||||
PROTOPT_SSL | PROTOPT_STREAM /* flags */
|
||||
};
|
||||
|
||||
|
@ -158,6 +158,7 @@ const struct Curl_handler Curl_handler_scp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SCP, /* protocol */
|
||||
CURLPROTO_SCP, /* family */
|
||||
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION | PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
||||
@ -183,6 +184,7 @@ const struct Curl_handler Curl_handler_sftp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SFTP, /* protocol */
|
||||
CURLPROTO_SFTP, /* family */
|
||||
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
|
||||
| PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
@ -150,6 +150,7 @@ const struct Curl_handler Curl_handler_scp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SCP, /* protocol */
|
||||
CURLPROTO_SCP, /* family */
|
||||
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
|
||||
| PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
@ -177,6 +178,7 @@ const struct Curl_handler Curl_handler_sftp = {
|
||||
ZERO_NULL, /* connection_check */
|
||||
PORT_SSH, /* defport */
|
||||
CURLPROTO_SFTP, /* protocol */
|
||||
CURLPROTO_SFTP, /* family */
|
||||
PROTOPT_DIRLOCK | PROTOPT_CLOSEACTION
|
||||
| PROTOPT_NOURLQUERY /* flags */
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user