diff options
-rw-r--r-- | CHANGES | 2 | ||||
-rw-r--r-- | RELEASE-NOTES | 1 | ||||
-rw-r--r-- | docs/TODO | 5 | ||||
-rw-r--r-- | docs/curl.1 | 14 | ||||
-rw-r--r-- | docs/libcurl/curl_easy_setopt.3 | 9 | ||||
-rw-r--r-- | include/curl/curl.h | 5 | ||||
-rw-r--r-- | lib/ftp.c | 7 | ||||
-rw-r--r-- | lib/transfer.c | 5 | ||||
-rw-r--r-- | lib/url.c | 7 | ||||
-rw-r--r-- | lib/urldata.h | 2 | ||||
-rw-r--r-- | src/main.c | 10 |
11 files changed, 60 insertions, 7 deletions
@@ -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 @@ -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; @@ -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); } @@ -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) && |