- Pramod Sharma reported and tracked down a bug when doing FTP over a HTTP
authorDaniel Stenberg <daniel@haxx.se>
Fri, 17 Apr 2009 12:48:24 +0000 (12:48 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 17 Apr 2009 12:48:24 +0000 (12:48 +0000)
  proxy. libcurl would then wrongly close the connection after each
  request. In his case it had the weird side-effect that it killed NTLM auth
  for the proxy causing an inifinite loop!

  I added test case 1098 to verify this fix. The test case does however not
  properly verify that the transfers are done persistently - as I couldn't
  think of a clever way to achieve it right now - but you need to read the
  stderr output after a test run to see that it truly did the right thing.

CHANGES
lib/ftp.c
tests/data/Makefile.am
tests/data/test1098 [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 1c270c8..4d6af34 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,17 @@
 
                                   Changelog
 
+Daniel Stenberg (17 Apr 2009)
+- Pramod Sharma reported and tracked down a bug when doing FTP over a HTTP
+  proxy. libcurl would then wrongly close the connection after each
+  request. In his case it had the weird side-effect that it killed NTLM auth
+  for the proxy causing an inifinite loop!
+
+  I added test case 1098 to verify this fix. The test case does however not
+  properly verify that the transfers are done persistently - as I couldn't
+  think of a clever way to achieve it right now - but you need to read the
+  stderr output after a test run to see that it truly did the right thing.
+
 Daniel Stenberg (13 Apr 2009)
 - bug report #2727981 (http://curl.haxx.se/bug/view.cgi?id=2727981) by Martin
   Storsjö pointed out how setting CURLOPT_NOBODY to 0 could be downright
index 5282204..1fa93dd 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -4146,7 +4146,12 @@ static CURLcode ftp_setup_connection(struct connectdata * conn)
       return CURLE_UNSUPPORTED_PROTOCOL;
 #endif
     }
-
+    /*
+     * We explicitly mark this connection as persistent here as we're doing
+     * FTP over HTTP and thus we accidentally avoid setting this value
+     * otherwise.
+     */
+    conn->bits.close = FALSE;
 #else
     failf(data, "FTP over http proxy requires HTTP support built-in!");
     return CURLE_UNSUPPORTED_PROTOCOL;
index 37c8b20..d706887 100644 (file)
@@ -60,7 +60,8 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46           \
  test1072 test1073 test1074 test1075 test1076 test1077 test1078 test1079   \
  test1080 test1081 test1082 test1083 test1084 test1085 test633 test634     \
  test635 test636 test637 test558 test559 test1086 test1087 test1088        \
- test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096
+ test1089 test1090 test1091 test1092 test1093 test1094 test1095 test1096   \
+ test1097 test560 test561 test1098
 
 filecheck:
        @mkdir test-place; \
diff --git a/tests/data/test1098 b/tests/data/test1098
new file mode 100644 (file)
index 0000000..b5c45cb
--- /dev/null
@@ -0,0 +1,73 @@
+<testcase>
+<info>
+<keywords>
+FTP
+HTTP proxy
+CURLOPT_PROXY
+</keywords>
+</info>
+
+#
+# Server-side
+<reply>
+<data nocheck="yes">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+
+hello
+</data>
+
+</reply>
+
+#
+# Client-side
+<client>
+<server>
+http
+</server>
+<features>
+http
+ftp
+</features>
+ <name>
+FTP RETR twice over proxy confirming persistent connection
+ </name>
+
+ <command>
+ftp://ftp-site/moo/1098 ftp://ftp-site/moo/1098 --proxy http://%HOSTIP:%HTTPPORT
+</command>
+</client>
+
+#
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+^User-Agent:.*
+</strip>
+<protocol>
+GET ftp://ftp-site/moo/1098 HTTP/1.1\r
+Host: ftp-site:21\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+GET ftp://ftp-site/moo/1098 HTTP/1.1\r
+Host: ftp-site:21\r
+Accept: */*\r
+Proxy-Connection: Keep-Alive\r
+\r
+</protocol>
+<stdout mode="text">
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+
+hello
+HTTP/1.1 200 OK
+Date: Thu, 09 Nov 2010 14:49:00 GMT
+Content-Length: 6
+
+hello
+</stdout>
+</verify>
+</testcase>