Permalink
Browse files

Dominick Meglio implemented CURLOPT_MAXFILESIZE and --max-filesize.

  • Loading branch information...
1 parent 94568f8 commit ce5db9a86ea1508b0caaeec38adc5397e390dc3e @bagder bagder committed Oct 17, 2003
Showing with 60 additions and 7 deletions.
  1. +2 −0 CHANGES
  2. +1 −0 RELEASE-NOTES
  3. +0 −5 docs/TODO
  4. +13 −1 docs/curl.1
  5. +9 −0 docs/libcurl/curl_easy_setopt.3
  6. +5 −0 include/curl/curl.h
  7. +6 −1 lib/ftp.c
  8. +5 −0 lib/transfer.c
  9. +7 −0 lib/url.c
  10. +2 −0 lib/urldata.h
  11. +10 −0 src/main.c
View
@@ -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
@@ -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
@@ -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
@@ -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
View
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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) &&

0 comments on commit ce5db9a

Please sign in to comment.