mirror of
https://github.com/curl/curl.git
synced 2026-08-25 18:33:42 +03:00
Major overhaul introducing http pipelining support and shared connection
cache within the multi handle.
This commit is contained in:
parent
7e4193b538
commit
b7eeb6e67f
35 changed files with 2313 additions and 1066 deletions
|
|
@ -34,5 +34,5 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
|
|||
test250 test251 test252 test253 test254 test255 test521 test522 test523 \
|
||||
test256 test257 test258 test259 test260 test261 test262 test263 test264 \
|
||||
test265 test266 test267 test268 test269 test270 test271 test272 test273 \
|
||||
test274 test275 test524 test525 test276 test277
|
||||
test274 test275 test524 test525 test276 test277 test526 test527 test528
|
||||
|
||||
|
|
|
|||
61
tests/data/test526
Normal file
61
tests/data/test526
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<info>
|
||||
<keywords>
|
||||
FTP
|
||||
PASV
|
||||
RETR
|
||||
</keywords>
|
||||
</info>
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
file contents should appear once for each file
|
||||
</data>
|
||||
<datacheck>
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
</datacheck>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
ftp
|
||||
</server>
|
||||
<tool>
|
||||
lib526
|
||||
</tool>
|
||||
<name>
|
||||
FTP RETR same file using different handles but same connection
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/path/526
|
||||
</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 526
|
||||
RETR 526
|
||||
EPSV
|
||||
SIZE 526
|
||||
RETR 526
|
||||
EPSV
|
||||
SIZE 526
|
||||
RETR 526
|
||||
EPSV
|
||||
SIZE 526
|
||||
RETR 526
|
||||
QUIT
|
||||
</protocol>
|
||||
</verify>
|
||||
61
tests/data/test527
Normal file
61
tests/data/test527
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
<info>
|
||||
<keywords>
|
||||
FTP
|
||||
PASV
|
||||
RETR
|
||||
</keywords>
|
||||
</info>
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
file contents should appear once for each file
|
||||
</data>
|
||||
<datacheck>
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
</datacheck>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
ftp
|
||||
</server>
|
||||
<tool>
|
||||
lib527
|
||||
</tool>
|
||||
<name>
|
||||
FTP RETR same file using different handles but same connection
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/path/527
|
||||
</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 527
|
||||
RETR 527
|
||||
EPSV
|
||||
SIZE 527
|
||||
RETR 527
|
||||
EPSV
|
||||
SIZE 527
|
||||
RETR 527
|
||||
EPSV
|
||||
SIZE 527
|
||||
RETR 527
|
||||
QUIT
|
||||
</protocol>
|
||||
</verify>
|
||||
62
tests/data/test528
Normal file
62
tests/data/test528
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
<info>
|
||||
<keywords>
|
||||
HTTP
|
||||
</keywords>
|
||||
</info>
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
HTTP/1.1 200 OK
|
||||
Date: Thu, 09 Nov 2010 14:49:00 GMT
|
||||
Server: test-server/fake
|
||||
Content-Length: 47
|
||||
|
||||
file contents should appear once for each file
|
||||
</data>
|
||||
<datacheck>
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
file contents should appear once for each file
|
||||
</datacheck>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<server>
|
||||
http
|
||||
</server>
|
||||
<tool>
|
||||
lib526
|
||||
</tool>
|
||||
<name>
|
||||
HTTP GET same file using different handles but same connection
|
||||
</name>
|
||||
<command>
|
||||
http://%HOSTIP:%HTTPPORT/path/528
|
||||
</command>
|
||||
</client>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<strip>
|
||||
</strip>
|
||||
<protocol>
|
||||
GET /path/528 HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
Accept: */*
|
||||
|
||||
GET /path/528 HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
Accept: */*
|
||||
|
||||
GET /path/528 HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
Accept: */*
|
||||
|
||||
GET /path/528 HTTP/1.1
|
||||
Host: %HOSTIP:%HTTPPORT
|
||||
Accept: */*
|
||||
|
||||
</protocol>
|
||||
</verify>
|
||||
|
|
@ -41,7 +41,7 @@ SUPPORTFILES = first.c test.h
|
|||
# These are all libcurl test programs
|
||||
noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 lib507 \
|
||||
lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 lib517 \
|
||||
lib518 lib519 lib520 lib521 lib523 lib524 lib525
|
||||
lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527
|
||||
|
||||
lib500_SOURCES = lib500.c $(SUPPORTFILES)
|
||||
lib500_LDADD = $(LIBDIR)/libcurl.la
|
||||
|
|
@ -142,3 +142,13 @@ lib524_DEPENDENCIES = $(LIBDIR)/libcurl.la
|
|||
lib525_SOURCES = lib525.c $(SUPPORTFILES)
|
||||
lib525_LDADD = $(LIBDIR)/libcurl.la
|
||||
lib525_DEPENDENCIES = $(LIBDIR)/libcurl.la
|
||||
|
||||
lib526_SOURCES = lib526.c $(SUPPORTFILES)
|
||||
lib526_LDADD = $(LIBDIR)/libcurl.la
|
||||
lib526_DEPENDENCIES = $(LIBDIR)/libcurl.la
|
||||
|
||||
lib527_SOURCES = lib526.c $(SUPPORTFILES)
|
||||
lib527_CFLAGS = -DLIB527
|
||||
lib527_LDADD = $(LIBDIR)/libcurl.la
|
||||
lib527_DEPENDENCIES = $(LIBDIR)/libcurl.la
|
||||
|
||||
|
|
|
|||
129
tests/libtest/lib526.c
Normal file
129
tests/libtest/lib526.c
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
/*
|
||||
* This code sets up multiple easy handles that transfer a single file from
|
||||
* the same URL, in a serial manner after each other. Due to the connection
|
||||
* sharing within the multi handle all transfers are performed on the same
|
||||
* persistent connection.
|
||||
*
|
||||
* This source code is used for lib526 _and_ lib527 with only #ifdefs
|
||||
* controlling the small differences. lib526 closes all easy handles after
|
||||
* they all have transfered the file over the single connection, while lib527
|
||||
* closes each easy handle after each single transfer. 526 and 527 use FTP,
|
||||
* while 528 uses the lib526 tool but use HTTP.
|
||||
*/
|
||||
|
||||
#include "test.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#define NUM_HANDLES 4
|
||||
|
||||
int test(char *URL)
|
||||
{
|
||||
int res = 0;
|
||||
CURL *curl[NUM_HANDLES];
|
||||
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);
|
||||
|
||||
/* get NUM_HANDLES easy handles */
|
||||
for(i=0; i < NUM_HANDLES; i++) {
|
||||
curl[i] = curl_easy_init();
|
||||
if(!curl[i])
|
||||
return 100 + i; /* major bad */
|
||||
curl_easy_setopt(curl[i], CURLOPT_URL, URL);
|
||||
|
||||
/* go verbose */
|
||||
curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 1);
|
||||
}
|
||||
|
||||
m = curl_multi_init();
|
||||
|
||||
res = (int)curl_multi_add_handle(m, curl[current]);
|
||||
|
||||
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) {
|
||||
#ifdef LIB527
|
||||
curl_easy_cleanup(curl[current]);
|
||||
#endif
|
||||
if(++current < NUM_HANDLES) {
|
||||
fprintf(stderr, "Advancing to URL %d\n", current);
|
||||
res = (int)curl_multi_add_handle(m, curl[current]);
|
||||
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(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
|
||||
fprintf(stderr, "bad select??\n");
|
||||
res = 195;
|
||||
break;
|
||||
}
|
||||
|
||||
res = CURLM_CALL_MULTI_PERFORM;
|
||||
}
|
||||
|
||||
#ifndef LIB527
|
||||
/* get NUM_HANDLES easy handles */
|
||||
for(i=0; i < NUM_HANDLES; i++) {
|
||||
curl_multi_remove_handle(m, curl[i]);
|
||||
curl_easy_cleanup(curl[i]);
|
||||
}
|
||||
#endif
|
||||
curl_multi_cleanup(m);
|
||||
|
||||
curl_global_cleanup();
|
||||
return res;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue