From a4ffcfd4d52b01cacd8eea78d8d9b9f2fe353738 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Wed, 9 Apr 2003 11:56:31 +0000
Subject: [PATCH] timecond support added made the Last-Modified (faked) header
 look correct using GMT always

---
 lib/ftp.c | 47 ++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 40 insertions(+), 7 deletions(-)

diff --git a/lib/ftp.c b/lib/ftp.c
index b004902474..22c27542cf 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1970,11 +1970,37 @@ CURLcode ftp_perform(struct connectdata *conn,
         return result;
   }
 
-  /* Requested time of file? */
-  if(data->set.get_filetime && ftp->file) {
+  /* Requested time of file or time-depended transfer? */
+  if((data->set.get_filetime || data->set.timecondition) &&
+     ftp->file) {
     result = ftp_getfiletime(conn, ftp->file);
     if(result)
       return result;
+
+    if(data->set.timecondition) {
+      if((data->info.filetime > 0) && (data->set.timevalue > 0)) {
+        switch(data->set.timecondition) {
+        case TIMECOND_IFMODSINCE:
+        default:
+          if(data->info.filetime < data->set.timevalue) {
+            infof(data, "The requested document is not new enough\n");
+            ftp->no_transfer = TRUE; /* mark this to not transfer data */
+            return CURLE_OK;
+          }
+          break;
+        case TIMECOND_IFUNMODSINCE:
+          if(data->info.filetime > data->set.timevalue) {
+            infof(data, "The requested document is not old enough\n");
+            ftp->no_transfer = TRUE; /* mark this to not transfer data */
+            return CURLE_OK;
+          }
+          break;
+        } /* switch */
+      }
+      else {
+        infof(data, "Skipping time comparison\n");
+      }
+    }
   }
 
   /* If we have selected NOBODY and HEADER, it means that we only want file
@@ -2017,7 +2043,7 @@ CURLcode ftp_perform(struct connectdata *conn,
       tm = localtime((unsigned long *)&data->info.filetime);
 #endif
       /* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
-      strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S %Z\r\n",
+      strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S GMT\r\n",
                tm);
       result = Curl_client_write(data, CLIENTWRITE_BOTH, buf, 0);
       if(result)
@@ -2063,7 +2089,7 @@ CURLcode ftp_perform(struct connectdata *conn,
 CURLcode Curl_ftp(struct connectdata *conn)
 {
   CURLcode retcode;
-  bool connected;
+  bool connected=0;
 
   struct SessionHandle *data = conn->data;
   struct FTP *ftp;
@@ -2116,9 +2142,16 @@ CURLcode Curl_ftp(struct connectdata *conn)
   if(CURLE_OK == retcode) {
     if(connected)
       retcode = Curl_ftp_nextconnect(conn);
-    else
-      /* since we didn't connect now, we want do_more to get called */
-      conn->bits.do_more = TRUE;
+    else {
+      if(ftp->no_transfer) {
+        /* no data to transfer */
+        retcode=Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);        
+      }
+      else {
+        /* since we didn't connect now, we want do_more to get called */
+        conn->bits.do_more = TRUE;
+      }
+    }
   }
 
   return retcode;
-- 
GitLab