From 30f7a2ff20deea9b9950c54ec17c7ea9f7c77866 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Fri, 17 Apr 2009 12:48:24 +0000 Subject: [PATCH] - 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. --- CHANGES | 11 +++++++ lib/ftp.c | 7 +++- tests/data/Makefile.am | 3 +- tests/data/test1098 | 73 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 tests/data/test1098 diff --git a/CHANGES b/CHANGES index 1c270c83a..4d6af3457 100644 --- 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 diff --git a/lib/ftp.c b/lib/ftp.c index 5282204a7..1fa93dd37 100644 --- 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; diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 37c8b2051..d7068871e 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -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 index 000000000..b5c45cbc9 --- /dev/null +++ b/tests/data/test1098 @@ -0,0 +1,73 @@ + + + +FTP +HTTP proxy +CURLOPT_PROXY + + + +# +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 09 Nov 2010 14:49:00 GMT +Content-Length: 6 + +hello + + + + +# +# Client-side + + +http + + +http +ftp + + +FTP RETR twice over proxy confirming persistent connection + + + +ftp://ftp-site/moo/1098 ftp://ftp-site/moo/1098 --proxy http://%HOSTIP:%HTTPPORT + + + +# +# Verify data after the test has been "shot" + + +^User-Agent:.* + + +GET ftp://ftp-site/moo/1098 HTTP/1.1 +Host: ftp-site:21 +Accept: */* +Proxy-Connection: Keep-Alive + +GET ftp://ftp-site/moo/1098 HTTP/1.1 +Host: ftp-site:21 +Accept: */* +Proxy-Connection: Keep-Alive + + + +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 + + +