aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES11
-rw-r--r--RELEASE-NOTES3
-rw-r--r--lib/multi.c13
3 files changed, 20 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index eb11cd91e..88ac15470 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,17 @@
Changelog
Daniel Stenberg (8 Sep 2008)
+- Dmitry Kurochkin patched a problem: I have found bug in pipelining through
+ proxy. I have a transparent proxy. When running with http_proxy environment
+ variable not set my test completes fine (it goes through transparent
+ proxy). When I set http_proxy variable my test hangs after the first
+ downloaded is complete. Looks like the second handle never gets out from
+ WAITDO state.
+
+ The fix: It makes checkPendPipeline move 1 handler from pend pipe to send
+ pipe if pipelining is not supported by server but there are no handles in
+ send and recv pipes.
+
- Stefan Krause pointed out that libcurl would wrongly send away cookies to
sites in cases where the cookie clearly has a very old expiry date. The
condition was simply that libcurl's date parser would fail to convert the
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index 3c4885dcb..56b4933dd 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -20,6 +20,7 @@ This release includes the following bugfixes:
o NetWare LIBC builds are now largefile feature enabled by default
o curl_easy_pause() could behave wrongly on unpause
o cookie with invalid expire dates are now considered expired
+ o HTTP pipelining over proxy
This release includes the following known bugs:
@@ -33,6 +34,6 @@ This release would not have looked like this without help, code, reports and
advice from friends like these:
Keith Mok, Yang Tse, Daniel Fandrich, Guenter Knauf, Dmitriy Sergeyev,
- Linus Nielsen Feltzing, Martin Drasar, Stefan Krause
+ Linus Nielsen Feltzing, Martin Drasar, Stefan Krause, Dmitry Kurochkin
Thanks! (and sorry if I forgot to mention someone)
diff --git a/lib/multi.c b/lib/multi.c
index f8602e1d6..70ea38120 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1988,11 +1988,13 @@ static int checkPendPipeline(struct connectdata *conn)
int result = 0;
struct curl_llist_element *sendhead = conn->send_pipe->head;
- if (conn->server_supports_pipelining) {
- size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size;
+ size_t pipeLen = conn->send_pipe->size + conn->recv_pipe->size;
+ if (conn->server_supports_pipelining || pipeLen == 0) {
struct curl_llist_element *curr = conn->pend_pipe->head;
+ const size_t maxPipeLen =
+ conn->server_supports_pipelining ? MAX_PIPELINE_LENGTH : 1;
- while(pipeLen < MAX_PIPELINE_LENGTH && curr) {
+ while(pipeLen < maxPipeLen && curr) {
Curl_llist_move(conn->pend_pipe, curr,
conn->send_pipe, conn->send_pipe->tail);
Curl_pgrsTime(curr->ptr, TIMER_PRETRANSFER);
@@ -2000,11 +2002,10 @@ static int checkPendPipeline(struct connectdata *conn)
curr = conn->pend_pipe->head;
++pipeLen;
}
- if (result > 0)
- conn->now = Curl_tvnow();
}
- if(result) {
+ if (result) {
+ conn->now = Curl_tvnow();
/* something moved, check for a new send pipeline leader */
if(sendhead != conn->send_pipe->head) {
/* this is a new one as head, expire it */