Michael Jahn fixed ftp over CONNECT

This commit is contained in:
Daniel Stenberg 2006-01-12 12:40:04 +00:00
parent fc2388189f
commit 31c7aa0ba4
2 changed files with 39 additions and 0 deletions

View File

@ -6,6 +6,11 @@
Changelog
Daniel (12 January 2006)
- Michael Jahn fixed PROXYTUNNEL to work fine when you do ftp through a proxy.
It would previously overwrite internal memory and cause unpredicted
behaviour!
Daniel (11 January 2006)
- I decided to document the "secret option" here now, as I've received *NO*
feedback at all on my mailing list requests from November 2005:

View File

@ -1675,7 +1675,22 @@ static CURLcode ftp_state_pasv_resp(struct connectdata *conn,
/* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */
/* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
* conn->proto.http; we want FTP through HTTP and we have to change the
* member temporarily for connecting to the HTTP proxy. After
* Curl_proxyCONNECT we have to set back the member to the original struct
* FTP pointer
*/
struct HTTP http_proxy;
struct FTP *ftp_save = conn->proto.ftp;
memset(&http_proxy, 0, sizeof(http_proxy));
conn->proto.http = &http_proxy;
result = Curl_proxyCONNECT(conn, SECONDARYSOCKET, newhost, newport);
conn->proto.ftp = ftp_save;
if(CURLE_OK != result)
return result;
}
@ -2726,6 +2741,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
{
struct FTP *ftp;
CURLcode result;
#ifndef CURL_DISABLE_HTTP
/* for FTP over HTTP proxy */
struct HTTP http_proxy;
struct FTP *ftp_save;
#endif /* CURL_DISABLE_HTTP */
*done = FALSE; /* default to not done yet */
@ -2753,8 +2773,22 @@ CURLcode Curl_ftp_connect(struct connectdata *conn,
if (conn->bits.tunnel_proxy) {
/* BLOCKING */
/* We want "seamless" FTP operations through HTTP proxy tunnel */
/* Curl_proxyCONNECT is based on a pointer to a struct HTTP at the member
* conn->proto.http; we want FTP through HTTP and we have to change the
* member temporarily for connecting to the HTTP proxy. After
* Curl_proxyCONNECT we have to set back the member to the original struct
* FTP pointer
*/
ftp_save = conn->proto.ftp;
memset(&http_proxy, 0, sizeof(http_proxy));
conn->proto.http = &http_proxy;
result = Curl_proxyCONNECT(conn, FIRSTSOCKET,
conn->host.name, conn->remote_port);
conn->proto.ftp = ftp_save;
if(CURLE_OK != result)
return result;
}