]> granicus.if.org Git - curl/commitdiff
parse_remote_port: fix ;type= URL suffix over HTTP proxy
authorDaniel Stenberg <daniel@haxx.se>
Mon, 9 Aug 2010 22:56:45 +0000 (00:56 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 9 Aug 2010 22:56:45 +0000 (00:56 +0200)
Test 563 is enabled now and verifies that the combo FTP type=A URL,
CURLOPT_PORT set and proxy work fine. As a bonus I managed to remove the
somewhat odd FTP check in parse_remote_port() and instead converted it
to a better and more generic 'slash_removed' struct field. Checking the
->protocol field isn't right since when an FTP:// URL is sent over a
HTTP proxy, the protocol is HTTP but the URL was handled by the FTP code
and thus slash_removed is set TRUE for this case.

lib/ftp.c
lib/url.c
lib/urldata.h
tests/data/DISABLED
tests/data/test563

index c3de7e0bc1bd0e14e39ab00608d1a95417523a60..40ed4b79039e4d5860174f92735c4645eb1707c5 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -4178,6 +4178,7 @@ static CURLcode ftp_setup_connection(struct connectdata * conn)
   }
 
   data->state.path++;   /* don't include the initial slash */
+  data->state.slash_removed = TRUE; /* we've skipped the slash */
 
   /* FTP URLs support an extension like ";type=<typecode>" that
    * we'll try to get now! */
@@ -4189,6 +4190,7 @@ static CURLcode ftp_setup_connection(struct connectdata * conn)
   if(type) {
     *type = 0;                     /* it was in the middle of the hostname */
     command = Curl_raw_toupper(type[6]);
+    conn->bits.type_set = TRUE;
 
     switch (command) {
     case 'A': /* ASCII mode */
index 228e353862881636d81fbeb1d62a560ca65ecea2..fd6443a590bedc900411fb34a3d3f25a675dfa44 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -4259,18 +4259,23 @@ static CURLcode parse_remote_port(struct SessionHandle *data,
     if(conn->bits.httpproxy) {
       /* we need to create new URL with the new port number */
       char *url;
-      /* FTPS connections have the FTP bit set too, so they match as well */
-      bool isftp = (bool)(0 != (conn->protocol & PROT_FTP));
+      char type[12]="";
+
+      if(conn->bits.type_set)
+        snprintf(type, sizeof(type), ";type=%c",
+                 data->set.prefer_ascii?'A':
+                 (data->set.ftp_list_only?'D':'I'));
 
       /*
-       * This synthesized URL isn't always right--suffixes like ;type=A
-       * are stripped off. It would be better to work directly from the
-       * original URL and simply replace the port part of it.
+       * This synthesized URL isn't always right--suffixes like ;type=A are
+       * stripped off. It would be better to work directly from the original
+       * URL and simply replace the port part of it.
        */
-      url = aprintf("%s://%s%s%s:%hu%s%s", conn->handler->scheme,
+      url = aprintf("%s://%s%s%s:%hu%s%s%s", conn->handler->scheme,
                     conn->bits.ipv6_ip?"[":"", conn->host.name,
                     conn->bits.ipv6_ip?"]":"", conn->remote_port,
-                    isftp?"/":"", data->state.path);
+                    data->state.slash_removed?"/":"", data->state.path,
+                    type);
       if(!url)
         return CURLE_OUT_OF_MEMORY;
 
index 7763278d2857e6801e2197e685a725efff24fad7..7919921f77a87e5611d5d5bb73cd1e9673b06889 100644 (file)
@@ -418,6 +418,7 @@ struct ConnectBits {
                                 that libcurl should reconnect and continue. */
   bool bound; /* set true if bind() has already been done on this socket/
                  connection */
+  bool type_set;  /* type= was used in the URL */
 };
 
 struct hostname {
@@ -1127,7 +1128,8 @@ struct UrlState {
   char *pathbuffer;/* allocated buffer to store the URL's path part in */
   char *path;      /* path to use, points to somewhere within the pathbuffer
                       area */
-
+  bool slash_removed; /* set TRUE if the 'path' points to a path where the
+                         initial URL slash separator has been taken off */
   bool use_range;
   bool rangestringalloc; /* the range string is malloc()'ed */
 
index 42c5f8aa17514ac87870f75600ee1bcf6e9d0f99..b6071cbd91b1ff847c1ec9a420057b233ed43246 100644 (file)
@@ -2,5 +2,4 @@
 # test cases are run by runtests.pl. Just add the plain test case numbers, one
 # per line.
 # Lines starting with '#' letters are treated as comments.
-563
 564
index 5d2d7338b5eb6025e4044667b613b48c93ceec9d..78515231979788ac6c7d3b59580094cde592333a 100644 (file)
@@ -47,7 +47,7 @@ ftp_proxy=http://%HOSTIP:%HTTPPORT/
 # Verify data after the test has been "shot"
 <verify>
 <protocol>
-GET ftp://%HOSTIP:%FTPPORT/563;type=A HTTP/1.1\r
+GET FTP://%HOSTIP:%FTPPORT/563;type=A HTTP/1.1\r
 Host: %HOSTIP:%FTPPORT\r
 Accept: */*\r
 Proxy-Connection: Keep-Alive\r