Commit e3c15fc4 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

test 530 is the first ever HTTP pipelining test for libcurl

parent dc7c9155
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -88,6 +88,8 @@ auth_required - if this is set and a POST/PUT is made without auth, the
                server will NOT wait for the full request body to get sent
idle -          do nothing after receiving the request, just "sit idle"
stream -        continuously send data to the client, never-ending
pipe: [num] -   tell the server to expect this many HTTP requests before
                sending back anything, to allow pipelining tests
</servercmd>
</reply>

+2 −1
Original line number Diff line number Diff line
@@ -34,5 +34,6 @@ 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 test526 test527 test528
 test274 test275 test524 test525 test276 test277 test526 test527 test528   \
 test530

tests/data/test530

0 → 100644
+78 −0
Original line number Diff line number Diff line
<info>
<keywords>
HTTP
Pipelining
</keywords>
</info>
# Server-side
<reply>
<servercmd>
pipe: 4
</servercmd>
<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
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
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
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>
</reply>

# Client-side
<client>
<server>
http
</server>
<tool>
lib530
</tool>
 <name>
HTTP GET using pipelining
 </name>
 <command>
http://%HOSTIP:%HTTPPORT/path/530
</command>
</client>

# Verify data after the test has been "shot"
<verify>
<strip>
</strip>
<protocol>
GET /path/530 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /path/530 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /path/530 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

GET /path/530 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*

</protocol>
</verify>
+5 −1
Original line number Diff line number Diff line
@@ -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 lib526 lib527
  lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 lib530

lib500_SOURCES = lib500.c $(SUPPORTFILES)
lib500_LDADD = $(LIBDIR)/libcurl.la
@@ -152,3 +152,7 @@ lib527_CFLAGS = -DLIB527
lib527_LDADD = $(LIBDIR)/libcurl.la
lib527_DEPENDENCIES = $(LIBDIR)/libcurl.la

lib530_SOURCES = lib530.c $(SUPPORTFILES)
lib530_CFLAGS = -DLIB530
lib530_LDADD = $(LIBDIR)/libcurl.la
lib530_DEPENDENCIES = $(LIBDIR)/libcurl.la

tests/libtest/lib530.c

0 → 100644
+120 −0
Original line number Diff line number Diff line
/*****************************************************************************
 *                                  _   _ ____  _
 *  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);

  m = curl_multi_init();

  /* 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);

    /* include headers */
    curl_easy_setopt(curl[i], CURLOPT_HEADER, 1);

    res = (int)curl_multi_add_handle(m, curl[i]);
  }

  curl_multi_setopt(m, CURLMOPT_PIPELINING, 1);

  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) {
        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;
  }

  /* get NUM_HANDLES easy handles */
  for(i=0; i < NUM_HANDLES; i++) {
    curl_multi_remove_handle(m, curl[i]);
    curl_easy_cleanup(curl[i]);
  }

  curl_multi_cleanup(m);

  curl_global_cleanup();
  return res;
}
Loading