Bogdan Nicula's second test case (posted Sun, 08 Oct 2006) converted to test

case 535 and it now runs fine. Again a problem with the pipelining code not
taking all possible (error) conditions into account.
This commit is contained in:
Daniel Stenberg 2006-10-09 06:58:05 +00:00
parent eceb37bde2
commit a1de9367ec
7 changed files with 88 additions and 12 deletions

View File

@ -6,9 +6,14 @@
Changelog Changelog
Daniel (9 October 2006)
- Bogdan Nicula's second test case (posted Sun, 08 Oct 2006) converted to test
case 535 and it now runs fine. Again a problem with the pipelining code not
taking all possible (error) conditions into account.
Daniel (6 October 2006) Daniel (6 October 2006)
- Bogdan Nicula's hanging test case was converted to test case 533 and the test - Bogdan Nicula's hanging test case (posted Wed, 04 Oct 2006) was converted to
now runs fine. test case 533 and the test now runs fine.
Daniel (4 October 2006) Daniel (4 October 2006)
- Dmitriy Sergeyev provided an example source code that crashed CVS libcurl - Dmitriy Sergeyev provided an example source code that crashed CVS libcurl

View File

@ -1081,9 +1081,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
break; break;
case CURLM_STATE_WAITPERFORM: case CURLM_STATE_WAITPERFORM:
infof(easy->easy_handle, "Connection #%d: recv pipe size = %d\n", #ifdef CURLDEBUG
infof(easy->easy_handle, "Conn %d recv pipe %d inuse %d athead %d\n",
easy->easy_conn->connectindex, easy->easy_conn->connectindex,
easy->easy_conn->recv_pipe->size); easy->easy_conn->recv_pipe->size,
easy->easy_conn->readchannel_inuse,
Curl_isHandleAtHead(easy->easy_handle,
easy->easy_conn->recv_pipe));
#endif
/* Wait for our turn to PERFORM */ /* Wait for our turn to PERFORM */
if (!easy->easy_conn->readchannel_inuse && if (!easy->easy_conn->readchannel_inuse &&
Curl_isHandleAtHead(easy->easy_handle, Curl_isHandleAtHead(easy->easy_handle,

View File

@ -1840,7 +1840,7 @@ void Curl_addHandleToPipeline(struct SessionHandle *data,
} }
void Curl_removeHandleFromPipeline(struct SessionHandle *handle, int Curl_removeHandleFromPipeline(struct SessionHandle *handle,
struct curl_llist *pipe) struct curl_llist *pipe)
{ {
struct curl_llist_element *curr; struct curl_llist_element *curr;
@ -1849,10 +1849,11 @@ void Curl_removeHandleFromPipeline(struct SessionHandle *handle,
while (curr) { while (curr) {
if (curr->ptr == handle) { if (curr->ptr == handle) {
Curl_llist_remove(pipe, curr, NULL); Curl_llist_remove(pipe, curr, NULL);
break; return 1; /* we removed a handle */
} }
curr = curr->next; curr = curr->next;
} }
return 0;
} }
#if 0 #if 0
@ -3975,8 +3976,14 @@ CURLcode Curl_done(struct connectdata **connp,
conn->bits.done = TRUE; /* called just now! */ conn->bits.done = TRUE; /* called just now! */
/* cleanups done even if the connection is re-used */ if(Curl_removeHandleFromPipeline(data, conn->recv_pipe) &&
conn->readchannel_inuse)
conn->readchannel_inuse--;
if(Curl_removeHandleFromPipeline(data, conn->send_pipe) &&
conn->writechannel_inuse)
conn->writechannel_inuse--;
/* cleanups done even if the connection is re-used */
if(data->reqdata.rangestringalloc) { if(data->reqdata.rangestringalloc) {
free(data->reqdata.range); free(data->reqdata.range);
data->reqdata.rangestringalloc = FALSE; data->reqdata.rangestringalloc = FALSE;

View File

@ -64,8 +64,8 @@ int Curl_doing_getsock(struct connectdata *conn,
void Curl_addHandleToPipeline(struct SessionHandle *handle, void Curl_addHandleToPipeline(struct SessionHandle *handle,
struct curl_llist *pipe); struct curl_llist *pipe);
void Curl_removeHandleFromPipeline(struct SessionHandle *handle, int Curl_removeHandleFromPipeline(struct SessionHandle *handle,
struct curl_llist *pipe); struct curl_llist *pipe);
bool Curl_isHandleAtHead(struct SessionHandle *handle, bool Curl_isHandleAtHead(struct SessionHandle *handle,
struct curl_llist *pipe); struct curl_llist *pipe);

View File

@ -36,4 +36,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
test265 test266 test267 test268 test269 test270 test271 test272 test273 \ test265 test266 test267 test268 test269 test270 test271 test272 test273 \
test274 test275 test524 test525 test276 test277 test526 test527 test528 \ test274 test275 test524 test525 test276 test277 test526 test527 test528 \
test530 DISABLED test278 test279 test531 test280 test529 test532 test533 \ test530 DISABLED test278 test279 test531 test280 test529 test532 test533 \
test534 test534 test535

59
tests/data/test535 Normal file
View File

@ -0,0 +1,59 @@
<reply>
<data mode="text">
HTTP/1.1 404 Badness
Date: Thu, 09 Nov 2010 14:49:00 GMT
ETag: "21025-dc7-39462498"
Content-Length: 6
Content-Type: text/html
Funny-head: yesyes
hejsan
</data>
<data1>
HTTP/1.1 200 Fine
Date: Thu, 09 Nov 2010 14:49:00 GMT
Content-Length: 13
Connection: close
Content-Type: text/html
fine content
</data1>
<datacheck>
fine content
</datacheck>
</reply>
# Client-side
<client>
<server>
http
</server>
# tool is what to use instead of 'curl'
<tool>
lib533
</tool>
<name>
HTTP GET multi two files with FAILONERROR
</name>
<command>
http://%HOSTIP:%HTTPPORT/535 http://%HOSTIP:%HTTPPORT/5350001
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
GET /535 HTTP/1.1
Host: 127.0.0.1:%HTTPPORT
Accept: */*
GET /5350001 HTTP/1.1
Host: 127.0.0.1:%HTTPPORT
Accept: */*
</protocol>
</verify>

View File

@ -34,9 +34,8 @@ int test(char *URL)
return 100 + i; /* major bad */ return 100 + i; /* major bad */
curl_easy_setopt(curl, CURLOPT_URL, URL); curl_easy_setopt(curl, CURLOPT_URL, URL);
/* go verbose */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
m = curl_multi_init(); m = curl_multi_init();
@ -65,6 +64,7 @@ int test(char *URL)
curl_easy_reset(curl); curl_easy_reset(curl);
curl_easy_setopt(curl, CURLOPT_URL, arg2); curl_easy_setopt(curl, CURLOPT_URL, arg2);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1);
/* re-add it */ /* re-add it */
res = (int)curl_multi_add_handle(m, curl); res = (int)curl_multi_add_handle(m, curl);