From 529f9310b1febcd3626aefbc598032572efb248a Mon Sep 17 00:00:00 2001 From: Kurt Fankhauser Date: Fri, 23 Oct 2015 14:57:30 +0200 Subject: 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 --- docs/libcurl/opts/CURLOPT_IGNORE_CONTENT_LENGTH.3 | 14 ++++++++++---- 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 @@ -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; -- cgit v1.2.1