summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKurt Fankhauser <kurtbutfrank@gmail.com>2015-10-23 14:57:30 +0200
committerDaniel Stenberg <daniel@haxx.se>2015-10-23 14:57:30 +0200
commit529f9310b1febcd3626aefbc598032572efb248a (patch)
treeb81bc965fd7ea0332f8b48251f2ecbc1c5fa7784
parentb1199def8c214163a86c0afd405a9f93aa7d2007 (diff)
downloadcurl-529f9310b1febcd3626aefbc598032572efb248a.tar.gz
ftp: allow CURLOPT_IGNORE_CONTENT_LENGTH to ignore size
This allows FTP transfers with growing (or shrinking) files without causing a transfer error. Closes #480
-rw-r--r--docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.314
-rw-r--r--lib/ftp.c16
2 files changed, 24 insertions, 6 deletions
diff --git a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
index 51fd6b08c..36b2d8672 100644
--- a/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
+++ b/docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3
@@ -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"
diff --git a/lib/ftp.c b/lib/ftp.c
index 639a063ea..21db56c8e 100644
--- 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;