1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-22 16:18:48 -05:00

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
This commit is contained in:
Kurt Fankhauser 2015-10-23 14:57:30 +02:00 committed by Daniel Stenberg
parent b1199def8c
commit 529f9310b1
2 changed files with 24 additions and 6 deletions

View File

@ -22,7 +22,7 @@
.\" .\"
.TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options" .TH CURLOPT_IGNORE_CONTENT_LENGTH 3 "19 Jun 2014" "libcurl 7.37.0" "curl_easy_setopt options"
.SH NAME .SH NAME
CURLOPT_IGNORE_CONTENT_LENGTH \- ignore Content-Length in HTTP response CURLOPT_IGNORE_CONTENT_LENGTH \- ignore content length
.SH SYNOPSIS .SH SYNOPSIS
.nf .nf
#include <curl/curl.h> #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, CURLcode curl_easy_setopt(CURL *handle, CURLOPT_IGNORE_CONTENT_LENGTH,
long ignore); long ignore);
.SH DESCRIPTION .SH DESCRIPTION
If \fIignore\fP is set to 1, ignore the Content-Length header in the HTTP If \fIignore\fP is set to 1L, ignore the Content-Length header in the HTTP
response. This is useful for Apache 1.x (and similar servers) which will 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 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 used, curl will not be able to accurately report progress, and will simply
stop the download when the server ends the connection. 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. Only use this option if strictly necessary.
.SH DEFAULT .SH DEFAULT
0 0
@ -54,7 +60,7 @@ if(curl) {
} }
.fi .fi
.SH AVAILABILITY .SH AVAILABILITY
Added in 7.14.1 Added in 7.14.1. Support for FTP added in 7.46.0.
.SH RETURN VALUE .SH RETURN VALUE
Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not. Returns CURLE_OK if the option is supported, and CURLE_UNKNOWN_OPTION if not.
.SH "SEE ALSO" .SH "SEE ALSO"

View File

@ -1789,11 +1789,23 @@ static CURLcode ftp_state_quote(struct connectdata *conn,
Curl_pgrsSetDownloadSize(data, ftpc->known_filesize); Curl_pgrsSetDownloadSize(data, ftpc->known_filesize);
result = ftp_state_retr(conn, ftpc->known_filesize); result = ftp_state_retr(conn, ftpc->known_filesize);
} }
else {
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 { else {
PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file); PPSENDF(&ftpc->pp, "SIZE %s", ftpc->file);
state(conn, FTP_RETR_SIZE); state(conn, FTP_RETR_SIZE);
} }
} }
}
break; break;
case FTP_STOR_PREQUOTE: case FTP_STOR_PREQUOTE:
result = ftp_state_ul_setup(conn, FALSE); result = ftp_state_ul_setup(conn, FALSE);