]> granicus.if.org Git - curl/commitdiff
ftp: allow CURLOPT_IGNORE_CONTENT_LENGTH to ignore size
authorKurt Fankhauser <kurtbutfrank@gmail.com>
Fri, 23 Oct 2015 12:57:30 +0000 (14:57 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 23 Oct 2015 12:57:30 +0000 (14:57 +0200)
This allows FTP transfers with growing (or shrinking) files without
causing a transfer error.

Closes #480

docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
lib/ftp.c

index 51fd6b08ce05a9e9600fa135ff04bc3ea9179101..36b2d86724457ea81f3434dac16dfcb3372d743b 100644 (file)
@@ -22,7 +22,7 @@
 .\"
 .TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
 .SH NAME
-CURLOPT_IGNORE_CONTENT_LENGTH \- ignore Content-Length in HTTP response
+CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
 .SH SYNOPSIS
 .nf
 #include <curl/curl.h>
@@ -30,12 +30,18 @@ CURLOPT_IGNORE_CONTENT_LENGTH \- ignore Content-Length in HTTP response
 CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IGNORE_CONTENT_LENGTH,
                           long ignore);
 .SH DESCRIPTION
-If \fIignore\fP is set to 1, ignore the Content-Length header in the HTTP
-response. This is useful for Apache 1.x (and similar servers) which will
+If \fIignore\fP is set to 1L, ignore the Content-Length header in the HTTP
+response and ignore asking for or relying on it for FTP transfers.
+
+This is useful for HTTP with Apache 1.x (and similar servers) which will
 report incorrect content length for files over 2 gigabytes. If this option is
 used, curl will not be able to accurately report progress, and will simply
 stop the download when the server ends the connection.
 
+It is also useful with FTP when for example the file is growing while the
+transfer is in progress which otherwise will unconditionally cause libcurl to
+report error.
+
 Only use this option if strictly necessary.
 .SH DEFAULT
 0
@@ -54,7 +60,7 @@ if(curl) {
 }
 .fi
 .SH AVAILABILITY
-Added in 7.14.1
+Added in 7.14.1. Support for FTP added in 7.46.0.
 .SH RETURN VALUE
 Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
 .SH "SEE ALSO"
index 639a063eaa66c37d278a1ff235e9d5020bede565..21db56c8ef72ace86c5ccc3f0abcf56bfba20475 100644 (file)
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -1790,8 +1790,20 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
           result = ftp_state_retr(conn, ftpc->known_filesize);
         }
         else {
-          PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
-          state(conn, FTP_RETR_SIZE);
+          if(data->set.ignorecl) {
+            /* This code is to support download of growing files.  It prevents
+               the state machine from requesting the file size from the
+               server.  With an unknown file size the download continues until
+               the server terminates it, otherwise the client stops if the
+               received byte count exceeds the reported file size.  Set option
+               CURLOPT_IGNORE_CONTENT_LENGTH to 1 to enable this behavior.*/
+            PPSENDF(&ftpc->pp, "RETR %s", ftpc->file);
+            state(conn, FTP_RETR);
+          }
+          else {
+            PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
+            state(conn, FTP_RETR_SIZE);
+          }
         }
       }
       break;