aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/http.c21
-rw-r--r--lib/http.h3
-rw-r--r--lib/transfer.c7
3 files changed, 25 insertions, 6 deletions
diff --git a/lib/http.c b/lib/http.c
index 195d661d6..173de8edc 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -309,7 +309,7 @@ static bool pickoneauth(struct auth *pick)
}
/*
- * perhapsrewind()
+ * Curl_http_perhapsrewind()
*
* If we are doing POST or PUT {
* If we have more data to send {
@@ -331,18 +331,29 @@ static bool pickoneauth(struct auth *pick)
* }
* }
*/
-static CURLcode perhapsrewind(struct connectdata *conn)
+CURLcode Curl_http_perhapsrewind(struct connectdata *conn)
{
struct SessionHandle *data = conn->data;
struct HTTP *http = data->state.proto.http;
curl_off_t bytessent;
curl_off_t expectsend = -1; /* default is unknown */
- if(!http)
+ if(!http || !(conn->protocol & PROT_HTTP))
/* If this is still NULL, we have not reach very far and we can
- safely skip this rewinding stuff */
+ safely skip this rewinding stuff, or this is attempted to get used
+ when HTTP isn't activated */
return CURLE_OK;
+ infof(data, "now in %s\n", __func__);
+
+ switch(data->set.httpreq) {
+ case HTTPREQ_GET:
+ case HTTPREQ_HEAD:
+ return CURLE_OK;
+ default:
+ break;
+ }
+
bytessent = http->writebytecount;
if(conn->bits.authneg)
@@ -453,7 +464,7 @@ CURLcode Curl_http_auth_act(struct connectdata *conn)
if((data->set.httpreq != HTTPREQ_GET) &&
(data->set.httpreq != HTTPREQ_HEAD) &&
!conn->bits.rewindaftersend) {
- code = perhapsrewind(conn);
+ code = Curl_http_perhapsrewind(conn);
if(code)
return code;
}
diff --git a/lib/http.h b/lib/http.h
index 5a04f8c43..1c53120dd 100644
--- a/lib/http.h
+++ b/lib/http.h
@@ -8,7 +8,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -57,6 +57,7 @@ void Curl_http_auth_stage(struct SessionHandle *data, int stage);
CURLcode Curl_http_input_auth(struct connectdata *conn,
int httpcode, const char *header);
CURLcode Curl_http_auth_act(struct connectdata *conn);
+CURLcode Curl_http_perhapsrewind(struct connectdata *conn);
int Curl_http_should_fail(struct connectdata *conn);
diff --git a/lib/transfer.c b/lib/transfer.c
index ea6cfa357..330ba7df6 100644
--- a/lib/transfer.c
+++ b/lib/transfer.c
@@ -1116,6 +1116,12 @@ CURLcode Curl_readwrite(struct connectdata *conn,
data->req.newurl = strdup(data->req.location); /* clone */
if(!data->req.newurl)
return CURLE_OUT_OF_MEMORY;
+
+ /* some cases of POST and PUT etc needs to rewind the data
+ stream at this point */
+ result = Curl_http_perhapsrewind(conn);
+ if(result)
+ return result;
}
}
}
@@ -1570,6 +1576,7 @@ CURLcode Curl_readwrite(struct connectdata *conn,
/* we've waited long enough, continue anyway */
k->exp100 = EXP100_SEND_DATA;
k->keepon |= KEEP_WRITE;
+ infof(data, "Done waiting for 100-continue\n");
}
}
}