--- curl-7.15.1\lib\ftp.c	Mon Dec 05 15:10:48 2005
+++ curl-7.15.1-patch\lib\ftp.c	Wed Jan 11 11:46:04 2006
@@ -1675,7 +1675,21 @@
 
     /* 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;
   }
@@ -2724,6 +2738,11 @@
 {
   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 */
 
@@ -2751,8 +2770,21 @@
   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;
   }
