mirror of
https://github.com/moparisthebest/curl
synced 2024-12-22 08:08:50 -05:00
curl: added --proto and --proto-redir
--proto tells curl to use the listed protocols for its initial retrieval --proto-redir tells curl to use the listed protocols after a redirect
This commit is contained in:
parent
d487ade72c
commit
36e245658b
46
docs/curl.1
46
docs/curl.1
@ -927,6 +927,52 @@ in web browsers, so curl does the conversion by default to maintain
|
|||||||
consistency. However, a server may require a POST to remain a POST after such
|
consistency. However, a server may require a POST to remain a POST after such
|
||||||
a redirection. This option is meaningful only when using \fI-L/--location\fP
|
a redirection. This option is meaningful only when using \fI-L/--location\fP
|
||||||
(Added in 7.19.1)
|
(Added in 7.19.1)
|
||||||
|
.IP "--proto <protocols>"
|
||||||
|
Tells curl to use the listed protocols for its initial retrieval. Protocols
|
||||||
|
are evaluated left to right, are comma separated, and are each a protocol
|
||||||
|
name or 'all', optionally prefixed by zero or more modifiers. Available
|
||||||
|
modifiers are:
|
||||||
|
.RS
|
||||||
|
.TP 3
|
||||||
|
.B +
|
||||||
|
Permit this protocol in addition to protocols already permitted (this is
|
||||||
|
the default if no modifier is used).
|
||||||
|
.TP
|
||||||
|
.B -
|
||||||
|
Deny this protocol, removing it from the list of protocols already permitted.
|
||||||
|
.TP
|
||||||
|
.B =
|
||||||
|
Permit only this protocol (ignoring the list already permitted), though
|
||||||
|
subject to later modification by subsequent entries in the comma separated
|
||||||
|
list.
|
||||||
|
.RE
|
||||||
|
.IP
|
||||||
|
For example:
|
||||||
|
.RS
|
||||||
|
.TP 15
|
||||||
|
.B --proto -ftps
|
||||||
|
uses the default protocols, but disables ftps
|
||||||
|
.TP
|
||||||
|
.B --proto -all,https,+http
|
||||||
|
only enables http and https
|
||||||
|
.TP
|
||||||
|
.B --proto =http,https
|
||||||
|
also only enables http and https
|
||||||
|
.RE
|
||||||
|
.IP
|
||||||
|
Unknown protocols produce a warning. This allows scripts to safely rely on
|
||||||
|
being able to disable potentially dangerous protocols, without relying upon
|
||||||
|
support for that protocol being built into curl to avoid an error.
|
||||||
|
|
||||||
|
This option can be used multiple times, in which case the effect is the same
|
||||||
|
as concatenating the protocols into one instance of the option.
|
||||||
|
|
||||||
|
(Added in 7.20.2)
|
||||||
|
.IP "--proto-redir <protocols>"
|
||||||
|
Tells curl to use the listed protocols after a redirect. See --proto for
|
||||||
|
how protocols are represented.
|
||||||
|
|
||||||
|
(Added in 7.20.2)
|
||||||
.IP "--proxy-anyauth"
|
.IP "--proxy-anyauth"
|
||||||
Tells curl to pick a suitable authentication method when communicating with
|
Tells curl to pick a suitable authentication method when communicating with
|
||||||
the given proxy. This might cause an extra request/response round-trip. (Added
|
the given proxy. This might cause an extra request/response round-trip. (Added
|
||||||
|
131
src/main.c
131
src/main.c
@ -478,6 +478,10 @@ struct Configurable {
|
|||||||
bool disable_epsv;
|
bool disable_epsv;
|
||||||
bool disable_eprt;
|
bool disable_eprt;
|
||||||
bool ftp_pret;
|
bool ftp_pret;
|
||||||
|
long proto;
|
||||||
|
bool proto_present;
|
||||||
|
long proto_redir;
|
||||||
|
bool proto_redir_present;
|
||||||
curl_off_t resume_from;
|
curl_off_t resume_from;
|
||||||
char *postfields;
|
char *postfields;
|
||||||
curl_off_t postfieldsize;
|
curl_off_t postfieldsize;
|
||||||
@ -841,6 +845,8 @@ static void help(void)
|
|||||||
" --post301 Do not switch to GET after following a 301 redirect (H)",
|
" --post301 Do not switch to GET after following a 301 redirect (H)",
|
||||||
" --post302 Do not switch to GET after following a 302 redirect (H)",
|
" --post302 Do not switch to GET after following a 302 redirect (H)",
|
||||||
" -#/--progress-bar Display transfer progress as a progress bar",
|
" -#/--progress-bar Display transfer progress as a progress bar",
|
||||||
|
" --proto <protocols> Enable/disable specified protocols",
|
||||||
|
" --proto-redir <protocols> Enable/disable specified protocols on redirect",
|
||||||
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
|
" -x/--proxy <host[:port]> Use HTTP proxy on given port",
|
||||||
" --proxy-anyauth Pick \"any\" proxy authentication method (H)",
|
" --proxy-anyauth Pick \"any\" proxy authentication method (H)",
|
||||||
" --proxy-basic Use Basic authentication on the proxy (H)",
|
" --proxy-basic Use Basic authentication on the proxy (H)",
|
||||||
@ -1492,6 +1498,109 @@ static int str2num(long *val, const char *str)
|
|||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse the string and modify the long in the given address. Return
|
||||||
|
* non-zero on failure, zero on success.
|
||||||
|
*
|
||||||
|
* The string is a list of protocols
|
||||||
|
*
|
||||||
|
* Since this function gets called with the 'nextarg' pointer from within the
|
||||||
|
* getparameter a lot, we must check it for NULL before accessing the str
|
||||||
|
* data.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static long proto2num(struct Configurable *config, long *val, const char *str)
|
||||||
|
{
|
||||||
|
char *buffer;
|
||||||
|
const char *sep = ",";
|
||||||
|
char *token;
|
||||||
|
|
||||||
|
static struct sprotos {
|
||||||
|
const char *name;
|
||||||
|
long bit;
|
||||||
|
} const protos[] = {
|
||||||
|
{ "all", CURLPROTO_ALL },
|
||||||
|
{ "http", CURLPROTO_HTTP },
|
||||||
|
{ "https", CURLPROTO_HTTPS },
|
||||||
|
{ "ftp", CURLPROTO_FTP },
|
||||||
|
{ "ftps", CURLPROTO_FTPS },
|
||||||
|
{ "scp", CURLPROTO_SCP },
|
||||||
|
{ "sftp", CURLPROTO_SFTP },
|
||||||
|
{ "telnet", CURLPROTO_TELNET },
|
||||||
|
{ "ldap", CURLPROTO_LDAP },
|
||||||
|
{ "ldaps", CURLPROTO_LDAPS },
|
||||||
|
{ "dict", CURLPROTO_DICT },
|
||||||
|
{ "file", CURLPROTO_FILE },
|
||||||
|
{ "tftp", CURLPROTO_TFTP },
|
||||||
|
{ "imap", CURLPROTO_IMAP },
|
||||||
|
{ "imaps", CURLPROTO_IMAPS },
|
||||||
|
{ "pop3", CURLPROTO_POP3 },
|
||||||
|
{ "pop3s", CURLPROTO_POP3S },
|
||||||
|
{ "smtp", CURLPROTO_SMTP },
|
||||||
|
{ "smtps", CURLPROTO_SMTPS },
|
||||||
|
{ "rtsp", CURLPROTO_RTSP },
|
||||||
|
{ NULL, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
if(!str)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
buffer = strdup(str); /* because strtok corrupts it */
|
||||||
|
|
||||||
|
for (token = strtok(buffer, sep);
|
||||||
|
token;
|
||||||
|
token = strtok(NULL, sep)) {
|
||||||
|
enum e_action { allow, deny, set } action = allow;
|
||||||
|
|
||||||
|
struct sprotos const *pp;
|
||||||
|
|
||||||
|
/* Process token modifiers */
|
||||||
|
while (!ISALNUM(*token)) { /* may be NULL if token is all modifiers */
|
||||||
|
switch (*token++) {
|
||||||
|
case '=':
|
||||||
|
action = set;
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
action = deny;
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
action = allow;
|
||||||
|
break;
|
||||||
|
default: /* Includes case of terminating NULL */
|
||||||
|
free(buffer);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (pp=protos; pp->name; pp++) {
|
||||||
|
if (curlx_raw_equal(token, pp->name)) {
|
||||||
|
switch (action) {
|
||||||
|
case deny:
|
||||||
|
*val &= ~(pp->bit);
|
||||||
|
break;
|
||||||
|
case allow:
|
||||||
|
*val |= pp->bit;
|
||||||
|
break;
|
||||||
|
case set:
|
||||||
|
*val = pp->bit;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(pp->name)) { /* unknown protocol */
|
||||||
|
/* If they have specified only this protocol, we say treat it as
|
||||||
|
if no protocols are allowed */
|
||||||
|
if (action == set)
|
||||||
|
*val = 0;
|
||||||
|
warnf(config, "unrecognized protocol '%s'\n", token);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(buffer);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses the given string looking for an offset (which may be
|
* Parses the given string looking for an offset (which may be
|
||||||
* a larger-than-integer value).
|
* a larger-than-integer value).
|
||||||
@ -1752,6 +1861,8 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
{"$A", "mail-from", TRUE},
|
{"$A", "mail-from", TRUE},
|
||||||
{"$B", "mail-rcpt", TRUE},
|
{"$B", "mail-rcpt", TRUE},
|
||||||
{"$C", "ftp-pret", FALSE},
|
{"$C", "ftp-pret", FALSE},
|
||||||
|
{"$D", "proto", TRUE},
|
||||||
|
{"$E", "proto-redir", TRUE},
|
||||||
{"0", "http1.0", FALSE},
|
{"0", "http1.0", FALSE},
|
||||||
{"1", "tlsv1", FALSE},
|
{"1", "tlsv1", FALSE},
|
||||||
{"2", "sslv2", FALSE},
|
{"2", "sslv2", FALSE},
|
||||||
@ -2294,6 +2405,16 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
case 'C': /* --ftp-pret */
|
case 'C': /* --ftp-pret */
|
||||||
config->ftp_pret = toggle;
|
config->ftp_pret = toggle;
|
||||||
break;
|
break;
|
||||||
|
case 'D': /* --proto */
|
||||||
|
config->proto_present = 1;
|
||||||
|
if(proto2num(config, &config->proto, nextarg))
|
||||||
|
return PARAM_BAD_USE;
|
||||||
|
break;
|
||||||
|
case 'E': /* --proto-redir */
|
||||||
|
config->proto_redir_present = 1;
|
||||||
|
if(proto2num(config, &config->proto_redir, nextarg))
|
||||||
|
return PARAM_BAD_USE;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '#': /* --progress-bar */
|
case '#': /* --progress-bar */
|
||||||
@ -4362,6 +4483,11 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
|
|||||||
config->use_httpget=FALSE;
|
config->use_httpget=FALSE;
|
||||||
config->create_dirs=FALSE;
|
config->create_dirs=FALSE;
|
||||||
config->maxredirs = DEFAULT_MAXREDIRS;
|
config->maxredirs = DEFAULT_MAXREDIRS;
|
||||||
|
config->proto = CURLPROTO_ALL; /* FIXME: better to read from library */
|
||||||
|
config->proto_present = FALSE;
|
||||||
|
config->proto_redir =
|
||||||
|
CURLPROTO_ALL & ~(CURLPROTO_FILE|CURLPROTO_SCP); /* not FILE or SCP */
|
||||||
|
config->proto_redir_present = FALSE;
|
||||||
|
|
||||||
if(argc>1 &&
|
if(argc>1 &&
|
||||||
(!curlx_strnequal("--", argv[1], 2) && (argv[1][0] == '-')) &&
|
(!curlx_strnequal("--", argv[1], 2) && (argv[1][0] == '-')) &&
|
||||||
@ -5200,6 +5326,11 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
|
|||||||
if(config->ftp_pret)
|
if(config->ftp_pret)
|
||||||
my_setopt(curl, CURLOPT_FTP_USE_PRET, TRUE);
|
my_setopt(curl, CURLOPT_FTP_USE_PRET, TRUE);
|
||||||
|
|
||||||
|
if (config->proto_present)
|
||||||
|
my_setopt(curl, CURLOPT_PROTOCOLS, config->proto);
|
||||||
|
if (config->proto_redir_present)
|
||||||
|
my_setopt(curl, CURLOPT_REDIR_PROTOCOLS, config->proto_redir);
|
||||||
|
|
||||||
if ((urlnode->flags & GETOUT_USEREMOTE)
|
if ((urlnode->flags & GETOUT_USEREMOTE)
|
||||||
&& config->content_disposition) {
|
&& config->content_disposition) {
|
||||||
my_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
|
my_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
|
||||||
|
Loading…
Reference in New Issue
Block a user