aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/multi.c4
-rw-r--r--lib/transfer.c17
-rw-r--r--lib/transfer.h2
3 files changed, 15 insertions, 8 deletions
diff --git a/lib/multi.c b/lib/multi.c
index 2822b16a4..6d037f098 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -342,7 +342,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
gotourl = strdup(easy->easy_handle->change.url);
if(gotourl) {
easy->easy_handle->change.url_changed = FALSE;
- easy->result = Curl_follow(easy->easy_handle, gotourl);
+ easy->result = Curl_follow(easy->easy_handle, gotourl, FALSE);
if(CURLE_OK == easy->result)
easy->state = CURLM_STATE_CONNECT;
else
@@ -518,7 +518,7 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
easy->easy_conn->newurl = NULL;
easy->result = Curl_done(&easy->easy_conn, CURLE_OK);
if(easy->result == CURLE_OK)
- easy->result = Curl_follow(easy->easy_handle, newurl);
+ easy->result = Curl_follow(easy->easy_handle, newurl, FALSE);
if(CURLE_OK == easy->result) {
easy->state = CURLM_STATE_CONNECT;
result = CURLM_CALL_MULTI_PERFORM;
diff --git a/lib/transfer.c b/lib/transfer.c
index f297654c9..7a15d3f3d 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1742,9 +1742,11 @@ static void strcpy_url(char *output, char *url)
* as given by the remote server and set up the new URL to request.
*/
CURLcode Curl_follow(struct SessionHandle *data,
- char *newurl) /* this 'newurl' is the Location: string,
+ char *newurl, /* this 'newurl' is the Location: string,
and it must be malloc()ed before passed
here */
+ bool retry) /* set TRUE if this is a request retry as
+ opposed to a real redirect following */
{
/* Location: redirect */
char prot[16]; /* URL protocol string storage */
@@ -1758,8 +1760,9 @@ CURLcode Curl_follow(struct SessionHandle *data,
return CURLE_TOO_MANY_REDIRECTS;
}
- /* mark the next request as a followed location: */
- data->state.this_is_a_follow = TRUE;
+ if(!retry)
+ /* mark the next request as a followed location: */
+ data->state.this_is_a_follow = TRUE;
data->set.followlocation++; /* count location-followers */
@@ -2063,7 +2066,7 @@ Curl_connect_host(struct SessionHandle *data,
res = Curl_done(conn, res);
if(CURLE_OK == res) {
char *gotourl = strdup(data->change.url);
- res = Curl_follow(data, gotourl);
+ res = Curl_follow(data, gotourl, FALSE);
if(res)
free(gotourl);
}
@@ -2086,6 +2089,7 @@ CURLcode Curl_perform(struct SessionHandle *data)
CURLcode res2;
struct connectdata *conn=NULL;
char *newurl = NULL; /* possibly a new URL to follow to! */
+ bool retry = FALSE;
data->state.used_interface = Curl_if_easy;
@@ -2119,6 +2123,8 @@ CURLcode Curl_perform(struct SessionHandle *data)
res = Transfer(conn); /* now fetch that URL please */
if(res == CURLE_OK) {
+ retry = FALSE;
+
if((conn->keep.bytecount+conn->headerbytecount == 0) &&
conn->bits.reuse) {
/* We got no data and we attempted to re-use a connection. This
@@ -2135,6 +2141,7 @@ CURLcode Curl_perform(struct SessionHandle *data)
prevent i.e HTTP transfers to return
error just because nothing has been
transfered! */
+ retry = TRUE;
}
else
/*
@@ -2174,7 +2181,7 @@ CURLcode Curl_perform(struct SessionHandle *data)
*/
if((res == CURLE_OK) && newurl) {
- res = Curl_follow(data, newurl);
+ res = Curl_follow(data, newurl, retry);
if(CURLE_OK == res) {
newurl = NULL;
continue;
diff --git a/lib/transfer.h b/lib/transfer.h
index 78a3e046b..86301d60a 100644
--- a/lib/transfer.h
+++ b/lib/transfer.h
@@ -26,7 +26,7 @@ CURLcode Curl_perform(struct SessionHandle *data);
CURLcode Curl_pretransfer(struct SessionHandle *data);
CURLcode Curl_pretransfersec(struct connectdata *conn);
CURLcode Curl_posttransfer(struct SessionHandle *data);
-CURLcode Curl_follow(struct SessionHandle *data, char *newurl);
+CURLcode Curl_follow(struct SessionHandle *data, char *newurl, bool retry);
CURLcode Curl_readwrite(struct connectdata *conn, bool *done);
void Curl_single_fdset(struct connectdata *conn,
fd_set *read_fd_set,