libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 2055011f0498854c599f822cce063b2864bfdfb6
parent ffcd629d03138365e8c5813731341d1154b07b7f
Author: Christian Grothoff <christian@grothoff.org>
Date:   Sun, 13 Apr 2008 04:32:13 +0000

zzufing all tests

Diffstat:
Msrc/testzzuf/Makefile.am | 14--------------
Msrc/testzzuf/daemontest_get.c | 1-
Msrc/testzzuf/daemontest_get_chunked.c | 1-
Msrc/testzzuf/daemontest_large_put.c | 24++++++++++--------------
Msrc/testzzuf/daemontest_long_header.c | 152++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/testzzuf/daemontest_post.c | 288++++++++++++++++++++++++++++++++++++++++---------------------------------------
Dsrc/testzzuf/daemontest_post_loop.c | 386-------------------------------------------------------------------------------
Msrc/testzzuf/daemontest_postform.c | 292++++++++++++++++++++++++++++++++++++++-----------------------------------------
Msrc/testzzuf/daemontest_put.c | 294+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/testzzuf/daemontest_put_chunked.c | 222+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/testzzuf/socat.c | 3+++
11 files changed, 631 insertions(+), 1046 deletions(-)

diff --git a/src/testzzuf/Makefile.am b/src/testzzuf/Makefile.am @@ -8,13 +8,11 @@ check_PROGRAMS = \ daemontest_get \ daemontest_post \ daemontest_postform \ - daemontest_post_loop \ daemontest_put \ daemontest_large_put \ daemontest_get11 \ daemontest_post11 \ daemontest_postform11 \ - daemontest_post_loop11 \ daemontest_put11 \ daemontest_large_put11 \ daemontest_long_header \ @@ -47,12 +45,6 @@ daemontest_postform_LDADD = \ $(top_builddir)/src/daemon/libmicrohttpd.la \ @LIBCURL@ -daemontest_post_loop_SOURCES = \ - daemontest_post_loop.c -daemontest_post_loop_LDADD = \ - $(top_builddir)/src/daemon/libmicrohttpd.la \ - @LIBCURL@ - daemontest_put_SOURCES = \ daemontest_put.c daemontest_put_LDADD = \ @@ -83,12 +75,6 @@ daemontest_postform11_LDADD = \ $(top_builddir)/src/daemon/libmicrohttpd.la \ @LIBCURL@ -daemontest_post_loop11_SOURCES = \ - daemontest_post_loop.c -daemontest_post_loop11_LDADD = \ - $(top_builddir)/src/daemon/libmicrohttpd.la \ - @LIBCURL@ - daemontest_put11_SOURCES = \ daemontest_put.c daemontest_put11_LDADD = \ diff --git a/src/testzzuf/daemontest_get.c b/src/testzzuf/daemontest_get.c @@ -218,7 +218,6 @@ testExternalGet () multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } diff --git a/src/testzzuf/daemontest_get_chunked.c b/src/testzzuf/daemontest_get_chunked.c @@ -239,7 +239,6 @@ testExternalGet () multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } diff --git a/src/testzzuf/daemontest_large_put.c b/src/testzzuf/daemontest_large_put.c @@ -19,7 +19,7 @@ */ /** - * @file daemontest_put.c + * @file daemontest_large_put.c * @brief Testcase for libmicrohttpd PUT operations * @author Christian Grothoff */ @@ -54,7 +54,7 @@ static int oneone; * MHD default buffer limit and the test code is not * written for incremental upload processing... */ -#define PUT_SIZE (512 * 1024) +#define PUT_SIZE (256 * 1024) static char *put_buffer; @@ -123,7 +123,6 @@ ahc_echo (void *cls, } else { - printf ("Invalid upload data!\n"); return MHD_NO; } *done = 1; @@ -151,8 +150,8 @@ testInternalPut () cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG, - 1080, + d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 1; @@ -162,7 +161,7 @@ testInternalPut () fprintf (stderr, "."); c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); @@ -184,6 +183,7 @@ testInternalPut () curl_easy_cleanup (c); } fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); return 0; } @@ -202,14 +202,11 @@ testMultithreadedPut () cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, + d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION /* | MHD_USE_DEBUG */ , 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) - { - free (cbc.buf); - return 16; - } + return 16; zzuf_socat_start (); for (i = 0; i < LOOP_COUNT; i++) { @@ -268,7 +265,7 @@ testExternalPut () cbc.size = 2048; cbc.pos = 0; multi = NULL; - d = MHD_start_daemon (MHD_NO_FLAG | MHD_USE_DEBUG, + d = MHD_start_daemon (MHD_NO_FLAG /* | MHD_USE_DEBUG */ , 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_CONNECTION_MEMORY_LIMIT, @@ -278,7 +275,6 @@ testExternalPut () multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } @@ -319,7 +315,7 @@ testExternalPut () return 1024; } start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) + while ((time (NULL) - start < 5) && (c != NULL)) { max = 0; FD_ZERO (&rs); diff --git a/src/testzzuf/daemontest_long_header.c b/src/testzzuf/daemontest_long_header.c @@ -1,6 +1,6 @@ /* This file is part of libmicrohttpd - (C) 2007 Christian Grothoff + (C) 2007, 2008 Christian Grothoff libmicrohttpd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -35,6 +35,18 @@ #include <unistd.h> #endif +#include "socat.c" + +/** + * A larger loop count will run more random tests -- + * which would be good, except that it may take too + * long for most user's patience. So this small + * value is the default. + */ +#define LOOP_COUNT 10 + +#define CURL_TIMEOUT 50L + /** * We will set the memory available per connection to * half of this value, so the actual value does not have @@ -94,13 +106,13 @@ testLongUrlGet () char buf[2048]; struct CBC cbc; char *url; - long code; + int i; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY /* | MHD_USE_DEBUG */ , - 1080, + 11080, &apc_all, NULL, &ahc_echo, @@ -109,44 +121,39 @@ testLongUrlGet () VERY_LONG / 2, MHD_OPTION_END); if (d == NULL) return 1; - c = curl_easy_init (); - url = malloc (VERY_LONG); - memset (url, 'a', VERY_LONG); - url[VERY_LONG - 1] = '\0'; - memcpy (url, "http://localhost:1080/", strlen ("http://localhost:1080/")); - curl_easy_setopt (c, CURLOPT_URL, url); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK == curl_easy_perform (c)) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { + fprintf (stderr, "."); + + c = curl_easy_init (); + url = malloc (VERY_LONG); + memset (url, 'a', VERY_LONG); + url[VERY_LONG - 1] = '\0'; + memcpy (url, "http://localhost:11081/", + strlen ("http://localhost:11081/")); + curl_easy_setopt (c, CURLOPT_URL, url); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - free (url); - return 2; } - if (CURLE_OK != curl_easy_getinfo (c, CURLINFO_RESPONSE_CODE, &code)) - { - curl_easy_cleanup (c); - MHD_stop_daemon (d); - free (url); - return 4; - } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); + MHD_stop_daemon (d); free (url); - if (code != MHD_HTTP_REQUEST_URI_TOO_LONG) - return 8; return 0; } @@ -159,8 +166,8 @@ testLongHeaderGet () char buf[2048]; struct CBC cbc; char *url; - long code; struct curl_slist *header = NULL; + int i; cbc.buf = buf; cbc.size = 2048; @@ -175,51 +182,44 @@ testLongHeaderGet () VERY_LONG / 2, MHD_OPTION_END); if (d == NULL) return 16; - c = curl_easy_init (); - url = malloc (VERY_LONG); - memset (url, 'a', VERY_LONG); - url[VERY_LONG - 1] = '\0'; - url[VERY_LONG / 2] = ':'; - url[VERY_LONG / 2 + 1] = ':'; - header = curl_slist_append (header, url); - - curl_easy_setopt (c, CURLOPT_HTTPHEADER, header); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK == curl_easy_perform (c)) - { - curl_easy_cleanup (c); - MHD_stop_daemon (d); - curl_slist_free_all (header); - free (url); - return 32; - } - if (CURLE_OK != curl_easy_getinfo (c, CURLINFO_RESPONSE_CODE, &code)) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { + fprintf (stderr, "."); + + + c = curl_easy_init (); + url = malloc (VERY_LONG); + memset (url, 'a', VERY_LONG); + url[VERY_LONG - 1] = '\0'; + url[VERY_LONG / 2] = ':'; + url[VERY_LONG / 2 + 1] = ':'; + header = curl_slist_append (header, url); + + curl_easy_setopt (c, CURLOPT_HTTPHEADER, header); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_slist_free_all (header); curl_easy_cleanup (c); - MHD_stop_daemon (d); - free (url); - return 64; } - curl_slist_free_all (header); - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); + MHD_stop_daemon (d); free (url); - if (code != MHD_HTTP_REQUEST_ENTITY_TOO_LARGE) - return 128; return 0; } diff --git a/src/testzzuf/daemontest_post.c b/src/testzzuf/daemontest_post.c @@ -1,6 +1,6 @@ /* This file is part of libmicrohttpd - (C) 2007 Christian Grothoff + (C) 2007, 2008 Christian Grothoff libmicrohttpd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -35,6 +35,20 @@ #include <unistd.h> #endif + +#include "socat.c" + +/** + * A larger loop count will run more random tests -- + * which would be good, except that it may take too + * long for most user's patience. So this small + * value is the default. + */ +#define LOOP_COUNT 10 + +#define CURL_TIMEOUT 50L + + #define POST_DATA "name=daniel&project=curl" static int oneone; @@ -99,7 +113,6 @@ ahc_echo (void *cls, if (0 != strcmp ("POST", method)) { - printf ("METHOD: %s\n", method); return MHD_NO; /* unexpected method */ } pp = *unused; @@ -133,48 +146,45 @@ testInternalPost () CURL *c; char buf[2048]; struct CBC cbc; - CURLcode errornum; + int i; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG, - 1080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); + d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 1; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); + curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); + curl_easy_setopt (c, CURLOPT_POST, 1L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2; } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 4; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 8; + return 0; } @@ -185,48 +195,46 @@ testMultithreadedPost () CURL *c; char buf[2048]; struct CBC cbc; - CURLcode errornum; + int i; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, - 1081, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); + d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 16; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1081/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); + curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); + curl_easy_setopt (c, CURLOPT_POST, 1L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 32; } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); + MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 64; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 128; return 0; } @@ -245,114 +253,112 @@ testExternalPost () fd_set es; int max; int running; - struct CURLMsg *msg; time_t start; struct timeval tv; + int i; multi = NULL; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_DEBUG, + d = MHD_start_daemon (MHD_NO_FLAG /* | MHD_USE_DEBUG */ , 1082, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 256; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1082/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - - multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } - mret = curl_multi_add_handle (multi, c); - if (mret != CURLM_OK) - { - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 1024; - } - start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) + + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - max = 0; - FD_ZERO (&rs); - FD_ZERO (&ws); - FD_ZERO (&es); - curl_multi_perform (multi, &running); - mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + fprintf (stderr, "."); + + + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1082/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); + curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); + curl_easy_setopt (c, CURLOPT_POST, 1L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + + + mret = curl_multi_add_handle (multi, c); if (mret != CURLM_OK) { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2048; - } - if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) - { - curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); MHD_stop_daemon (d); - return 4096; + return 1024; } - tv.tv_sec = 0; - tv.tv_usec = 1000; - select (max + 1, &rs, &ws, &es, &tv); - curl_multi_perform (multi, &running); - if (running == 0) + start = time (NULL); + while ((time (NULL) - start < 5) && (c != NULL)) { - msg = curl_multi_info_read (multi, &running); - if (msg == NULL) - break; - if (msg->msg == CURLMSG_DONE) + max = 0; + FD_ZERO (&rs); + FD_ZERO (&ws); + FD_ZERO (&es); + curl_multi_perform (multi, &running); + mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + if (mret != CURLM_OK) { - if (msg->data.result != CURLE_OK) - printf ("%s failed at %s:%d: `%s'\n", - "curl_multi_perform", - __FILE__, - __LINE__, curl_easy_strerror (msg->data.result)); curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 2048; + } + if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) + { + curl_multi_remove_handle (multi, c); + curl_multi_cleanup (multi); + curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 4096; + } + tv.tv_sec = 0; + tv.tv_usec = 1000; + select (max + 1, &rs, &ws, &es, &tv); + curl_multi_perform (multi, &running); + if (running == 0) + { + curl_multi_info_read (multi, &running); + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); c = NULL; - multi = NULL; } + MHD_run (d); } - MHD_run (d); - } - if (multi != NULL) - { - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - curl_multi_cleanup (multi); + if (c != NULL) + { + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); + } + } + fprintf (stderr, "\n"); + curl_multi_cleanup (multi); + zzuf_socat_stop (); + MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 8192; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 16384; return 0; } diff --git a/src/testzzuf/daemontest_post_loop.c b/src/testzzuf/daemontest_post_loop.c @@ -1,386 +0,0 @@ -/* - This file is part of libmicrohttpd - (C) 2007 Christian Grothoff - - libmicrohttpd is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published - by the Free Software Foundation; either version 2, or (at your - option) any later version. - - libmicrohttpd is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU General Public License - along with libmicrohttpd; see the file COPYING. If not, write to the - Free Software Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. -*/ - -/** - * @file daemontest_post_loop.c - * @brief Testcase for libmicrohttpd POST operations using URL-encoding - * @author Christian Grothoff (inspired by bug report #1296) - */ - -#include "config.h" -#include <curl/curl.h> -#include <microhttpd.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> - -#ifndef WINDOWS -#include <unistd.h> -#endif - -#define POST_DATA "<?xml version='1.0' ?>\n<xml>\n<data-id>1</data-id>\n</xml>\n" - -#define LOOPCOUNT 10 - -static int oneone; - -struct CBC -{ - char *buf; - size_t pos; - size_t size; -}; - -static size_t -copyBuffer (void *ptr, size_t size, size_t nmemb, void *ctx) -{ - struct CBC *cbc = ctx; - - if (cbc->pos + size * nmemb > cbc->size) - return 0; /* overflow */ - memcpy (&cbc->buf[cbc->pos], ptr, size * nmemb); - cbc->pos += size * nmemb; - return size * nmemb; -} - -static int -ahc_echo (void *cls, - struct MHD_Connection *connection, - const char *url, - const char *method, - const char *version, - const char *upload_data, unsigned int *upload_data_size, - void **mptr) -{ - static int marker; - struct MHD_Response *response; - int ret; - - if (0 != strcmp ("POST", method)) - { - printf ("METHOD: %s\n", method); - return MHD_NO; /* unexpected method */ - } - if ((*mptr != NULL) && (0 == *upload_data_size)) - { - if (*mptr != &marker) - abort (); - response = MHD_create_response_from_data (2, "OK", MHD_NO, MHD_NO); - ret = MHD_queue_response (connection, MHD_HTTP_OK, response); - MHD_destroy_response (response); - *mptr = NULL; - return ret; - } - if (strlen (POST_DATA) != *upload_data_size) - return MHD_YES; - *upload_data_size = 0; - *mptr = &marker; - return MHD_YES; -} - - -static int -testInternalPost () -{ - struct MHD_Daemon *d; - CURL *c; - char buf[2048]; - struct CBC cbc; - CURLcode errornum; - int i; - char url[1024]; - - cbc.buf = buf; - cbc.size = 2048; - d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG, - 1080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); - if (d == NULL) - return 1; - for (i = 0; i < LOOPCOUNT; i++) - { - if (99 == i % 100) - fprintf (stderr, "."); - c = curl_easy_init (); - cbc.pos = 0; - buf[0] = '\0'; - sprintf (url, "http://localhost:1080/hw%d", i); - curl_easy_setopt (c, CURLOPT_URL, url); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) - { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2; - } - curl_easy_cleanup (c); - if ((buf[0] != 'O') || (buf[1] != 'K')) - { - MHD_stop_daemon (d); - return 4; - } - } - MHD_stop_daemon (d); - if (LOOPCOUNT >= 99) - fprintf (stderr, "\n"); - return 0; -} - -static int -testMultithreadedPost () -{ - struct MHD_Daemon *d; - CURL *c; - char buf[2048]; - struct CBC cbc; - CURLcode errornum; - int i; - char url[1024]; - - cbc.buf = buf; - cbc.size = 2048; - d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, - 1081, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); - if (d == NULL) - return 16; - for (i = 0; i < LOOPCOUNT; i++) - { - if (99 == i % 100) - fprintf (stderr, "."); - c = curl_easy_init (); - cbc.pos = 0; - buf[0] = '\0'; - sprintf (url, "http://localhost:1081/hw%d", i); - curl_easy_setopt (c, CURLOPT_URL, url); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) - { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 32; - } - curl_easy_cleanup (c); - if ((buf[0] != 'O') || (buf[1] != 'K')) - { - MHD_stop_daemon (d); - return 64; - } - } - MHD_stop_daemon (d); - if (LOOPCOUNT >= 99) - fprintf (stderr, "\n"); - return 0; -} - - -static int -testExternalPost () -{ - struct MHD_Daemon *d; - CURL *c; - char buf[2048]; - struct CBC cbc; - CURLM *multi; - CURLMcode mret; - fd_set rs; - fd_set ws; - fd_set es; - int max; - int running; - struct CURLMsg *msg; - time_t start; - struct timeval tv; - int i; - unsigned long long timeout; - long ctimeout; - char url[1024]; - - multi = NULL; - cbc.buf = buf; - cbc.size = 2048; - cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_DEBUG, - 1082, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); - if (d == NULL) - return 256; - multi = curl_multi_init (); - if (multi == NULL) - { - MHD_stop_daemon (d); - return 512; - } - for (i = 0; i < LOOPCOUNT; i++) - { - fprintf (stderr, "."); - c = curl_easy_init (); - cbc.pos = 0; - buf[0] = '\0'; - sprintf (url, "http://localhost:1082/hw%d", i); - curl_easy_setopt (c, CURLOPT_URL, url); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_POSTFIELDS, POST_DATA); - curl_easy_setopt (c, CURLOPT_POSTFIELDSIZE, strlen (POST_DATA)); - curl_easy_setopt (c, CURLOPT_POST, 1L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - mret = curl_multi_add_handle (multi, c); - if (mret != CURLM_OK) - { - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 1024; - } - start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) - { - max = 0; - FD_ZERO (&rs); - FD_ZERO (&ws); - FD_ZERO (&es); - while (CURLM_CALL_MULTI_PERFORM == - curl_multi_perform (multi, &running)); - mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); - if (mret != CURLM_OK) - { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2048; - } - if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) - { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 4096; - } - if (MHD_NO == MHD_get_timeout (d, &timeout)) - timeout = 100; /* 100ms == INFTY -- CURL bug... */ - if ((CURLM_OK == curl_multi_timeout (multi, &ctimeout)) && - (ctimeout < timeout) && (ctimeout >= 0)) - timeout = ctimeout; - tv.tv_sec = timeout / 1000; - tv.tv_usec = (timeout % 1000) * 1000; - select (max + 1, &rs, &ws, &es, &tv); - while (CURLM_CALL_MULTI_PERFORM == - curl_multi_perform (multi, &running)); - if (running == 0) - { - msg = curl_multi_info_read (multi, &running); - if (msg == NULL) - break; - if (msg->msg == CURLMSG_DONE) - { - if (msg->data.result != CURLE_OK) - printf ("%s failed at %s:%d: `%s'\n", - "curl_multi_perform", - __FILE__, - __LINE__, curl_easy_strerror (msg->data.result)); - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - c = NULL; - } - } - MHD_run (d); - } - if (c != NULL) - { - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - } - if ((buf[0] != 'O') || (buf[1] != 'K')) - { - curl_multi_cleanup (multi); - MHD_stop_daemon (d); - return 8192; - } - } - curl_multi_cleanup (multi); - MHD_stop_daemon (d); - fprintf (stderr, "\n"); - return 0; -} - - - -int -main (int argc, char *const *argv) -{ - unsigned int errorCount = 0; - - oneone = NULL != strstr (argv[0], "11"); - if (0 != curl_global_init (CURL_GLOBAL_WIN32)) - return 2; - errorCount += testInternalPost (); - errorCount += testMultithreadedPost (); - errorCount += testExternalPost (); - if (errorCount != 0) - fprintf (stderr, "Error (code: %u)\n", errorCount); - curl_global_cleanup (); - return errorCount != 0; /* 0 == pass */ -} diff --git a/src/testzzuf/daemontest_postform.c b/src/testzzuf/daemontest_postform.c @@ -1,6 +1,6 @@ /* This file is part of libmicrohttpd - (C) 2007 Christian Grothoff + (C) 2007, 2008 Christian Grothoff libmicrohttpd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -35,6 +35,19 @@ #include <unistd.h> #endif + +#include "socat.c" + +/** + * A larger loop count will run more random tests -- + * which would be good, except that it may take too + * long for most user's patience. So this small + * value is the default. + */ +#define LOOP_COUNT 10 + +#define CURL_TIMEOUT 50L + static int oneone; struct CBC @@ -72,6 +85,8 @@ post_iterator (void *cls, { int *eok = cls; + if (key == NULL) + return MHD_YES; #if 0 fprintf (stderr, "PI sees %s-%.*s\n", key, size, value); #endif @@ -100,7 +115,6 @@ ahc_echo (void *cls, if (0 != strcmp ("POST", method)) { - printf ("METHOD: %s\n", method); return MHD_NO; /* unexpected method */ } pp = *unused; @@ -109,7 +123,7 @@ ahc_echo (void *cls, eok = 0; pp = MHD_create_post_processor (connection, 1024, &post_iterator, &eok); if (pp == NULL) - abort (); + return MHD_NO; *unused = pp; } MHD_post_process (pp, upload_data, *upload_data_size); @@ -149,50 +163,44 @@ testInternalPost () CURL *c; char buf[2048]; struct CBC cbc; - CURLcode errornum; + int i; struct curl_httppost *pd; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG, - 1080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); + d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 1; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - pd = make_form (); - curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + pd = make_form (); + curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); curl_formfree (pd); - MHD_stop_daemon (d); - return 2; } - curl_easy_cleanup (c); - curl_formfree (pd); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 4; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 8; return 0; } @@ -203,50 +211,44 @@ testMultithreadedPost () CURL *c; char buf[2048]; struct CBC cbc; - CURLcode errornum; + int i; struct curl_httppost *pd; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, - 1081, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); + d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 16; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1081/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - pd = make_form (); - curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 5L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + pd = make_form (); + curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); curl_formfree (pd); - MHD_stop_daemon (d); - return 32; } - curl_easy_cleanup (c); - curl_formfree (pd); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 64; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 128; return 0; } @@ -265,119 +267,112 @@ testExternalPost () fd_set es; int max; int running; - struct CURLMsg *msg; time_t start; struct timeval tv; struct curl_httppost *pd; + int i; multi = NULL; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_DEBUG, + d = MHD_start_daemon (MHD_NO_FLAG /* | MHD_USE_DEBUG */ , 1082, NULL, NULL, &ahc_echo, NULL, MHD_OPTION_END); if (d == NULL) return 256; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1082/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - pd = make_form (); - curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - - multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); - curl_formfree (pd); MHD_stop_daemon (d); return 512; } - mret = curl_multi_add_handle (multi, c); - if (mret != CURLM_OK) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - curl_multi_cleanup (multi); - curl_formfree (pd); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 1024; - } - start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) - { - max = 0; - FD_ZERO (&rs); - FD_ZERO (&ws); - FD_ZERO (&es); - curl_multi_perform (multi, &running); - mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + fprintf (stderr, "."); + + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1082/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + pd = make_form (); + curl_easy_setopt (c, CURLOPT_HTTPPOST, pd); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + + + mret = curl_multi_add_handle (multi, c); if (mret != CURLM_OK) { - curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); curl_formfree (pd); - return 2048; - } - if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) - { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); curl_easy_cleanup (c); - curl_formfree (pd); + zzuf_socat_stop (); MHD_stop_daemon (d); - return 4096; + return 1024; } - tv.tv_sec = 0; - tv.tv_usec = 1000; - select (max + 1, &rs, &ws, &es, &tv); - curl_multi_perform (multi, &running); - if (running == 0) + start = time (NULL); + while ((time (NULL) - start < 5) && (c != NULL)) { - msg = curl_multi_info_read (multi, &running); - if (msg == NULL) - break; - if (msg->msg == CURLMSG_DONE) + max = 0; + FD_ZERO (&rs); + FD_ZERO (&ws); + FD_ZERO (&es); + curl_multi_perform (multi, &running); + mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + if (mret != CURLM_OK) + { + curl_multi_remove_handle (multi, c); + curl_multi_cleanup (multi); + curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + curl_formfree (pd); + return 2048; + } + if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) { - if (msg->data.result != CURLE_OK) - printf ("%s failed at %s:%d: `%s'\n", - "curl_multi_perform", - __FILE__, - __LINE__, curl_easy_strerror (msg->data.result)); curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + curl_formfree (pd); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 4096; + } + tv.tv_sec = 0; + tv.tv_usec = 1000; + select (max + 1, &rs, &ws, &es, &tv); + curl_multi_perform (multi, &running); + if (running == 0) + { + curl_multi_info_read (multi, &running); + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); c = NULL; - multi = NULL; } + MHD_run (d); } - MHD_run (d); - } - if (multi != NULL) - { - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - curl_multi_cleanup (multi); + if (c != NULL) + { + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); + } + curl_formfree (pd); } - curl_formfree (pd); + fprintf (stderr, "\n"); + zzuf_socat_stop (); + MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 8192; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 16384; return 0; } @@ -392,11 +387,8 @@ main (int argc, char *const *argv) if (0 != curl_global_init (CURL_GLOBAL_WIN32)) return 2; errorCount += testInternalPost (); - if (0) - { - errorCount += testMultithreadedPost (); - errorCount += testExternalPost (); - } + errorCount += testMultithreadedPost (); + errorCount += testExternalPost (); if (errorCount != 0) fprintf (stderr, "Error (code: %u)\n", errorCount); curl_global_cleanup (); diff --git a/src/testzzuf/daemontest_put.c b/src/testzzuf/daemontest_put.c @@ -1,6 +1,6 @@ /* This file is part of libmicrohttpd - (C) 2007 Christian Grothoff + (C) 2007, 2008 Christian Grothoff libmicrohttpd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -35,6 +35,19 @@ #include <unistd.h> #endif + +#include "socat.c" + +/** + * A larger loop count will run more random tests -- + * which would be good, except that it may take too + * long for most user's patience. So this small + * value is the default. + */ +#define LOOP_COUNT 10 + +#define CURL_TIMEOUT 50L + static int oneone; struct CBC @@ -118,50 +131,45 @@ testInternalPut () struct CBC cbc; unsigned int pos = 0; int done_flag = 0; - CURLcode errornum; + int i; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY | MHD_USE_DEBUG, - 1080, + d = MHD_start_daemon (MHD_USE_SELECT_INTERNALLY /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 1; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1080/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); - curl_easy_setopt (c, CURLOPT_READDATA, &pos); - curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); - curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); + curl_easy_setopt (c, CURLOPT_READDATA, &pos); + curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); + curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2; } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 4; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 8; return 0; } @@ -174,51 +182,45 @@ testMultithreadedPut () struct CBC cbc; unsigned int pos = 0; int done_flag = 0; - CURLcode errornum; + int i; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_DEBUG, - 1081, + d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 16; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1081/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); - curl_easy_setopt (c, CURLOPT_READDATA, &pos); - curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); - curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); + curl_easy_setopt (c, CURLOPT_READDATA, &pos); + curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); + curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 32; } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 64; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 128; - return 0; } @@ -237,118 +239,113 @@ testExternalPut () fd_set es; int max; int running; - struct CURLMsg *msg; time_t start; struct timeval tv; unsigned int pos = 0; int done_flag = 0; + int i; multi = NULL; cbc.buf = buf; cbc.size = 2048; cbc.pos = 0; - d = MHD_start_daemon (MHD_USE_DEBUG, - 1082, + d = MHD_start_daemon (MHD_NO_FLAG /* | MHD_USE_DEBUG */ , + 11080, NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 256; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:1082/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); - curl_easy_setopt (c, CURLOPT_READDATA, &pos); - curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); - curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - if (oneone) - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - else - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - - multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } - mret = curl_multi_add_handle (multi, c); - if (mret != CURLM_OK) - { - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 1024; - } - start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - max = 0; - FD_ZERO (&rs); - FD_ZERO (&ws); - FD_ZERO (&es); - curl_multi_perform (multi, &running); - mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + fprintf (stderr, "."); + + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11081/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); + curl_easy_setopt (c, CURLOPT_READDATA, &pos); + curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); + curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + if (oneone) + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + else + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + + + + mret = curl_multi_add_handle (multi, c); if (mret != CURLM_OK) { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2048; - } - if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) - { - curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); MHD_stop_daemon (d); - return 4096; + return 1024; } - tv.tv_sec = 0; - tv.tv_usec = 1000; - select (max + 1, &rs, &ws, &es, &tv); - curl_multi_perform (multi, &running); - if (running == 0) + start = time (NULL); + while ((time (NULL) - start < 5) && (c != NULL)) { - msg = curl_multi_info_read (multi, &running); - if (msg == NULL) - break; - if (msg->msg == CURLMSG_DONE) + max = 0; + FD_ZERO (&rs); + FD_ZERO (&ws); + FD_ZERO (&es); + curl_multi_perform (multi, &running); + mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + if (mret != CURLM_OK) { - if (msg->data.result != CURLE_OK) - printf ("%s failed at %s:%d: `%s'\n", - "curl_multi_perform", - __FILE__, - __LINE__, curl_easy_strerror (msg->data.result)); curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 2048; + } + if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) + { + curl_multi_remove_handle (multi, c); + curl_multi_cleanup (multi); + curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 4096; + } + tv.tv_sec = 0; + tv.tv_usec = 1000; + select (max + 1, &rs, &ws, &es, &tv); + curl_multi_perform (multi, &running); + if (running == 0) + { + curl_multi_info_read (multi, &running); + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); c = NULL; - multi = NULL; } + MHD_run (d); + } + if (c != NULL) + { + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); } - MHD_run (d); - } - if (multi != NULL) - { - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - curl_multi_cleanup (multi); } + fprintf (stderr, "\n"); + curl_multi_cleanup (multi); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 8192; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 16384; return 0; } @@ -363,11 +360,8 @@ main (int argc, char *const *argv) if (0 != curl_global_init (CURL_GLOBAL_WIN32)) return 2; errorCount += testInternalPut (); - if (0) - { - errorCount += testMultithreadedPut (); - errorCount += testExternalPut (); - } + errorCount += testMultithreadedPut (); + errorCount += testExternalPut (); if (errorCount != 0) fprintf (stderr, "Error (code: %u)\n", errorCount); curl_global_cleanup (); diff --git a/src/testzzuf/daemontest_put_chunked.c b/src/testzzuf/daemontest_put_chunked.c @@ -1,6 +1,6 @@ /* This file is part of libmicrohttpd - (C) 2007 Christian Grothoff + (C) 2007, 2008 Christian Grothoff libmicrohttpd is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -36,6 +36,18 @@ #include <unistd.h> #endif +#include "socat.c" + +/** + * A larger loop count will run more random tests -- + * which would be good, except that it may take too + * long for most user's patience. So this small + * value is the default. + */ +#define LOOP_COUNT 10 + +#define CURL_TIMEOUT 50L + struct CBC { char *buf; @@ -92,7 +104,6 @@ ahc_echo (void *cls, have = *upload_data_size; if (have + *done > 8) { - printf ("Invalid upload data `%8s'!\n", upload_data); return MHD_NO; } if (0 == memcmp (upload_data, &"Hello123"[*done], have)) @@ -102,7 +113,6 @@ ahc_echo (void *cls, } else { - printf ("Invalid upload data `%8s'!\n", upload_data); return MHD_NO; } #if 0 @@ -127,7 +137,7 @@ testInternalPut () struct CBC cbc; unsigned int pos = 0; int done_flag = 0; - CURLcode errornum; + int i; cbc.buf = buf; cbc.size = 2048; @@ -137,40 +147,35 @@ testInternalPut () NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 1; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11080/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); - curl_easy_setopt (c, CURLOPT_READDATA, &pos); - curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); - /* - // by not giving the file size, we force chunking! - curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); - */ - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - if (CURLE_OK != (errornum = curl_easy_perform (c))) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - fprintf (stderr, - "curl_easy_perform failed: `%s'\n", - curl_easy_strerror (errornum)); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11080/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); + curl_easy_setopt (c, CURLOPT_READDATA, &pos); + curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); + /* + // by not giving the file size, we force chunking! + curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); + */ + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + curl_easy_perform (c); curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2; } - curl_easy_cleanup (c); + fprintf (stderr, "\n"); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 4; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 8; return 0; } @@ -246,11 +251,11 @@ testExternalPut () fd_set es; int max; int running; - struct CURLMsg *msg; time_t start; struct timeval tv; unsigned int pos = 0; int done_flag = 0; + int i; multi = NULL; cbc.buf = buf; @@ -261,103 +266,97 @@ testExternalPut () NULL, NULL, &ahc_echo, &done_flag, MHD_OPTION_END); if (d == NULL) return 256; - c = curl_easy_init (); - curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11082/hello_world"); - curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); - curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); - curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); - curl_easy_setopt (c, CURLOPT_READDATA, &pos); - curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); - /* - // by not giving the file size, we force chunking! - curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); - */ - curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); - curl_easy_setopt (c, CURLOPT_TIMEOUT, 150L); - curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); - curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 15L); - // NOTE: use of CONNECTTIMEOUT without also - // setting NOSIGNAL results in really weird - // crashes on my system! - curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); - multi = curl_multi_init (); if (multi == NULL) { - curl_easy_cleanup (c); MHD_stop_daemon (d); return 512; } - mret = curl_multi_add_handle (multi, c); - if (mret != CURLM_OK) + zzuf_socat_start (); + for (i = 0; i < LOOP_COUNT; i++) { - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 1024; - } - start = time (NULL); - while ((time (NULL) - start < 5) && (multi != NULL)) - { - max = 0; - FD_ZERO (&rs); - FD_ZERO (&ws); - FD_ZERO (&es); - curl_multi_perform (multi, &running); - mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + fprintf (stderr, "."); + c = curl_easy_init (); + curl_easy_setopt (c, CURLOPT_URL, "http://localhost:11082/hello_world"); + curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, &copyBuffer); + curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc); + curl_easy_setopt (c, CURLOPT_READFUNCTION, &putBuffer); + curl_easy_setopt (c, CURLOPT_READDATA, &pos); + curl_easy_setopt (c, CURLOPT_UPLOAD, 1L); + /* + // by not giving the file size, we force chunking! + curl_easy_setopt (c, CURLOPT_INFILESIZE_LARGE, (curl_off_t) 8L); + */ + curl_easy_setopt (c, CURLOPT_FAILONERROR, 1); + curl_easy_setopt (c, CURLOPT_TIMEOUT_MS, CURL_TIMEOUT); + curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); + curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT_MS, CURL_TIMEOUT); + // NOTE: use of CONNECTTIMEOUT without also + // setting NOSIGNAL results in really weird + // crashes on my system! + curl_easy_setopt (c, CURLOPT_NOSIGNAL, 1); + + + mret = curl_multi_add_handle (multi, c); if (mret != CURLM_OK) { - curl_multi_remove_handle (multi, c); - curl_multi_cleanup (multi); - curl_easy_cleanup (c); - MHD_stop_daemon (d); - return 2048; - } - if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) - { - curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); MHD_stop_daemon (d); - return 4096; + return 1024; } - tv.tv_sec = 0; - tv.tv_usec = 1000; - select (max + 1, &rs, &ws, &es, &tv); - curl_multi_perform (multi, &running); - if (running == 0) + start = time (NULL); + while ((time (NULL) - start < 5) && (c != NULL)) { - msg = curl_multi_info_read (multi, &running); - if (msg == NULL) - break; - if (msg->msg == CURLMSG_DONE) + max = 0; + FD_ZERO (&rs); + FD_ZERO (&ws); + FD_ZERO (&es); + curl_multi_perform (multi, &running); + mret = curl_multi_fdset (multi, &rs, &ws, &es, &max); + if (mret != CURLM_OK) + { + curl_multi_remove_handle (multi, c); + curl_multi_cleanup (multi); + curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 2048; + } + if (MHD_YES != MHD_get_fdset (d, &rs, &ws, &es, &max)) { - if (msg->data.result != CURLE_OK) - printf ("%s failed at %s:%d: `%s'\n", - "curl_multi_perform", - __FILE__, - __LINE__, curl_easy_strerror (msg->data.result)); curl_multi_remove_handle (multi, c); curl_multi_cleanup (multi); curl_easy_cleanup (c); + zzuf_socat_stop (); + MHD_stop_daemon (d); + return 4096; + } + tv.tv_sec = 0; + tv.tv_usec = 1000; + select (max + 1, &rs, &ws, &es, &tv); + curl_multi_perform (multi, &running); + if (running == 0) + { + curl_multi_info_read (multi, &running); + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); c = NULL; - multi = NULL; } + MHD_run (d); + } + if (c != NULL) + { + curl_multi_remove_handle (multi, c); + curl_easy_cleanup (c); } - MHD_run (d); - } - if (multi != NULL) - { - curl_multi_remove_handle (multi, c); - curl_easy_cleanup (c); - curl_multi_cleanup (multi); } + fprintf (stderr, "\n"); + curl_multi_cleanup (multi); + zzuf_socat_stop (); MHD_stop_daemon (d); - if (cbc.pos != strlen ("/hello_world")) - return 8192; - if (0 != strncmp ("/hello_world", cbc.buf, strlen ("/hello_world"))) - return 16384; return 0; } @@ -371,11 +370,8 @@ main (int argc, char *const *argv) if (0 != curl_global_init (CURL_GLOBAL_WIN32)) return 2; errorCount += testInternalPut (); - if (0) - { - errorCount += testMultithreadedPut (); - errorCount += testExternalPut (); - } + errorCount += testMultithreadedPut (); + errorCount += testExternalPut (); if (errorCount != 0) fprintf (stderr, "Error (code: %u)\n", errorCount); curl_global_cleanup (); diff --git a/src/testzzuf/socat.c b/src/testzzuf/socat.c @@ -42,6 +42,9 @@ zzuf_socat_start () "-n", "-A", "socat", + "--", + "-lf", + "/dev/null", "TCP4-LISTEN:11081,reuseaddr,fork", "TCP4:127.0.0.1:11080", NULL,