As reported by "Tro" in http://curl.haxx.se/mail/lib-2007-06/0161.html and
http://curl.haxx.se/mail/lib-2007-06/0238.html, libcurl didn't properly do
no-body requests on FTP files on re-used connections properly, or at least
it didn't provide the info back in the header callback properly in the
subsequent requests.
diff --git a/CHANGES b/CHANGES
index 38a734f..e3c8e3b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,13 @@
 
                                   Changelog
 
+Daniel S (23 June 2007)
+- As reported by "Tro" in http://curl.haxx.se/mail/lib-2007-06/0161.html and
+  http://curl.haxx.se/mail/lib-2007-06/0238.html, libcurl didn't properly do
+  no-body requests on FTP files on re-used connections properly, or at least
+  it didn't provide the info back in the header callback properly in the
+  subsequent requests.
+
 Daniel S (21 June 2007)
 - Gerrit Bruchhäuser pointed out a warning that the Intel(R) Thread Checker
   tool reports and it was indeed a legitimate one and it is one fixed. It was
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index dc4b1f5..b09306f 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -61,6 +61,7 @@
  o list FTP root directories when login dir is not root
  o no longer slows down when getting very many URLs on the same command line
  o lock share before decreasing dirty counter
+ o no-body FTP requests on re-used connections
 
 This release includes the following known bugs:
 
diff --git a/lib/ftp.c b/lib/ftp.c
index 30de32f..2e0740f 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1253,9 +1253,8 @@
   struct FTP *ftp = conn->data->reqdata.proto.ftp;
   struct SessionHandle *data = conn->data;
 
-  if(ftp->no_transfer || conn->bits.no_body) {
+  if(ftp->no_transfer) {
     /* doesn't transfer any data */
-    ftp->no_transfer = TRUE;
 
     /* still possibly do PRE QUOTE jobs */
     state(conn, FTP_RETR_PREQUOTE);
@@ -3351,7 +3350,7 @@
 
   DEBUGF(infof(data, "DO-MORE phase starts\n"));
 
-  if(!ftp->no_transfer && !conn->bits.no_body) {
+  if(!ftp->no_transfer) {
     /* a transfer is about to take place */
 
     if(data->set.upload) {
@@ -3415,6 +3414,13 @@
 
   DEBUGF(infof(conn->data, "DO phase starts\n"));
 
+  if(conn->bits.no_body) {
+    /* requested no body means no transfer... */
+    struct FTP *ftp = conn->data->reqdata.proto.ftp;
+    ftp->no_transfer = TRUE;
+  }
+
+
   *dophase_done = FALSE; /* not done yet */
 
   /* start the first command in the DO phase */
@@ -3795,8 +3801,7 @@
     ftp->file=NULL; /* instead of point to a zero byte, we make it a NULL
                        pointer */
 
-  if(data->set.upload && !ftp->file &&
-     (!ftp->no_transfer || conn->bits.no_body)) {
+  if(data->set.upload && !ftp->file && !ftp->no_transfer) {
     /* We need a file name when uploading. Return error! */
     failf(data, "Uploading to a URL without a file name!");
     return CURLE_URL_MALFORMAT;