1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

Bogdan Nicula's hanging test case was converted to test case 533 and the test

now runs fine.
This commit is contained in:
Daniel Stenberg 2006-10-06 21:19:57 +00:00
parent ca5846cde9
commit befc30bc55
7 changed files with 189 additions and 8 deletions

View File

@ -6,6 +6,10 @@
Changelog Changelog
Daniel (6 October 2006)
- Bogdan Nicula's hanging test case was converted to 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
but that worked nicely in 7.15.5. I converted it into test case 532 and but that worked nicely in 7.15.5. I converted it into test case 532 and

View File

@ -61,6 +61,6 @@ advice from friends like these:
Domenico Andreoli, Armel Asselin, Gisle Vanem, Yang Tse, Andrew Biggs, Domenico Andreoli, Armel Asselin, Gisle Vanem, Yang Tse, Andrew Biggs,
Peter Sylvester, David McCreedy, Dmitriy Sergeyev, Dmitry Rechkin, Peter Sylvester, David McCreedy, Dmitriy Sergeyev, Dmitry Rechkin,
Jari Sundell, Ravi Pratap, Michele Bini, Jeff Pohlmeyer, Michael Wallner, Jari Sundell, Ravi Pratap, Michele Bini, Jeff Pohlmeyer, Michael Wallner,
Mike Protts, Cory Nelson, Bernard Leak Mike Protts, Cory Nelson, Bernard Leak, Bogdan Nicula
Thanks! (and sorry if I forgot to mention someone) Thanks! (and sorry if I forgot to mention someone)

View File

@ -1,8 +1,6 @@
To get fixed in 7.16.0 (planned release: October 2006) To get fixed in 7.16.0 (planned release: October 2006)
====================== ======================
66 - Bogdan Nicula's test case
67 - Jeff Pohlmeyer's test case 67 - Jeff Pohlmeyer's test case
68 - Dmitriy Sergeyev's test02.c and test03.c 68 - Dmitriy Sergeyev's test02.c and test03.c

View File

