Nis Jorgensen filed bug report #1338648

(http://curl.haxx.se/bug/view.cgi?id=1338648) which really is more of a
feature request, but anyway. It pointed out that --max-redirs did not allow
it to be set to 0, which then would return an error code on the first
Location: found. Based on Nis' patch, now libcurl supports CURLOPT_MAXREDIRS
set to 0, or -1 for infinity. Added test case 274 to verify.
This commit is contained in:
Daniel Stenberg 2005-10-27 22:05:38 +00:00
parent 6f8fe67ace
commit 966fa848a0
9 changed files with 72 additions and 12 deletions

View File

@ -9,6 +9,13 @@
Daniel (27 October 2005) Daniel (27 October 2005)
- Nis Jorgensen filed bug report #1338648
(http://curl.haxx.se/bug/view.cgi?id=1338648) which really is more of a
feature request, but anyway. It pointed out that --max-redirs did not allow
it to be set to 0, which then would return an error code on the first
Location: found. Based on Nis' patch, now libcurl supports CURLOPT_MAXREDIRS
set to 0, or -1 for infinity. Added test case 274 to verify.
- tommink[at]post.pl reported in bug report #1337723 - tommink[at]post.pl reported in bug report #1337723
(http://curl.haxx.se/bug/view.cgi?id=1337723) that curl could not upload (http://curl.haxx.se/bug/view.cgi?id=1337723) that curl could not upload
binary data from stdin on Windows if the data contained control-Z (hex 1a) binary data from stdin on Windows if the data contained control-Z (hex 1a)

View File

@ -1127,7 +1127,8 @@ If this option is used several times, the last one will be used.
.IP "--max-redirs <num>" .IP "--max-redirs <num>"
Set maximum number of redirection-followings allowed. If \fI-L/--location\fP Set maximum number of redirection-followings allowed. If \fI-L/--location\fP
is used, this option can be used to prevent curl from following redirections is used, this option can be used to prevent curl from following redirections
\&"in absurdum". \&"in absurdum". By default, the limit is set to 50 redirections. Set this
option to -1 to make it limitless.
If this option is used several times, the last one will be used. If this option is used several times, the last one will be used.
.IP "-0/--http1.0" .IP "-0/--http1.0"

View File

@ -21,7 +21,7 @@
.\" * $Id$ .\" * $Id$
.\" ************************************************************************** .\" **************************************************************************
.\" .\"
.TH curl_easy_setopt 3 "22 Sep 2005" "libcurl 7.14.2" "libcurl Manual" .TH curl_easy_setopt 3 "27 Oct 2005" "libcurl 7.14.2" "libcurl Manual"
.SH NAME .SH NAME
curl_easy_setopt - set options for a curl easy handle curl_easy_setopt - set options for a curl easy handle
.SH SYNOPSIS .SH SYNOPSIS
@ -516,7 +516,9 @@ option is meaningful only when setting \fICURLOPT_FOLLOWLOCATION\fP.
Pass a long. The set number will be the redirection limit. If that many Pass a long. The set number will be the redirection limit. If that many
redirections have been followed, the next redirect will cause an error redirections have been followed, the next redirect will cause an error
(\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the (\fICURLE_TOO_MANY_REDIRECTS\fP). This option only makes sense if the
\fICURLOPT_FOLLOWLOCATION\fP is used at the same time. \fICURLOPT_FOLLOWLOCATION\fP is used at the same time. Added in 7.15.1:
Setting the limit to 0 will make libcurl refuse any redirect. Set it to -1 for
an infinite number of redirects (which is the default)
.IP CURLOPT_PUT .IP CURLOPT_PUT
A non-zero parameter tells the library to use HTTP PUT to transfer data. The A non-zero parameter tells the library to use HTTP PUT to transfer data. The
data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP. data should be set with \fICURLOPT_READDATA\fP and \fICURLOPT_INFILESIZE\fP.

View File

@ -1765,7 +1765,7 @@ CURLcode Curl_follow(struct SessionHandle *data,
size_t newlen; size_t newlen;
char *newest; char *newest;
if (data->set.maxredirs && if ((data->set.maxredirs != -1) &&
(data->set.followlocation >= data->set.maxredirs)) { (data->set.followlocation >= data->set.maxredirs)) {
failf(data,"Maximum (%d) redirects followed", data->set.maxredirs); failf(data,"Maximum (%d) redirects followed", data->set.maxredirs);
return CURLE_TOO_MANY_REDIRECTS; return CURLE_TOO_MANY_REDIRECTS;

View File

@ -320,7 +320,7 @@ CURLcode Curl_open(struct SessionHandle **curl)
data->set.infilesize = -1; /* we don't know any size */ data->set.infilesize = -1; /* we don't know any size */
data->set.postfieldsize = -1; data->set.postfieldsize = -1;
data->set.maxredirs = -1; /* allow any amount by default */
data->state.current_speed = -1; /* init to negative == impossible */ data->state.current_speed = -1; /* init to negative == impossible */
data->set.httpreq = HTTPREQ_GET; /* Default HTTP request */ data->set.httpreq = HTTPREQ_GET; /* Default HTTP request */

View File

@ -956,7 +956,8 @@ struct UserDefined {
char *set_range; /* range, if used. See README for detailed specification char *set_range; /* range, if used. See README for detailed specification
on this syntax. */ on this syntax. */
long followlocation; /* as in HTTP Location: */ long followlocation; /* as in HTTP Location: */
long maxredirs; /* maximum no. of http(s) redirects to follow */ long maxredirs; /* maximum no. of http(s) redirects to follow, set to -1
for infinity */
char *set_referer; /* custom string */ char *set_referer; /* custom string */
bool free_referer; /* set TRUE if 'referer' points to a string we bool free_referer; /* set TRUE if 'referer' points to a string we
allocated */ allocated */

View File

@ -3211,6 +3211,7 @@ operate(struct Configurable *config, int argc, char *argv[])
config->create_dirs=FALSE; config->create_dirs=FALSE;
config->lastrecvtime = curlx_tvnow(); config->lastrecvtime = curlx_tvnow();
config->lastsendtime = curlx_tvnow(); config->lastsendtime = curlx_tvnow();
config->maxredirs = DEFAULT_MAXREDIRS;
if(argc>1 && if(argc>1 &&
(!curlx_strnequal("--", argv[1], 2) && (argv[1][0] == '-')) && (!curlx_strnequal("--", argv[1], 2) && (argv[1][0] == '-')) &&
@ -3803,11 +3804,7 @@ operate(struct Configurable *config, int argc, char *argv[])
curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE); curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE);
} }
if (config->maxredirs) curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
else
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, DEFAULT_MAXREDIRS);
curl_easy_setopt(curl, CURLOPT_CRLF, config->crlf); curl_easy_setopt(curl, CURLOPT_CRLF, config->crlf);
curl_easy_setopt(curl, CURLOPT_QUOTE, config->quote); curl_easy_setopt(curl, CURLOPT_QUOTE, config->quote);
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, config->postquote); curl_easy_setopt(curl, CURLOPT_POSTQUOTE, config->postquote);

View File

@ -33,4 +33,6 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
test237 test238 test239 test243 test245 test246 test247 test248 test249 \ test237 test238 test239 test243 test245 test246 test247 test248 test249 \
test250 test251 test252 test253 test254 test255 test521 test522 test523 \ test250 test251 test252 test253 test254 test255 test521 test522 test523 \
test256 test257 test258 test259 test260 test261 test262 test263 test264 \ test256 test257 test258 test259 test260 test261 test262 test263 test264 \
test265 test266 test267 test268 test269 test270 test271 test272 test273 test265 test266 test267 test268 test269 test270 test271 test272 test273 \
test274

50
tests/data/test274 Normal file
View File

@ -0,0 +1,50 @@
<info>
<keywords>
HTTP
HTTP GET
followlocation
--max-redirs
</keywords>
</info>
# Server-side
<reply>
<data>
HTTP/1.1 301 This is a weirdo text message swsclose
Server: test-server/fake
Location: data/reply/25
Content-Length: 0
Connection: close
</data>
</reply>
# Client-side
<client>
<server>
http
</server>
<name>
HTTP Location: following with --max-redirs 0
</name>
<command>
http://%HOSTIP:%HTTPPORT/want/274 -L --max-redirs 0
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<strip>
^User-Agent: curl/.*
</strip>
<protocol>
GET /want/274 HTTP/1.1
User-Agent: curl/7.8.1-pre3 (sparc-sun-solaris2.7) libcurl 7.8.1-pre3 (OpenSSL 0.9.6a) (krb4 enabled)
Host: 127.0.0.1:%HTTPPORT
Accept: */*
</protocol>
<errorcode>
47
</errorcode>
</verify>