diff options
author | Kurt Fankhauser <kurtbutfrank@gmail.com> | 2015-10-23 14:57:30 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2015-10-23 14:57:30 +0200 |
commit | 529f9310b1febcd3626aefbc598032572efb248a (patch) | |
tree | b81bc965fd7ea0332f8b48251f2ecbc1c5fa7784 | |
parent | b1199def8c214163a86c0afd405a9f93aa7d2007 (diff) |
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.3 | 14 | ||||
-rw-r--r-- | lib/ftp.c | 16 |
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" @@ -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; |