diff --git a/CHANGES b/CHANGES
index eccb1db196753b5afecad2fbd9ba44f1f5668d62..2731c818fbb918ca5bb0a8174ad81cc87748d6ea 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
 
                                   Changelog
 
+Michal Marek (21 Aug 2009)
+- With CURLOPT_PROXY_TRANSFER_MODE, avoid sending invalid URLs like
+  ftp://example.com;type=i if the user specified ftp://example.com without the
+  slash.
+
 Daniel Stenberg (21 Aug 2009)
 - Andre Guibert de Bruet pointed out a missing return code check for a
   strdup() that could lead to segfault if it returned NULL. I extended his
diff --git a/lib/http.c b/lib/http.c
index 227675ed79b5226585a8e567f93ef62543189db9..7cc7a93071ad1ae9244f693c097908ef3930d673 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -2050,7 +2050,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
   struct HTTP *http;
   const char *ppath = data->state.path;
   bool paste_ftp_userpwd = FALSE;
-  char ftp_typecode[sizeof(";type=?")] = "";
+  char ftp_typecode[sizeof("/;type=?")] = "";
   const char *host = conn->host.name;
   const char *te = ""; /* transfer-encoding */
   const char *ptr;
@@ -2292,20 +2292,27 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
     if(checkprefix("ftp://", ppath)) {
       if (data->set.proxy_transfer_mode) {
         /* when doing ftp, append ;type=<a|i> if not present */
-        char *p = strstr(ppath, ";type=");
-        if(p && p[6] && p[7] == 0) {
-          switch (Curl_raw_toupper(p[6])) {
+        char *type = strstr(ppath, ";type=");
+        if(type && type[6] && type[7] == 0) {
+          switch (Curl_raw_toupper(type[6])) {
           case 'A':
           case 'D':
           case 'I':
             break;
           default:
-            p = NULL;
+            type = NULL;
           }
         }
-        if(!p)
-          snprintf(ftp_typecode, sizeof(ftp_typecode), ";type=%c",
+        if(!type) {
+          char *p = ftp_typecode;
+          /* avoid sending invalid URLs like ftp://example.com;type=i if the
+           * user specified ftp://example.com without the slash */
+          if (!*data->state.path && ppath[strlen(ppath) - 1] != '/') {
+            *p++ = '/';
+          }
+          snprintf(p, sizeof(ftp_typecode) - 1, ";type=%c",
                    data->set.prefer_ascii ? 'a' : 'i');
+        }
       }
       if (conn->bits.user_passwd && !conn->bits.userpwd_in_url)
         paste_ftp_userpwd = TRUE;