Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize.
This commit is contained in:
parent
94568f884d
commit
ce5db9a86e
2
CHANGES
2
CHANGES
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
14
docs/curl.1
14
docs/curl.1
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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) {
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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 */
|
||||
|
@ -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
|
||||
|
10
src/main.c
10
src/main.c
@ -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) &&
|
||||
|
Loading…
Reference in New Issue
Block a user