Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize.

This commit is contained in:
Daniel Stenberg 2003-10-17 13:11:00 +00:00
parent 94568f884d
commit ce5db9a86e
11 changed files with 60 additions and 7 deletions

View File

@ -8,6 +8,8 @@
Daniel (17 October)
- Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize.
- Made libcurl show verbose info about what auth type and user name that is
being sent in its HTTP request-headers.

View File

@ -2,6 +2,7 @@ Curl and libcurl 7.10.8 is out! A bugfix release.
This release includes the following changes:
o CURLOPT_MAXFILESIZE was added, and --max-filesize.
o CURLOPT_PASSWDFUNCTION and CURLOPT_PASSWDDATA are no longer supported.
o IPv6 is now supported on Windows builds too
o CURLOPT_IPRESOLVE lets you select pure IPv6 or IPv4 resolved addresses

View File

@ -34,11 +34,6 @@ TODO
>4GB all over. Bug reports (and source reviews) show that it doesn't
currently work.
* CURLOPT_MAXFILESIZE. Prevent downloads that are larger than the specified
size. CURLE_FILESIZE_EXCEEDED would then be returned. Gautam Mani
requested. That is, the download should not even begin but be aborted
immediately.
LIBCURL - multi interface
* Add curl_multi_timeout() to make libcurl's ares-functionality better.

View File

@ -2,7 +2,7 @@
.\" nroff -man curl.1
.\" Written by Daniel Stenberg
.\"
.TH curl 1 "23 Sep 2003" "Curl 7.10.8" "Curl Manual"
.TH curl 1 "17 Oct 2003" "Curl 7.10.8" "Curl Manual"
.SH NAME
curl \- transfer a URL
.SH SYNOPSIS
@ -456,6 +456,14 @@ authentication info (which is plaintext in the case of HTTP Basic
authentication).
If this option is used twice, the second will again disable location following.
.IP "--max-filesize <bytes>"
Specify the maximum size (in bytes) of a file to download. If the file
requested is larger than this value, the transfer will not start and curl will
return with exit code 63.
NOTE: The file size is not always known prior to download, and for such files
this option has no effect even if the file transfer ends up being larger than
this given limit. This concerns both FTP and HTTP transfers.
.IP "-m/--max-time <seconds>"
Maximum time in seconds that you allow the whole operation to take. This is
useful for preventing your batch jobs from hanging for hours due to slow
@ -1053,6 +1061,10 @@ Couldn't use specified SSL cipher
Problem with the CA cert (path? permission?)
.IP 61
Unrecognized transfer encoding
.IP 62
Invalid LDAP URL
.IP 63
Maximum file size exceeded
.IP XX
There will appear more error codes here in future releases. The existing ones
are meant to never change.

View File

@ -719,6 +719,15 @@ libcurl what the expected size of the infile is.
.B CURLOPT_UPLOAD
A non-zero parameter tells the library to prepare for an upload. The
CURLOPT_READDATA and CURLOPT_INFILESIZE are also interesting for uploads.
.TP
.B CURLOPT_MAXFILESIZE
Pass a long as parameter. This allows you to specify the maximum size (in
bytes) of a file to download. If the file requested is larger than this value,
the transfer will not start and CURLE_FILESIZE_EXCEEDED will be returned.
NOTE: The file size is not always known prior to download, and for such files
this option has no effect even if the file transfer ends up being larger than
this given limit. This concerns both FTP and HTTP transfers.
.PP
.SH CONNECTION OPTIONS
.TP 0.4i

View File

@ -218,6 +218,7 @@ typedef enum {
CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */
CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
CURL_LAST /* never use! */
} CURLcode;
@ -689,6 +690,10 @@ typedef enum {
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
CINIT(IPRESOLVE, LONG, 113),
/* Set this option to limit the size of a file that will be downloaded from
an HTTP or FTP server. */
CINIT(MAXFILESIZE, LONG, 114),
CURLOPT_LASTENTRY /* the last unused */
} CURLoption;

View File

@ -1777,8 +1777,13 @@ CURLcode Curl_ftp_nextconnect(struct connectdata *conn)
downloads and when talking to servers that don't give away the size
in the RETR response line. */
result = ftp_getsize(conn, ftp->file, &foundsize);
if(CURLE_OK == result)
if(CURLE_OK == result) {
if (data->set.max_filesize && foundsize > data->set.max_filesize) {
failf(data, "Maximum file size exceeded");
return CURLE_FILESIZE_EXCEEDED;
}
downloadsize = foundsize;
}
if(conn->resume_from) {

View File

@ -578,6 +578,11 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* check for Content-Length: header lines to get size */
if (checkprefix("Content-Length:", k->p) &&
sscanf (k->p+15, " %ld", &k->contentlength)) {
if (data->set.max_filesize && k->contentlength >
data->set.max_filesize) {
failf(data, "Maximum file size exceeded");
return CURLE_FILESIZE_EXCEEDED;
}
conn->size = k->contentlength;
Curl_pgrsSetDownloadSize(data, k->contentlength);
}

View File

@ -1238,6 +1238,13 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...)
data->set.http200aliases = va_arg(param, struct curl_slist *);
break;
case CURLOPT_MAXFILESIZE:
/*
* Set the maximum size of a file to download.
*/
data->set.max_filesize = va_arg(param, long);
break;
default:
/* unknown tag and its companion, just ignore: */
return CURLE_FAILED_INIT; /* correct this */

View File

@ -828,6 +828,8 @@ struct UserDefined {
struct curl_slist *http200aliases; /* linked list of aliases for http200 */
int ip_version;
long max_filesize; /* Maximum file size to download */
/* Here follows boolean settings that define how to behave during
this session. They are STATIC, set by libcurl users or at least initially

View File

@ -428,6 +428,7 @@ static void help(void)
" following locations, even when hostname changed",
" -m/--max-time <seconds> Maximum time allowed for the transfer",
" --max-redirs <num> Set maximum number of redirections allowed (H)",
" --max-filesize <bytes> Set the maximum file size to download (H/F)",
" -M/--manual Display huge help text",
" -n/--netrc Must read .netrc for user name and password",
" --netrc-optional Use either .netrc or URL; overrides -n",
@ -506,6 +507,7 @@ struct Configurable {
long timeout;
long connecttimeout;
long maxredirs;
long max_filesize;
char *headerfile;
char *ftpport;
char *iface;
@ -1140,6 +1142,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
{"*v", "stderr", TRUE},
{"*w", "interface", TRUE},
{"*x", "krb4", TRUE},
{"*y", "max-filesize", TRUE},
{"0", "http1.0", FALSE},
{"1", "tlsv1", FALSE},
{"2", "sslv2", FALSE},
@ -1406,6 +1409,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
/* krb4 level string */
GetStr(&config->krb4level, nextarg);
break;
case 'y': /* --max-filesize */
config->max_filesize = atoi(nextarg);
break;
default: /* the URL! */
{
@ -3247,6 +3253,10 @@ operate(struct Configurable *config, int argc, char *argv[])
if(config->proxyntlm)
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
/* new in curl 7.10.8 */
if (config->max_filesize)
curl_easy_setopt(curl, CURLOPT_MAXFILESIZE, config->max_filesize);
res = curl_easy_perform(curl);
if((config->progressmode == CURL_PROGRESS_BAR) &&