aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2003-10-17 13:11:00 +0000
committerDaniel Stenberg <daniel@haxx.se>2003-10-17 13:11:00 +0000
commitce5db9a86ea1508b0caaeec38adc5397e390dc3e (patch)
treee932aecf231b6fb77a0e98a1acfcb8caa1d80b16
parent94568f884dc30614f30918c9cca8cff40cc6c936 (diff)
Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize.
-rw-r--r--CHANGES2
-rw-r--r--RELEASE-NOTES1
-rw-r--r--docs/TODO5
-rw-r--r--docs/curl.114
-rw-r--r--docs/libcurl/curl_easy_setopt.39
-rw-r--r--include/curl/curl.h5
-rw-r--r--lib/ftp.c7
-rw-r--r--lib/transfer.c5
-rw-r--r--lib/url.c7
-rw-r--r--lib/urldata.h2
-rw-r--r--src/main.c10
11 files changed, 60 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index 9ebbd11c2..fb0d29d55 100644
--- a/CHANGES
+++ b/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.
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 2fe80d22b..72c645aed 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -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
diff --git a/docs/TODO b/docs/TODO
index a72fe2b2d..add94bf26 100644
--- a/docs/TODO
+++ b/docs/TODO
@@ -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.
diff --git a/docs/curl.1 b/docs/curl.1
index 7c042780e..fc55ed2c9 100644
--- a/docs/curl.1
+++ b/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.
diff --git a/docs/libcurl/curl_easy_setopt.3 b/docs/libcurl/curl_easy_setopt.3
index 22563a1ff..b9aa05682 100644
--- a/docs/libcurl/curl_easy_setopt.3
+++ b/docs/libcurl/curl_easy_setopt.3
@@ -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
diff --git a/include/curl/curl.h b/include/curl/curl.h
index 0f9e38b5b..557c942a5 100644
--- a/include/curl/curl.h
+++ b/include/curl/curl.h
@@ -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;
diff --git a/lib/ftp.c b/lib/ftp.c
index 6ee81b5d2..4b19bd0fc 100644
--- a/lib/ftp.c
+++ b/lib/ftp.c
@@ -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) {
diff --git a/lib/transfer.c b/lib/transfer.c
index 956a47996..1938a8a2c 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -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);
}
diff --git a/lib/url.c b/lib/url.c
index b4cfc798e..0d07e686d 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -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 */
diff --git a/lib/urldata.h b/lib/urldata.h
index 471049d51..0ebff5687 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -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
diff --git a/src/main.c b/src/main.c
index 54b973775..5caf803df 100644
--- a/src/main.c
+++ b/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) &&