mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
http-proxy: only attempt FTP over HTTP proxy
... all other non-HTTP protocol schemes are now defaulting to "tunnel trough" mode if a HTTP proxy is specified. In reality there are no HTTP proxies out there that allow those other schemes. Assisted-by: Ray Satiro, Michael Kaufmann Closes #1505
This commit is contained in:
parent
4d1147ae20
commit
efc83d6d54
79
lib/ftp.c
79
lib/ftp.c
@ -180,8 +180,8 @@ const struct Curl_handler Curl_handler_ftp = {
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_FTP, /* defport */
|
||||
CURLPROTO_FTP, /* protocol */
|
||||
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD
|
||||
| PROTOPT_NOURLQUERY /* flags */
|
||||
PROTOPT_DUAL | PROTOPT_CLOSEACTION | PROTOPT_NEEDSPWD |
|
||||
PROTOPT_NOURLQUERY | PROTOPT_PROXY_AS_HTTP /* flags */
|
||||
};
|
||||
|
||||
|
||||
@ -212,59 +212,6 @@ const struct Curl_handler Curl_handler_ftps = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
/*
|
||||
* HTTP-proxyed FTP protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_ftp_proxy = {
|
||||
"FTP", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_FTP, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
|
||||
#ifdef USE_SSL
|
||||
/*
|
||||
* HTTP-proxyed FTPS protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_ftps_proxy = {
|
||||
"FTPS", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_FTPS, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
static void close_secondarysocket(struct connectdata *conn)
|
||||
{
|
||||
if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET]) {
|
||||
@ -4462,28 +4409,6 @@ static CURLcode ftp_setup_connection(struct connectdata *conn)
|
||||
char command;
|
||||
struct FTP *ftp;
|
||||
|
||||
if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
|
||||
/* Unless we have asked to tunnel ftp operations through the proxy, we
|
||||
switch and use HTTP operations only */
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->handler == &Curl_handler_ftp)
|
||||
conn->handler = &Curl_handler_ftp_proxy;
|
||||
else {
|
||||
#ifdef USE_SSL
|
||||
conn->handler = &Curl_handler_ftps_proxy;
|
||||
#else
|
||||
failf(data, "FTPS not supported!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
/* set it up as a HTTP connection instead */
|
||||
return conn->handler->setup_connection(conn);
|
||||
#else
|
||||
failf(data, "FTP over http proxy requires HTTP support built-in!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
conn->data->req.protop = ftp = malloc(sizeof(struct FTP));
|
||||
if(NULL == ftp)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
|
77
lib/imap.c
77
lib/imap.c
@ -160,58 +160,6 @@ const struct Curl_handler Curl_handler_imaps = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
/*
|
||||
* HTTP-proxyed IMAP protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_imap_proxy = {
|
||||
"IMAP", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_IMAP, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
#ifdef USE_SSL
|
||||
/*
|
||||
* HTTP-proxyed IMAPS protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_imaps_proxy = {
|
||||
"IMAPS", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_IMAPS, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SASL parameters for the imap protocol */
|
||||
static const struct SASLproto saslimap = {
|
||||
"imap", /* The service name */
|
||||
@ -1715,31 +1663,6 @@ static CURLcode imap_setup_connection(struct connectdata *conn)
|
||||
|
||||
/* Clear the TLS upgraded flag */
|
||||
conn->tls_upgraded = FALSE;
|
||||
|
||||
/* Set up the proxy if necessary */
|
||||
if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
|
||||
/* Unless we have asked to tunnel IMAP operations through the proxy, we
|
||||
switch and use HTTP operations only */
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->handler == &Curl_handler_imap)
|
||||
conn->handler = &Curl_handler_imap_proxy;
|
||||
else {
|
||||
#ifdef USE_SSL
|
||||
conn->handler = &Curl_handler_imaps_proxy;
|
||||
#else
|
||||
failf(data, "IMAPS not supported!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* set it up as an HTTP connection instead */
|
||||
return conn->handler->setup_connection(conn);
|
||||
#else
|
||||
failf(data, "IMAP over http proxy requires HTTP support built-in!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
data->state.path++; /* don't include the initial slash */
|
||||
|
||||
return CURLE_OK;
|
||||
|
77
lib/pop3.c
77
lib/pop3.c
@ -158,58 +158,6 @@ const struct Curl_handler Curl_handler_pop3s = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
/*
|
||||
* HTTP-proxyed POP3 protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_pop3_proxy = {
|
||||
"POP3", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_POP3, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
#ifdef USE_SSL
|
||||
/*
|
||||
* HTTP-proxyed POP3S protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_pop3s_proxy = {
|
||||
"POP3S", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_POP3S, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SASL parameters for the pop3 protocol */
|
||||
static const struct SASLproto saslpop3 = {
|
||||
"pop", /* The service name */
|
||||
@ -1355,31 +1303,6 @@ static CURLcode pop3_setup_connection(struct connectdata *conn)
|
||||
|
||||
/* Clear the TLS upgraded flag */
|
||||
conn->tls_upgraded = FALSE;
|
||||
|
||||
/* Set up the proxy if necessary */
|
||||
if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
|
||||
/* Unless we have asked to tunnel POP3 operations through the proxy, we
|
||||
switch and use HTTP operations only */
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->handler == &Curl_handler_pop3)
|
||||
conn->handler = &Curl_handler_pop3_proxy;
|
||||
else {
|
||||
#ifdef USE_SSL
|
||||
conn->handler = &Curl_handler_pop3s_proxy;
|
||||
#else
|
||||
failf(data, "POP3S not supported!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* set it up as an HTTP connection instead */
|
||||
return conn->handler->setup_connection(conn);
|
||||
#else
|
||||
failf(data, "POP3 over http proxy requires HTTP support built-in!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
data->state.path++; /* don't include the initial slash */
|
||||
|
||||
return CURLE_OK;
|
||||
|
76
lib/smtp.c
76
lib/smtp.c
@ -157,58 +157,6 @@ const struct Curl_handler Curl_handler_smtps = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
/*
|
||||
* HTTP-proxyed SMTP protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_smtp_proxy = {
|
||||
"SMTP", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_SMTP, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
|
||||
#ifdef USE_SSL
|
||||
/*
|
||||
* HTTP-proxyed SMTPS protocol handler.
|
||||
*/
|
||||
|
||||
static const struct Curl_handler Curl_handler_smtps_proxy = {
|
||||
"SMTPS", /* scheme */
|
||||
Curl_http_setup_conn, /* setup_connection */
|
||||
Curl_http, /* do_it */
|
||||
Curl_http_done, /* done */
|
||||
ZERO_NULL, /* do_more */
|
||||
ZERO_NULL, /* connect_it */
|
||||
ZERO_NULL, /* connecting */
|
||||
ZERO_NULL, /* doing */
|
||||
ZERO_NULL, /* proto_getsock */
|
||||
ZERO_NULL, /* doing_getsock */
|
||||
ZERO_NULL, /* domore_getsock */
|
||||
ZERO_NULL, /* perform_getsock */
|
||||
ZERO_NULL, /* disconnect */
|
||||
ZERO_NULL, /* readwrite */
|
||||
PORT_SMTPS, /* defport */
|
||||
CURLPROTO_HTTP, /* protocol */
|
||||
PROTOPT_NONE /* flags */
|
||||
};
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* SASL parameters for the smtp protocol */
|
||||
static const struct SASLproto saslsmtp = {
|
||||
"smtp", /* The service name */
|
||||
@ -1451,30 +1399,6 @@ static CURLcode smtp_setup_connection(struct connectdata *conn)
|
||||
/* Clear the TLS upgraded flag */
|
||||
conn->tls_upgraded = FALSE;
|
||||
|
||||
/* Set up the proxy if necessary */
|
||||
if(conn->bits.httpproxy && !data->set.tunnel_thru_httpproxy) {
|
||||
/* Unless we have asked to tunnel SMTP operations through the proxy, we
|
||||
switch and use HTTP operations only */
|
||||
#ifndef CURL_DISABLE_HTTP
|
||||
if(conn->handler == &Curl_handler_smtp)
|
||||
conn->handler = &Curl_handler_smtp_proxy;
|
||||
else {
|
||||
#ifdef USE_SSL
|
||||
conn->handler = &Curl_handler_smtps_proxy;
|
||||
#else
|
||||
failf(data, "SMTPS not supported!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
/* set it up as a HTTP connection instead */
|
||||
return conn->handler->setup_connection(conn);
|
||||
|
||||
#else
|
||||
failf(data, "SMTP over http proxy requires HTTP support built-in!");
|
||||
return CURLE_UNSUPPORTED_PROTOCOL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Initialise the SMTP layer */
|
||||
result = smtp_init(conn);
|
||||
if(result)
|
||||
|
11
lib/url.c
11
lib/url.c
@ -5348,12 +5348,15 @@ static CURLcode create_conn_helper_init_proxy(struct connectdata *conn)
|
||||
result = CURLE_UNSUPPORTED_PROTOCOL;
|
||||
goto out;
|
||||
#else
|
||||
/* force this connection's protocol to become HTTP if not already
|
||||
compatible - if it isn't tunneling through */
|
||||
if(!(conn->handler->protocol & PROTO_FAMILY_HTTP) &&
|
||||
/* force this connection's protocol to become HTTP if compatible */
|
||||
if(!(conn->handler->protocol & PROTO_FAMILY_HTTP)) {
|
||||
if((conn->handler->flags & PROTOPT_PROXY_AS_HTTP) &&
|
||||
!conn->bits.tunnel_proxy)
|
||||
conn->handler = &Curl_handler_http;
|
||||
|
||||
else
|
||||
/* if not converting to HTTP over the proxy, enforce tunneling */
|
||||
conn->bits.tunnel_proxy = TRUE;
|
||||
}
|
||||
conn->bits.httpproxy = TRUE;
|
||||
#endif
|
||||
}
|
||||
|
@ -855,6 +855,9 @@ struct Curl_handler {
|
||||
#define PROTOPT_STREAM (1<<9) /* a protocol with individual logical streams */
|
||||
#define PROTOPT_URLOPTIONS (1<<10) /* allow options part in the userinfo field
|
||||
of the URL */
|
||||
#define PROTOPT_PROXY_AS_HTTP (1<<11) /* allow this non-HTTP scheme over a
|
||||
HTTP proxy as HTTP proxies may know
|
||||
this protocol and act as a gateway */
|
||||
|
||||
/* return the count of bytes sent, or -1 on error */
|
||||
typedef ssize_t (Curl_send)(struct connectdata *conn, /* connection data */
|
||||
|
Loading…
Reference in New Issue
Block a user