@ -942,9 +942,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
case CURLM_STATE_WAITDO: case CURLM_STATE_WAITDO:
/* Wait for our turn to DO when we're pipelining requests */ /* Wait for our turn to DO when we're pipelining requests */
infof(easy->easy_handle, "Connection #%d: send pipe size = %d\n", #ifdef CURLDEBUG
infof(easy->easy_handle, "Conn %d send pipe %d inuse %d athead %d\n",
easy->easy_conn->connectindex, easy->easy_conn->connectindex,
easy->easy_conn->send_pipe->size); easy->easy_conn->send_pipe->size,
easy->easy_conn->writechannel_inuse,
Curl_isHandleAtHead(easy->easy_handle,
easy->easy_conn->send_pipe));
#endif
if (!easy->easy_conn->writechannel_inuse && if (!easy->easy_conn->writechannel_inuse &&
Curl_isHandleAtHead(easy->easy_handle, Curl_isHandleAtHead(easy->easy_handle,
easy->easy_conn->send_pipe)) { easy->easy_conn->send_pipe)) {
@ -1232,6 +1237,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
* If an error was returned, and we aren't in completed state now, * If an error was returned, and we aren't in completed state now,
* then we go to completed and consider this transfer aborted. * then we go to completed and consider this transfer aborted.
*/ */
if(easy->easy_conn) {
/* if this has a connection, unsubscribe from the pipelines */
easy->easy_conn->writechannel_inuse = FALSE;
easy->easy_conn->readchannel_inuse = FALSE;
}
multistate(easy, CURLM_STATE_COMPLETED); multistate(easy, CURLM_STATE_COMPLETED);
} }
} }
@ -1345,7 +1355,6 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)
Curl_hash_destroy(multi->hostcache); Curl_hash_destroy(multi->hostcache);
Curl_hash_destroy(multi->sockhash); Curl_hash_destroy(multi->sockhash);
#if 1
/* go over all connections that have close actions */ /* go over all connections that have close actions */
for(i=0; i< multi->connc->num; i++) { for(i=0; i< multi->connc->num; i++) {
if(multi->connc->connects[i] && if(multi->connc->connects[i] &&
@ -1367,7 +1376,6 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)
free(cl); free(cl);
cl= n; cl= n;
} }
#endif
Curl_rm_connc(multi->connc); Curl_rm_connc(multi->connc);

53
tests/data/test533 Normal file
View File

@ -0,0 +1,53 @@
<info>
<keywords>
FTP
PASV
RETR
</keywords>
</info>
# Server-side
<reply>
<data>
</data>
<servercmd>
REPLY RETR 550 the file doesn't exist
REPLY SIZE 550 Can't check for file existence
</servercmd>
</reply>
# Client-side
<client>
<server>
ftp
</server>
<tool>
lib533
</tool>
<name>
FTP RETR a non-existing file twice using the multi interface
</name>
<command>
ftp://%HOSTIP:%FTPPORT/path/533
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<strip>
</strip>
<protocol>
USER anonymous
PASS curl_by_daniel@haxx.se
PWD
CWD path
EPSV
TYPE I
SIZE 533
RETR 533
EPSV
SIZE 533
RETR 533
QUIT
</protocol>
</verify>

View File

@ -42,7 +42,7 @@ SUPPORTFILES = first.c test.h
noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \ noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \
lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \ lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \
lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \ lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \
lib529 lib530 lib532 lib529 lib530 lib532 lib533
lib500_SOURCES = lib500.c $(SUPPORTFILES) lib500_SOURCES = lib500.c $(SUPPORTFILES)
lib500_LDADD = $(LIBDIR)/libcurl.la lib500_LDADD = $(LIBDIR)/libcurl.la
@ -168,3 +168,8 @@ lib532_SOURCES = lib526.c $(SUPPORTFILES)
lib532_CFLAGS = -DLIB532 lib532_CFLAGS = -DLIB532
lib532_LDADD = $(LIBDIR)/libcurl.la lib532_LDADD = $(LIBDIR)/libcurl.la
lib532_DEPENDENCIES = $(LIBDIR)/libcurl.la lib532_DEPENDENCIES = $(LIBDIR)/libcurl.la
lib533_SOURCES = lib533.c $(SUPPORTFILES)
lib533_LDADD = $(LIBDIR)/libcurl.la
lib533_DEPENDENCIES = $(LIBDIR)/libcurl.la

113
tests/libtest/lib533.c Normal file
View File

@ -0,0 +1,113 @@
/*****************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* $Id$
*/
#include "test.h"
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int test(char *URL)
{
int res = 0;
CURL *curl;
int running;
char done=FALSE;
CURLM *m;
int current=0;
int i;
/* In windows, this will init the winsock stuff */
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(!curl)
return 100 + i; /* major bad */
curl_easy_setopt(curl, CURLOPT_URL, URL);
/* go verbose */
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
m = curl_multi_init();
res = (int)curl_multi_add_handle(m, curl);
fprintf(stderr, "Start at URL 0\n");
while(!done) {
fd_set rd, wr, exc;
int max_fd;
struct timeval interval;
interval.tv_sec = 1;
interval.tv_usec = 0;
while (res == CURLM_CALL_MULTI_PERFORM) {
res = (int)curl_multi_perform(m, &running);
if (running <= 0) {
if(!current++) {
fprintf(stderr, "Advancing to URL 1\n");
/* remove the handle we use */
curl_multi_remove_handle(m, curl);
/* make us re-use the same handle all the time, and try resetting
the handle first too */
curl_easy_reset(curl);
curl_easy_setopt(curl, CURLOPT_URL, URL);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
/* re-add it */
res = (int)curl_multi_add_handle(m, curl);
if(res) {
fprintf(stderr, "add handle failed: %d.\n", res);
res = 243;
break;
}
}
else
done = TRUE; /* bail out */
break;
}
}
if(done)
break;
if (res != CURLM_OK) {
fprintf(stderr, "not okay???\n");
break;
}
FD_ZERO(&rd);
FD_ZERO(&wr);
FD_ZERO(&exc);
max_fd = 0;
if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
fprintf(stderr, "unexpected failured of fdset.\n");
res = 189;
break;
}
if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
fprintf(stderr, "bad select??\n");
res = 195;
break;
}
res = CURLM_CALL_MULTI_PERFORM;
}
curl_easy_cleanup(curl);
curl_multi_cleanup(m);
curl_global_cleanup();
return res;
}