mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 17:31:46 -05:00
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)
|
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
|
- Made libcurl show verbose info about what auth type and user name that is
|
||||||
being sent in its HTTP request-headers.
|
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:
|
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 CURLOPT_PASSWDFUNCTION and CURLOPT_PASSWDDATA are no longer supported.
|
||||||
o IPv6 is now supported on Windows builds too
|
o IPv6 is now supported on Windows builds too
|
||||||
o CURLOPT_IPRESOLVE lets you select pure IPv6 or IPv4 resolved addresses
|
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
|
>4GB all over. Bug reports (and source reviews) show that it doesn't
|
||||||
currently work.
|
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
|
LIBCURL - multi interface
|
||||||
|
|
||||||
* Add curl_multi_timeout() to make libcurl's ares-functionality better.
|
* 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
|
.\" nroff -man curl.1
|
||||||
.\" Written by Daniel Stenberg
|
.\" 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
|
.SH NAME
|
||||||
curl \- transfer a URL
|
curl \- transfer a URL
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@ -456,6 +456,14 @@ authentication info (which is plaintext in the case of HTTP Basic
|
|||||||
authentication).
|
authentication).
|
||||||
|
|
||||||
If this option is used twice, the second will again disable location following.
|
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>"
|
.IP "-m/--max-time <seconds>"
|
||||||
Maximum time in seconds that you allow the whole operation to take. This is
|
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
|
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?)
|
Problem with the CA cert (path? permission?)
|
||||||
.IP 61
|
.IP 61
|
||||||
Unrecognized transfer encoding
|
Unrecognized transfer encoding
|
||||||
|
.IP 62
|
||||||
|
Invalid LDAP URL
|
||||||
|
.IP 63
|
||||||
|
Maximum file size exceeded
|
||||||
.IP XX
|
.IP XX
|
||||||
There will appear more error codes here in future releases. The existing ones
|
There will appear more error codes here in future releases. The existing ones
|
||||||
are meant to never change.
|
are meant to never change.
|
||||||
|
@ -719,6 +719,15 @@ libcurl what the expected size of the infile is.
|
|||||||
.B CURLOPT_UPLOAD
|
.B CURLOPT_UPLOAD
|
||||||
A non-zero parameter tells the library to prepare for an upload. The
|
A non-zero parameter tells the library to prepare for an upload. The
|
||||||
CURLOPT_READDATA and CURLOPT_INFILESIZE are also interesting for uploads.
|
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
|
.PP
|
||||||
.SH CONNECTION OPTIONS
|
.SH CONNECTION OPTIONS
|
||||||
.TP 0.4i
|
.TP 0.4i
|
||||||
|
@ -218,6 +218,7 @@ typedef enum {
|
|||||||
CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */
|
CURLE_SSL_CACERT, /* 60 - problem with the CA cert (path?) */
|
||||||
CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */
|
CURLE_BAD_CONTENT_ENCODING, /* 61 - Unrecognized transfer encoding */
|
||||||
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
|
CURLE_LDAP_INVALID_URL, /* 62 - Invalid LDAP URL */
|
||||||
|
CURLE_FILESIZE_EXCEEDED, /* 63 - Maximum file size exceeded */
|
||||||
|
|
||||||
CURL_LAST /* never use! */
|
CURL_LAST /* never use! */
|
||||||
} CURLcode;
|
} CURLcode;
|
||||||
@ -689,6 +690,10 @@ typedef enum {
|
|||||||
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
|
affect on systems with support for more than one, i.e IPv4 _and_ IPv6. */
|
||||||
CINIT(IPRESOLVE, LONG, 113),
|
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 */
|
CURLOPT_LASTENTRY /* the last unused */
|
||||||
} CURLoption;
|
} 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
|
downloads and when talking to servers that don't give away the size
|
||||||
in the RETR response line. */
|
in the RETR response line. */
|
||||||
result = ftp_getsize(conn, ftp->file, &foundsize);
|
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;
|
downloadsize = foundsize;
|
||||||
|
}
|
||||||
|
|
||||||
if(conn->resume_from) {
|
if(conn->resume_from) {
|
||||||
|
|
||||||
|
@ -578,6 +578,11 @@ CURLcode Curl_readwrite(struct connectdata *conn,
|
|||||||
/* check for Content-Length: header lines to get size */
|
/* check for Content-Length: header lines to get size */
|
||||||
if (checkprefix("Content-Length:", k->p) &&
|
if (checkprefix("Content-Length:", k->p) &&
|
||||||
sscanf (k->p+15, " %ld", &k->contentlength)) {
|
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;
|
conn->size = k->contentlength;
|
||||||
Curl_pgrsSetDownloadSize(data, 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 *);
|
data->set.http200aliases = va_arg(param, struct curl_slist *);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CURLOPT_MAXFILESIZE:
|
||||||
|
/*
|
||||||
|
* Set the maximum size of a file to download.
|
||||||
|
*/
|
||||||
|
data->set.max_filesize = va_arg(param, long);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* unknown tag and its companion, just ignore: */
|
/* unknown tag and its companion, just ignore: */
|
||||||
return CURLE_FAILED_INIT; /* correct this */
|
return CURLE_FAILED_INIT; /* correct this */
|
||||||
|
@ -828,6 +828,8 @@ struct UserDefined {
|
|||||||
struct curl_slist *http200aliases; /* linked list of aliases for http200 */
|
struct curl_slist *http200aliases; /* linked list of aliases for http200 */
|
||||||
|
|
||||||
int ip_version;
|
int ip_version;
|
||||||
|
|
||||||
|
long max_filesize; /* Maximum file size to download */
|
||||||
|
|
||||||
/* Here follows boolean settings that define how to behave during
|
/* Here follows boolean settings that define how to behave during
|
||||||
this session. They are STATIC, set by libcurl users or at least initially
|
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",
|
" following locations, even when hostname changed",
|
||||||
" -m/--max-time <seconds> Maximum time allowed for the transfer",
|
" -m/--max-time <seconds> Maximum time allowed for the transfer",
|
||||||
" --max-redirs <num> Set maximum number of redirections allowed (H)",
|
" --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",
|
" -M/--manual Display huge help text",
|
||||||
" -n/--netrc Must read .netrc for user name and password",
|
" -n/--netrc Must read .netrc for user name and password",
|
||||||
" --netrc-optional Use either .netrc or URL; overrides -n",
|
" --netrc-optional Use either .netrc or URL; overrides -n",
|
||||||
@ -506,6 +507,7 @@ struct Configurable {
|
|||||||
long timeout;
|
long timeout;
|
||||||
long connecttimeout;
|
long connecttimeout;
|
||||||
long maxredirs;
|
long maxredirs;
|
||||||
|
long max_filesize;
|
||||||
char *headerfile;
|
char *headerfile;
|
||||||
char *ftpport;
|
char *ftpport;
|
||||||
char *iface;
|
char *iface;
|
||||||
@ -1140,6 +1142,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
{"*v", "stderr", TRUE},
|
{"*v", "stderr", TRUE},
|
||||||
{"*w", "interface", TRUE},
|
{"*w", "interface", TRUE},
|
||||||
{"*x", "krb4", TRUE},
|
{"*x", "krb4", TRUE},
|
||||||
|
{"*y", "max-filesize", TRUE},
|
||||||
{"0", "http1.0", FALSE},
|
{"0", "http1.0", FALSE},
|
||||||
{"1", "tlsv1", FALSE},
|
{"1", "tlsv1", FALSE},
|
||||||
{"2", "sslv2", FALSE},
|
{"2", "sslv2", FALSE},
|
||||||
@ -1406,6 +1409,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
/* krb4 level string */
|
/* krb4 level string */
|
||||||
GetStr(&config->krb4level, nextarg);
|
GetStr(&config->krb4level, nextarg);
|
||||||
break;
|
break;
|
||||||
|
case 'y': /* --max-filesize */
|
||||||
|
config->max_filesize = atoi(nextarg);
|
||||||
|
break;
|
||||||
|
|
||||||
default: /* the URL! */
|
default: /* the URL! */
|
||||||
{
|
{
|
||||||
@ -3247,6 +3253,10 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
if(config->proxyntlm)
|
if(config->proxyntlm)
|
||||||
curl_easy_setopt(curl, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);
|
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);
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
if((config->progressmode == CURL_PROGRESS_BAR) &&
|
if((config->progressmode == CURL_PROGRESS_BAR) &&
|
||||||
|
Loading…
x
Reference in New Issue
Block a user