aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeny Grin (Karlson2k) <k2k@narod.ru>2024-01-04 16:47:07 +0300
committerEvgeny Grin (Karlson2k) <k2k@narod.ru>2024-01-04 16:47:07 +0300
commit47f5f72591b72a0c1ff8d08ba7b6bb492ccead91 (patch)
tree9c98ebf978c50c91095013e2d576835de06ebaec
parent8bfaec71d55f2e9e3251829c9fd15ae92b1203f8 (diff)
downloadlibmicrohttpd-47f5f72591b72a0c1ff8d08ba7b6bb492ccead91.tar.gz
libmicrohttpd-47f5f72591b72a0c1ff8d08ba7b6bb492ccead91.zip
test_upgrade{,_large}{,_tls}: unified code, removed workarounds, added new test
Added test with buffers larger than maximum TLS packet size and with message larger than buffer. New MHD code does not need any "kicker" workaround anymore (used in old test_upgrade_large.c code).
-rw-r--r--src/microhttpd/Makefile.am71
-rw-r--r--src/microhttpd/test_upgrade.c221
-rw-r--r--src/microhttpd/test_upgrade_large.c1834
3 files changed, 248 insertions, 1878 deletions
diff --git a/src/microhttpd/Makefile.am b/src/microhttpd/Makefile.am
index 043755ce..e178a5e4 100644
--- a/src/microhttpd/Makefile.am
+++ b/src/microhttpd/Makefile.am
@@ -259,16 +259,11 @@ endif
259 259
260if HAVE_POSIX_THREADS 260if HAVE_POSIX_THREADS
261if ENABLE_UPGRADE 261if ENABLE_UPGRADE
262if USE_POSIX_THREADS
263 check_PROGRAMS += test_upgrade test_upgrade_large
264endif
265if USE_W32_THREADS
266 check_PROGRAMS += test_upgrade test_upgrade_large
267endif
268if ENABLE_HTTPS
269if USE_THREADS 262if USE_THREADS
263check_PROGRAMS += test_upgrade test_upgrade_large test_upgrade_vlarge
264if ENABLE_HTTPS
270if USE_UPGRADE_TLS_TESTS 265if USE_UPGRADE_TLS_TESTS
271check_PROGRAMS += test_upgrade_tls test_upgrade_large_tls 266check_PROGRAMS += test_upgrade_tls test_upgrade_large_tls test_upgrade_vlarge_tls
272endif 267endif
273endif 268endif
274endif 269endif
@@ -361,47 +356,63 @@ test_upgrade_LDFLAGS = \
361 $(MHD_TLS_LIB_LDFLAGS) 356 $(MHD_TLS_LIB_LDFLAGS)
362test_upgrade_LDADD = \ 357test_upgrade_LDADD = \
363 $(builddir)/libmicrohttpd.la \ 358 $(builddir)/libmicrohttpd.la \
364 $(MHD_TLS_LIB_LDFLAGS) $(MHD_TLS_LIBDEPS) \ 359 $(MHD_TLS_LIBDEPS) \
365 $(PTHREAD_LIBS) 360 $(PTHREAD_LIBS)
366 361
367test_upgrade_large_SOURCES = \ 362test_upgrade_large_SOURCES = \
368 test_upgrade_large.c test_helpers.h mhd_sockets.h mhd_sockets.c mhd_itc.h mhd_itc_types.h mhd_itc.c 363 $(test_upgrade_SOURCES)
369test_upgrade_large_CPPFLAGS = \ 364test_upgrade_large_CPPFLAGS = \
370 $(AM_CPPFLAGS) $(MHD_TLS_LIB_CPPFLAGS) 365 $(test_upgrade_CPPFLAGS)
371test_upgrade_large_CFLAGS = \ 366test_upgrade_large_CFLAGS = \
372 $(AM_CFLAGS) $(PTHREAD_CFLAGS) $(MHD_TLS_LIB_CFLAGS) 367 $(test_upgrade_CFLAGS)
373test_upgrade_large_LDFLAGS = \ 368test_upgrade_large_LDFLAGS = \
374 $(MHD_TLS_LIB_LDFLAGS) 369 $(test_upgrade_LDFLAGS)
375test_upgrade_large_LDADD = \ 370test_upgrade_large_LDADD = \
376 $(builddir)/libmicrohttpd.la \ 371 $(test_upgrade_LDADD)
377 $(MHD_TLS_LIB_LDFLAGS) $(MHD_TLS_LIBDEPS) \ 372
378 $(PTHREAD_LIBS) 373test_upgrade_vlarge_SOURCES = \
374 $(test_upgrade_SOURCES)
375test_upgrade_vlarge_CPPFLAGS = \
376 $(test_upgrade_CPPFLAGS)
377test_upgrade_vlarge_CFLAGS = \
378 $(test_upgrade_CFLAGS)
379test_upgrade_vlarge_LDFLAGS = \
380 $(test_upgrade_LDFLAGS)
381test_upgrade_vlarge_LDADD = \
382 $(test_upgrade_LDADD)
379 383
380test_upgrade_tls_SOURCES = \ 384test_upgrade_tls_SOURCES = \
381 test_upgrade.c test_helpers.h mhd_sockets.h 385 $(test_upgrade_SOURCES)
382test_upgrade_tls_CPPFLAGS = \ 386test_upgrade_tls_CPPFLAGS = \
383 $(AM_CPPFLAGS) $(MHD_TLS_LIB_CPPFLAGS) 387 $(test_upgrade_CPPFLAGS)
384test_upgrade_tls_CFLAGS = \ 388test_upgrade_tls_CFLAGS = \
385 $(AM_CFLAGS) $(PTHREAD_CFLAGS) $(MHD_TLS_LIB_CFLAGS) 389 $(test_upgrade_CFLAGS)
386test_upgrade_tls_LDFLAGS = \ 390test_upgrade_tls_LDFLAGS = \
387 $(MHD_TLS_LIB_LDFLAGS) 391 $(test_upgrade_LDFLAGS)
388test_upgrade_tls_LDADD = \ 392test_upgrade_tls_LDADD = \
389 $(builddir)/libmicrohttpd.la \ 393 $(test_upgrade_LDADD)
390 $(MHD_TLS_LIB_LDFLAGS) $(MHD_TLS_LIBDEPS) \
391 $(PTHREAD_LIBS)
392 394
393test_upgrade_large_tls_SOURCES = \ 395test_upgrade_large_tls_SOURCES = \
394 test_upgrade_large.c test_helpers.h mhd_sockets.h mhd_sockets.c mhd_itc.h mhd_itc_types.h mhd_itc.c 396 $(test_upgrade_SOURCES)
395test_upgrade_large_tls_CPPFLAGS = \ 397test_upgrade_large_tls_CPPFLAGS = \
396 $(AM_CPPFLAGS) $(MHD_TLS_LIB_CPPFLAGS) 398 $(test_upgrade_CPPFLAGS)
397test_upgrade_large_tls_CFLAGS = \ 399test_upgrade_large_tls_CFLAGS = \
398 $(AM_CFLAGS) $(PTHREAD_CFLAGS) $(MHD_TLS_LIB_CFLAGS) 400 $(test_upgrade_CFLAGS)
399test_upgrade_large_tls_LDFLAGS = \ 401test_upgrade_large_tls_LDFLAGS = \
400 $(MHD_TLS_LIB_LDFLAGS) 402 $(test_upgrade_LDFLAGS)
401test_upgrade_large_tls_LDADD = \ 403test_upgrade_large_tls_LDADD = \
402 $(builddir)/libmicrohttpd.la \ 404 $(test_upgrade_LDADD)
403 $(MHD_TLS_LIB_LDFLAGS) $(MHD_TLS_LIBDEPS) \ 405
404 $(PTHREAD_LIBS) 406test_upgrade_vlarge_tls_SOURCES = \
407 $(test_upgrade_SOURCES)
408test_upgrade_vlarge_tls_CPPFLAGS = \
409 $(test_upgrade_CPPFLAGS)
410test_upgrade_vlarge_tls_CFLAGS = \
411 $(test_upgrade_CFLAGS)
412test_upgrade_vlarge_tls_LDFLAGS = \
413 $(test_upgrade_LDFLAGS)
414test_upgrade_vlarge_tls_LDADD = \
415 $(test_upgrade_LDADD)
405 416
406test_postprocessor_SOURCES = \ 417test_postprocessor_SOURCES = \
407 test_postprocessor.c 418 test_postprocessor.c
diff --git a/src/microhttpd/test_upgrade.c b/src/microhttpd/test_upgrade.c
index b612d169..fe39f5cf 100644
--- a/src/microhttpd/test_upgrade.c
+++ b/src/microhttpd/test_upgrade.c
@@ -168,16 +168,15 @@ _testErrorLog_func (const char *errDesc, const char *funcName, int lineNum)
168#define testErrorLogDesc(errDesc) _testErrorLog_func(errDesc, NULL, __LINE__) 168#define testErrorLogDesc(errDesc) _testErrorLog_func(errDesc, NULL, __LINE__)
169#endif /* ! MHD_HAVE_MHD_FUNC_ */ 169#endif /* ! MHD_HAVE_MHD_FUNC_ */
170 170
171/* ** External parameters ** */
172static bool use_large;
171 173
172/* Could be increased to facilitate debugging */ 174static bool use_vlarge;
173static int test_timeout = 5;
174 175
175static bool test_tls; 176static bool test_tls;
176 177
177static int verbose = 0; 178static int verbose = 0;
178 179
179static uint16_t global_port;
180
181enum tls_tool 180enum tls_tool
182{ 181{
183 TLS_CLI_NO_TOOL = 0, 182 TLS_CLI_NO_TOOL = 0,
@@ -188,6 +187,25 @@ enum tls_tool
188 187
189static enum tls_tool use_tls_tool; 188static enum tls_tool use_tls_tool;
190 189
190
191/* ** Internal values ** */
192
193/* Could be increased to facilitate debugging */
194static int test_timeout = 5;
195
196static uint16_t global_port;
197
198static const void *rclient_msg;
199
200static size_t rclient_msg_size;
201
202static const void *app_msg;
203
204static size_t app_msg_size;
205
206static void *alloc_ptr[2] = {NULL, NULL};
207
208
191static void 209static void
192fflush_allstd (void) 210fflush_allstd (void)
193{ 211{
@@ -1444,10 +1462,8 @@ run_usock (void *cls)
1444{ 1462{
1445 struct MHD_UpgradeResponseHandle *urh = cls; 1463 struct MHD_UpgradeResponseHandle *urh = cls;
1446 1464
1447 recv_all_stext (usock, 1465 recv_all (usock, rclient_msg, rclient_msg_size);
1448 "Hello"); 1466 send_all (usock, app_msg, app_msg_size);
1449 send_all_stext (usock,
1450 "World");
1451 recv_all_stext (usock, 1467 recv_all_stext (usock,
1452 "Finished"); 1468 "Finished");
1453 if (! test_tls) 1469 if (! test_tls)
@@ -1478,10 +1494,8 @@ run_usock_client (void *cls)
1478 send_all_stext (sock, 1494 send_all_stext (sock,
1479 "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: Upgrade\r\n\r\n"); 1495 "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: Upgrade\r\n\r\n");
1480 recv_hdr (sock); 1496 recv_hdr (sock);
1481 send_all_stext (sock, 1497 send_all (sock, rclient_msg, rclient_msg_size);
1482 "Hello"); 1498 recv_all (sock, app_msg, app_msg_size);
1483 recv_all_stext (sock,
1484 "World");
1485 send_all_stext (sock, 1499 send_all_stext (sock,
1486 "Finished"); 1500 "Finished");
1487 if (! test_tls) 1501 if (! test_tls)
@@ -1849,6 +1863,15 @@ test_upgrade (unsigned int flags,
1849#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID) 1863#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID)
1850 pid_t pid = -1; 1864 pid_t pid = -1;
1851#endif /* HTTPS_SUPPORT && HAVE_FORK && HAVE_WAITPID */ 1865#endif /* HTTPS_SUPPORT && HAVE_FORK && HAVE_WAITPID */
1866 size_t mem_limit;
1867
1868 /* Handle memory limits. Actually makes sense only for TLS */
1869 if (use_vlarge)
1870 mem_limit = 64U * 1024U; /* Half of the buffer should be large enough to take more than max TLS packet */
1871 else if (use_large)
1872 mem_limit = 4U * 1024; /* Make sure that several iteration required to deliver a single message */
1873 else
1874 mem_limit = 0; /* Use default value */
1852 1875
1853 client_done = false; 1876 client_done = false;
1854 app_done = false; 1877 app_done = false;
@@ -1866,6 +1889,7 @@ test_upgrade (unsigned int flags,
1866 NULL, 1889 NULL,
1867 MHD_OPTION_THREAD_POOL_SIZE, pool, 1890 MHD_OPTION_THREAD_POOL_SIZE, pool,
1868 MHD_OPTION_CONNECTION_TIMEOUT, test_timeout, 1891 MHD_OPTION_CONNECTION_TIMEOUT, test_timeout,
1892 MHD_OPTION_CONNECTION_MEMORY_LIMIT, mem_limit,
1869 MHD_OPTION_END); 1893 MHD_OPTION_END);
1870#ifdef HTTPS_SUPPORT 1894#ifdef HTTPS_SUPPORT
1871 else 1895 else
@@ -1883,6 +1907,7 @@ test_upgrade (unsigned int flags,
1883 MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem, 1907 MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
1884 MHD_OPTION_THREAD_POOL_SIZE, pool, 1908 MHD_OPTION_THREAD_POOL_SIZE, pool,
1885 MHD_OPTION_CONNECTION_TIMEOUT, test_timeout, 1909 MHD_OPTION_CONNECTION_TIMEOUT, test_timeout,
1910 MHD_OPTION_CONNECTION_MEMORY_LIMIT, mem_limit,
1886 MHD_OPTION_END); 1911 MHD_OPTION_END);
1887#endif /* HTTPS_SUPPORT */ 1912#endif /* HTTPS_SUPPORT */
1888 if (NULL == d) 1913 if (NULL == d)
@@ -1964,6 +1989,161 @@ test_upgrade (unsigned int flags,
1964} 1989}
1965 1990
1966 1991
1992enum test_msg_type
1993{
1994 test_msg_large_app_data,
1995 test_msg_large_rclient_data,
1996 test_msg_vlarge_app_data,
1997 test_msg_vlarge_rclient_data
1998};
1999
2000/**
2001 * Initialise test message data
2002 * @param buf the pointer to the buffer to fill with the test data
2003 * @param buf_size the size of the @a buf
2004 * @param msg_type the type of the data to fill the @a buf
2005 * @return the @a buf pointer
2006 */
2007static void *
2008init_test_msg (void *buf, size_t buf_size, enum test_msg_type msg_type)
2009{
2010 size_t i;
2011 char *const text_buf = (char *) buf;
2012 uint8_t *const bin_buf = (uint8_t *) buf;
2013 if (0 == buf_size)
2014 return buf;
2015 switch (msg_type)
2016 {
2017 case test_msg_large_app_data:
2018 case test_msg_large_rclient_data:
2019 /* Simulate text data */
2020 for (i = 0; i < buf_size; ++i)
2021 {
2022 size_t pos;
2023 if (test_msg_large_app_data == msg_type)
2024 pos = i + 43;
2025 else
2026 pos = i + 26;
2027 if ((0 == i) || (2 == pos % 100) )
2028 text_buf[i] =
2029 (char) (unsigned char) ((test_msg_large_app_data == msg_type) ?
2030 ('Z' - pos % ('Z' - 'A' + 1)) :
2031 ('A' + pos % ('Z' - 'A' + 1)));
2032 else if (0 == pos % 100)
2033 text_buf[i] = '.';
2034 else if (1 == pos % 100)
2035 text_buf[i] = ' ';
2036 else if ((99 != pos % 100) && (2 != pos % 100) && (0 == pos % 5))
2037 text_buf[i] = ' ';
2038 else if (test_msg_large_app_data == msg_type)
2039 text_buf[i] = (char) (unsigned char) ('z' - pos % ('z' - 'a' + 1));
2040 else
2041 text_buf[i] = (char) (unsigned char) ('a' + pos % ('z' - 'a' + 1));
2042 }
2043 break;
2044 case test_msg_vlarge_app_data:
2045 /* Simulate binary data */
2046 for (i = 0; i < buf_size; ++i)
2047 {
2048 bin_buf[i] = (uint8_t) ((i + 182) & 0xFF);
2049 }
2050 break;
2051 case test_msg_vlarge_rclient_data:
2052 /* Simulate binary data */
2053 for (i = 0; i < buf_size; ++i)
2054 {
2055 bin_buf[i] = (uint8_t) ((111 - i) & 0xFF);
2056 }
2057 break;
2058 default:
2059 exit (99);
2060 break;
2061 }
2062 return buf;
2063}
2064
2065
2066/**
2067 * Perform initialisation of variables used in all check in this test
2068 * @return true if succeed,
2069 * false if failed.
2070 */
2071static bool
2072global_test_init (void)
2073{
2074 if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
2075 global_port = 0;
2076 else
2077 {
2078 global_port = 1090;
2079 if (test_tls)
2080 global_port += 1U << 0;
2081 if (use_large)
2082 global_port += 1U << 1;
2083 else if (use_vlarge)
2084 global_port += 1U << 2;
2085 }
2086 if (use_large || use_vlarge)
2087 {
2088 unsigned int i;
2089 size_t alloc_size;
2090 alloc_size = use_vlarge ? (64U * 1024U) : (17U * 1024U);
2091 for (i = 0; i < (sizeof(alloc_ptr) / sizeof(alloc_ptr[0])); ++i)
2092 {
2093 alloc_ptr[i] = malloc (alloc_size);
2094 if (NULL == alloc_ptr[i])
2095 {
2096 for (--i; i < (sizeof(alloc_ptr) / sizeof(alloc_ptr[0])); --i)
2097 {
2098 free (alloc_ptr[i]);
2099 }
2100 return false;
2101 }
2102 }
2103
2104 rclient_msg_size = alloc_size;
2105 rclient_msg = init_test_msg (alloc_ptr[0], rclient_msg_size,
2106 use_vlarge ?
2107 test_msg_vlarge_rclient_data :
2108 test_msg_large_rclient_data);
2109 app_msg_size = alloc_size;
2110 app_msg = init_test_msg (alloc_ptr[1], app_msg_size,
2111 use_vlarge ?
2112 test_msg_vlarge_app_data :
2113 test_msg_large_app_data);
2114 }
2115 else
2116 {
2117 unsigned int i;
2118 for (i = 0; i < (sizeof(alloc_ptr) / sizeof(alloc_ptr[0])); ++i)
2119 alloc_ptr[i] = NULL;
2120
2121 rclient_msg_size = MHD_STATICSTR_LEN_ ("Hello");
2122 rclient_msg = "Hello";
2123 app_msg_size = MHD_STATICSTR_LEN_ ("World");;
2124 app_msg = "World";
2125 }
2126 return true;
2127}
2128
2129
2130/**
2131 * Perform de-initialisation of variables with memory de-allocation if required.
2132 */
2133static void
2134global_test_deinit (void)
2135{
2136 unsigned int i;
2137 for (i = ((sizeof(alloc_ptr) / sizeof(alloc_ptr[0])) - 1);
2138 i < (sizeof(alloc_ptr) / sizeof(alloc_ptr[0]));
2139 --i)
2140 {
2141 if (NULL != alloc_ptr[i])
2142 free (alloc_ptr[i]);
2143 }
2144}
2145
2146
1967int 2147int
1968main (int argc, 2148main (int argc,
1969 char *const *argv) 2149 char *const *argv)
@@ -1971,6 +2151,9 @@ main (int argc,
1971 unsigned int error_count = 0; 2151 unsigned int error_count = 0;
1972 unsigned int res; 2152 unsigned int res;
1973 2153
2154 use_vlarge = (0 != has_in_name (argv[0], "_vlarge"));
2155 use_large = (! use_vlarge) && (0 != has_in_name (argv[0], "_large"));
2156
1974 use_tls_tool = TLS_CLI_NO_TOOL; 2157 use_tls_tool = TLS_CLI_NO_TOOL;
1975 test_tls = has_in_name (argv[0], "_tls"); 2158 test_tls = has_in_name (argv[0], "_tls");
1976 2159
@@ -2032,8 +2215,15 @@ main (int argc,
2032#endif /* ! HTTPS_SUPPORT */ 2215#endif /* ! HTTPS_SUPPORT */
2033 } 2216 }
2034 2217
2035 global_port = MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT) ? 2218 if (! global_test_init ())
2036 0 : (test_tls ? 1091 : 1090); 2219 {
2220#ifdef HTTPS_SUPPORT
2221 if (test_tls && (TLS_LIB_GNUTLS == use_tls_tool))
2222 gnutls_global_deinit ();
2223#endif /* HTTPS_SUPPORT */
2224 fprintf (stderr, "Failed to initialise the test.\n");
2225 return 99;
2226 }
2037 2227
2038 /* run tests */ 2228 /* run tests */
2039 if (verbose) 2229 if (verbose)
@@ -2201,9 +2391,12 @@ main (int argc,
2201 fprintf (stderr, 2391 fprintf (stderr,
2202 "Error (code: %u)\n", 2392 "Error (code: %u)\n",
2203 error_count); 2393 error_count);
2394
2395 global_test_deinit ();
2204#ifdef HTTPS_SUPPORT 2396#ifdef HTTPS_SUPPORT
2205 if (test_tls && (TLS_LIB_GNUTLS == use_tls_tool)) 2397 if (test_tls && (TLS_LIB_GNUTLS == use_tls_tool))
2206 gnutls_global_deinit (); 2398 gnutls_global_deinit ();
2207#endif /* HTTPS_SUPPORT */ 2399#endif /* HTTPS_SUPPORT */
2400
2208 return error_count != 0; /* 0 == pass */ 2401 return error_count != 0; /* 0 == pass */
2209} 2402}
diff --git a/src/microhttpd/test_upgrade_large.c b/src/microhttpd/test_upgrade_large.c
deleted file mode 100644
index e7f842d1..00000000
--- a/src/microhttpd/test_upgrade_large.c
+++ /dev/null
@@ -1,1834 +0,0 @@
1/*
2 This file is part of libmicrohttpd
3 Copyright (C) 2016-2020 Christian Grothoff
4 Copyright (C) 2016-2022 Evgeny Grin (Karlson2k)
5
6 libmicrohttpd is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published
8 by the Free Software Foundation; either version 3, or (at your
9 option) any later version.
10
11 libmicrohttpd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with libmicrohttpd; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20*/
21
22/**
23 * @file test_upgrade_large.c
24 * @brief Testcase for libmicrohttpd upgrading a connection,
25 * modified to test the "large" corner case reported
26 * by Viet on the mailinglist in 6'2019
27 * @author Christian Grothoff
28 * @author Karlson2k (Evgeny Grin)
29 */
30
31#include "mhd_options.h"
32#include <stdlib.h>
33#include <string.h>
34#include <stdio.h>
35#include <pthread.h>
36#include <stdlib.h>
37#include <stddef.h>
38#include <errno.h>
39#ifndef WINDOWS
40#include <unistd.h>
41#endif
42#ifdef HAVE_STDBOOL_H
43#include <stdbool.h>
44#endif /* HAVE_STDBOOL_H */
45
46#include "mhd_sockets.h"
47#ifdef HAVE_NETINET_IP_H
48#include <netinet/ip.h>
49#endif /* HAVE_NETINET_IP_H */
50
51#ifdef HTTPS_SUPPORT
52#include <gnutls/gnutls.h>
53#include "../testcurl/https/tls_test_keys.h"
54
55#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
56#include <sys/types.h>
57#include <sys/wait.h>
58#endif /* HAVE_FORK && HAVE_WAITPID */
59#endif /* HTTPS_SUPPORT */
60
61#include "platform.h"
62#include "microhttpd.h"
63#include "mhd_itc.h"
64
65#include "test_helpers.h"
66
67
68#define LARGE_STRING \
69 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
70 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
71 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
72 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
73 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
74 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
75 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
76 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
77 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
78 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
79 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
80 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
81 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
82 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
83 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
84 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
85 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
86 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
87 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
88 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
89 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
90 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
91 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
92 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
93 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
94 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
95 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
96 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
97 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
98 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
99 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
100 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
101 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
102 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
103 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
104 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
105 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
106 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
107 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
108 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
109 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
110 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
111 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
112 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
113 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
114 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
115 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
116 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
117 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
118 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
119 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
120 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
121 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
122 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
123 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
124 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
125 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
126 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
127 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
128 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
129 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
130 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
131 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
132 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelXloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
133 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello" \
134 "HelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHelloHello\n"
135
136
137#define LARGE_REPLY_STRING \
138 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
139 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
140 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
141 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
142 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
143 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
144 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
145 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
146 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
147 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
148 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
149 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
150 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
151 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
152 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
153 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
154 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
155 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
156 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
157 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
158 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
159 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
160 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
161 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
162 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
163 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
164 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
165 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
166 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
167 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
168 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
169 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
170 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
171 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
172 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
173 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
174 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
175 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
176 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
177 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
178 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
179 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
180 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
181 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
182 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
183 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
184 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
185 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
186 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
187 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
188 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
189 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
190 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
191 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
192 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
193 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
194 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
195 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
196 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
197 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
198 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
199 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
200 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
201 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
202 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
203 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
204 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
205 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
206 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
207 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
208 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
209 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
210 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
211 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
212 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
213 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
214 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
215 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
216 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
217 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
218 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
219 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
220 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
221 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
222 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
223 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
224 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
225 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld" \
226 "WorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorldWorld\n"
227
228
229_MHD_NORETURN static void
230_externalErrorExit_func (const char *errDesc, const char *funcName, int lineNum)
231{
232 fflush (stdout);
233 if ((NULL != errDesc) && (0 != errDesc[0]))
234 fprintf (stderr, "%s", errDesc);
235 else
236 fprintf (stderr, "System or external library call failed");
237 if ((NULL != funcName) && (0 != funcName[0]))
238 fprintf (stderr, " in %s", funcName);
239 if (0 < lineNum)
240 fprintf (stderr, " at line %d", lineNum);
241
242 fprintf (stderr, ".\nLast errno value: %d (%s)\n", (int) errno,
243 strerror (errno));
244#ifdef MHD_WINSOCK_SOCKETS
245 fprintf (stderr, "WSAGetLastError() value: %d\n", (int) WSAGetLastError ());
246#endif /* MHD_WINSOCK_SOCKETS */
247 fflush (stderr);
248 exit (99);
249}
250
251
252_MHD_NORETURN static void
253_mhdErrorExit_func (const char *errDesc, const char *funcName, int lineNum)
254{
255 fflush (stdout);
256 if ((NULL != errDesc) && (0 != errDesc[0]))
257 fprintf (stderr, "%s", errDesc);
258 else
259 fprintf (stderr, "MHD unexpected error");
260 if ((NULL != funcName) && (0 != funcName[0]))
261 fprintf (stderr, " in %s", funcName);
262 if (0 < lineNum)
263 fprintf (stderr, " at line %d", lineNum);
264
265 fprintf (stderr, ".\nLast errno value: %d (%s)\n", (int) errno,
266 strerror (errno));
267
268 fflush (stderr);
269 exit (8);
270}
271
272
273static void
274_testErrorLog_func (const char *errDesc, const char *funcName, int lineNum)
275{
276 fflush (stdout);
277 if ((NULL != errDesc) && (0 != errDesc[0]))
278 fprintf (stderr, "%s", errDesc);
279 else
280 fprintf (stderr, "System or external library call resulted in error");
281 if ((NULL != funcName) && (0 != funcName[0]))
282 fprintf (stderr, " in %s", funcName);
283 if (0 < lineNum)
284 fprintf (stderr, " at line %d", lineNum);
285
286 fprintf (stderr, ".\nLast errno value: %d (%s)\n", (int) errno,
287 strerror (errno));
288#ifdef MHD_WINSOCK_SOCKETS
289 fprintf (stderr, "WSAGetLastError() value: %d\n", (int) WSAGetLastError ());
290#endif /* MHD_WINSOCK_SOCKETS */
291 fflush (stderr);
292}
293
294
295#if defined(HAVE___FUNC__)
296#define externalErrorExit(ignore) \
297 _externalErrorExit_func(NULL, __func__, __LINE__)
298#define externalErrorExitDesc(errDesc) \
299 _externalErrorExit_func(errDesc, __func__, __LINE__)
300#define mhdErrorExit(ignore) \
301 _mhdErrorExit_func(NULL, __func__, __LINE__)
302#define mhdErrorExitDesc(errDesc) \
303 _mhdErrorExit_func(errDesc, __func__, __LINE__)
304#define testErrorLog(ignore) \
305 _testErrorLog_func(NULL, __func__, __LINE__)
306#define testErrorLogDesc(errDesc) \
307 _testErrorLog_func(errDesc, __func__, __LINE__)
308#elif defined(HAVE___FUNCTION__)
309#define externalErrorExit(ignore) \
310 _externalErrorExit_func(NULL, __FUNCTION__, __LINE__)
311#define externalErrorExitDesc(errDesc) \
312 _externalErrorExit_func(errDesc, __FUNCTION__, __LINE__)
313#define mhdErrorExit(ignore) \
314 _mhdErrorExit_func(NULL, __FUNCTION__, __LINE__)
315#define mhdErrorExitDesc(errDesc) \
316 _mhdErrorExit_func(errDesc, __FUNCTION__, __LINE__)
317#define testErrorLog(ignore) \
318 _testErrorLog_func(NULL, __FUNCTION__, __LINE__)
319#define testErrorLogDesc(errDesc) \
320 _testErrorLog_func(errDesc, __FUNCTION__, __LINE__)
321#else
322#define externalErrorExit(ignore) _externalErrorExit_func(NULL, NULL, __LINE__)
323#define externalErrorExitDesc(errDesc) \
324 _externalErrorExit_func(errDesc, NULL, __LINE__)
325#define mhdErrorExit(ignore) _mhdErrorExit_func(NULL, NULL, __LINE__)
326#define mhdErrorExitDesc(errDesc) _mhdErrorExit_func(errDesc, NULL, __LINE__)
327#define testErrorLog(ignore) _testErrorLog_func(NULL, NULL, __LINE__)
328#define testErrorLogDesc(errDesc) _testErrorLog_func(errDesc, NULL, __LINE__)
329#endif
330
331
332static void
333fflush_allstd (void)
334{
335 fflush (stderr);
336 fflush (stdout);
337}
338
339
340static int verbose = 0;
341
342static uint16_t global_port;
343
344static struct MHD_itc_ kicker = MHD_ITC_STATIC_INIT_INVALID;
345
346enum tls_tool
347{
348 TLS_CLI_NO_TOOL = 0,
349 TLS_CLI_GNUTLS,
350 TLS_CLI_OPENSSL,
351 TLS_LIB_GNUTLS
352};
353
354static enum tls_tool use_tls_tool;
355
356#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID)
357/**
358 * Fork child that connects via GnuTLS-CLI to our @a port. Allows us to
359 * talk to our port over a socket in @a sp without having to worry
360 * about TLS.
361 *
362 * @param location where the socket is returned
363 * @return -1 on error, otherwise PID of TLS child process
364 */
365static pid_t
366gnutlscli_connect (int *sock,
367 uint16_t port)
368{
369 pid_t chld;
370 int sp[2];
371 char destination[30];
372
373 if (0 != socketpair (AF_UNIX,
374 SOCK_STREAM,
375 0,
376 sp))
377 {
378 testErrorLogDesc ("socketpair() failed");
379 return (pid_t) -1;
380 }
381 chld = fork ();
382 if (0 != chld)
383 {
384 *sock = sp[1];
385 MHD_socket_close_chk_ (sp[0]);
386 return chld;
387 }
388 MHD_socket_close_chk_ (sp[1]);
389 (void) close (0);
390 (void) close (1);
391 if (-1 == dup2 (sp[0], 0))
392 externalErrorExitDesc ("dup2() failed");
393 if (-1 == dup2 (sp[0], 1))
394 externalErrorExitDesc ("dup2() failed");
395 MHD_socket_close_chk_ (sp[0]);
396 if (TLS_CLI_GNUTLS == use_tls_tool)
397 {
398 snprintf (destination,
399 sizeof(destination),
400 "%u",
401 (unsigned int) port);
402 execlp ("gnutls-cli",
403 "gnutls-cli",
404 "--insecure",
405 "-p",
406 destination,
407 "127.0.0.1",
408 (char *) NULL);
409 }
410 else if (TLS_CLI_OPENSSL == use_tls_tool)
411 {
412 snprintf (destination,
413 sizeof(destination),
414 "127.0.0.1:%u",
415 (unsigned int) port);
416 execlp ("openssl",
417 "openssl",
418 "s_client",
419 "-connect",
420 destination,
421 "-verify",
422 "1",
423 (char *) NULL);
424 }
425 _exit (1);
426}
427
428
429#endif /* HTTPS_SUPPORT && HAVE_FORK && HAVE_WAITPID */
430
431
432/**
433 * Wrapper structure for plain&TLS sockets
434 */
435struct wr_socket
436{
437 /**
438 * Real network socket
439 */
440 MHD_socket fd;
441
442 /**
443 * Type of this socket
444 */
445 enum wr_type
446 {
447 wr_invalid = 0,
448 wr_plain = 1,
449 wr_tls = 2
450 } t;
451#ifdef HTTPS_SUPPORT
452 /**
453 * TLS credentials
454 */
455 gnutls_certificate_credentials_t tls_crd;
456
457 /**
458 * TLS session.
459 */
460 gnutls_session_t tls_s;
461
462 /**
463 * TLS handshake already succeed?
464 */
465 bool tls_connected;
466#endif
467};
468
469
470/**
471 * Get underlying real socket.
472 * @return FD of real socket
473 */
474#define wr_fd(s) ((s)->fd)
475
476
477/**
478 * Create wr_socket with plain TCP underlying socket
479 * @return created socket on success, NULL otherwise
480 */
481static struct wr_socket *
482wr_create_plain_sckt (void)
483{
484 struct wr_socket *s = malloc (sizeof(struct wr_socket));
485 if (NULL == s)
486 {
487 testErrorLogDesc ("malloc() failed");
488 return NULL;
489 }
490 s->t = wr_plain;
491 s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
492 if (MHD_INVALID_SOCKET != s->fd)
493 return s; /* Success */
494 testErrorLogDesc ("socket() failed");
495 free (s);
496 return NULL;
497}
498
499
500/**
501 * Create wr_socket with TLS TCP underlying socket
502 * @return created socket on success, NULL otherwise
503 */
504static struct wr_socket *
505wr_create_tls_sckt (void)
506{
507#ifdef HTTPS_SUPPORT
508 struct wr_socket *s = malloc (sizeof(struct wr_socket));
509 if (NULL == s)
510 {
511 testErrorLogDesc ("malloc() failed");
512 return NULL;
513 }
514 s->t = wr_tls;
515 s->tls_connected = 0;
516 s->fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
517 if (MHD_INVALID_SOCKET != s->fd)
518 {
519 if (GNUTLS_E_SUCCESS == gnutls_init (&(s->tls_s), GNUTLS_CLIENT))
520 {
521 if (GNUTLS_E_SUCCESS == gnutls_set_default_priority (s->tls_s))
522 {
523 if (GNUTLS_E_SUCCESS ==
524 gnutls_certificate_allocate_credentials (&(s->tls_crd)))
525 {
526 if (GNUTLS_E_SUCCESS == gnutls_credentials_set (s->tls_s,
527 GNUTLS_CRD_CERTIFICATE,
528 s->tls_crd))
529 {
530#if (GNUTLS_VERSION_NUMBER + 0 >= 0x030109) && ! defined(_WIN64)
531 gnutls_transport_set_int (s->tls_s, (int) (s->fd));
532#else /* GnuTLS before 3.1.9 or Win x64 */
533 gnutls_transport_set_ptr (s->tls_s,
534 (gnutls_transport_ptr_t) (intptr_t) (s->fd));
535#endif /* GnuTLS before 3.1.9 or Win x64 */
536 return s;
537 }
538 else
539 testErrorLogDesc ("gnutls_credentials_set() failed");
540 gnutls_certificate_free_credentials (s->tls_crd);
541 }
542 else
543 testErrorLogDesc ("gnutls_certificate_allocate_credentials() failed");
544 }
545 else
546 testErrorLogDesc ("gnutls_set_default_priority() failed");
547 gnutls_deinit (s->tls_s);
548 }
549 else
550 testErrorLogDesc ("gnutls_init() failed");
551 (void) MHD_socket_close_ (s->fd);
552 }
553 else
554 testErrorLogDesc ("socket() failed");
555 free (s);
556#endif /* HTTPS_SUPPORT */
557 return NULL;
558}
559
560
561/**
562 * Create wr_socket with plain TCP underlying socket
563 * from already created TCP socket.
564 * @param plain_sk real TCP socket
565 * @return created socket on success, NULL otherwise
566 */
567static struct wr_socket *
568wr_create_from_plain_sckt (MHD_socket plain_sk)
569{
570 struct wr_socket *s = malloc (sizeof(struct wr_socket));
571
572 if (NULL == s)
573 {
574 testErrorLogDesc ("malloc() failed");
575 return NULL;
576 }
577 s->t = wr_plain;
578 s->fd = plain_sk;
579 return s;
580}
581
582
583/**
584 * Connect socket to specified address.
585 * @param s socket to use
586 * @param addr address to connect
587 * @param length of structure pointed by @a addr
588 * @return zero on success, -1 otherwise.
589 */
590static int
591wr_connect (struct wr_socket *s,
592 const struct sockaddr *addr,
593 unsigned int length)
594{
595 if (0 != connect (s->fd, addr, (socklen_t) length))
596 {
597 testErrorLogDesc ("connect() failed");
598 return -1;
599 }
600 if (wr_plain == s->t)
601 return 0;
602#ifdef HTTPS_SUPPORT
603 if (wr_tls == s->t)
604 {
605 /* Do not try handshake here as
606 * it require processing on MHD side and
607 * when testing with "external" polling,
608 * test will call MHD processing only
609 * after return from wr_connect(). */
610 s->tls_connected = 0;
611 return 0;
612 }
613#endif /* HTTPS_SUPPORT */
614 testErrorLogDesc ("HTTPS socket connect called, but code does not support" \
615 " HTTPS sockets");
616 return -1;
617}
618
619
620#ifdef HTTPS_SUPPORT
621/* Only to be called from wr_send() and wr_recv() ! */
622static bool
623wr_handshake (struct wr_socket *s)
624{
625 int res = gnutls_handshake (s->tls_s);
626 if (GNUTLS_E_SUCCESS == res)
627 s->tls_connected = true;
628 else if (GNUTLS_E_AGAIN == res)
629 MHD_socket_set_error_ (MHD_SCKT_EAGAIN_);
630 else
631 {
632 fprintf (stderr, "The error returned by gnutls_handshake() is "
633 "'%s' ", gnutls_strerror ((int) res));
634#if GNUTLS_VERSION_NUMBER >= 0x020600
635 fprintf (stderr, "(%s)\n", gnutls_strerror_name ((int) res));
636#else /* GNUTLS_VERSION_NUMBER < 0x020600 */
637 fprintf (stderr, "(%d)\n", (int) res);
638#endif /* GNUTLS_VERSION_NUMBER < 0x020600 */
639 testErrorLogDesc ("gnutls_handshake() failed with hard error");
640 MHD_socket_set_error_ (MHD_SCKT_ECONNABORTED_); /* hard error */
641 }
642 return s->tls_connected;
643}
644
645
646#endif /* HTTPS_SUPPORT */
647
648
649/**
650 * Send data to remote by socket.
651 *
652 * @param s the socket to use
653 * @param buf the buffer with data to send
654 * @param len the length of data in @a buf
655 * @return number of bytes were sent if succeed,
656 * -1 if failed. Use #MHD_socket_get_error_()
657 * to get socket error.
658 */
659static ssize_t
660wr_send (struct wr_socket *s,
661 const void *buf,
662 size_t len)
663{
664 if (wr_plain == s->t)
665 return MHD_send_ (s->fd, buf, len);
666#ifdef HTTPS_SUPPORT
667 if (wr_tls == s->t)
668 {
669 ssize_t ret;
670
671 if (! s->tls_connected && ! wr_handshake (s))
672 return -1;
673
674 ret = gnutls_record_send (s->tls_s, buf, len);
675 if (ret > 0)
676 return ret;
677 if (GNUTLS_E_AGAIN == ret)
678 MHD_socket_set_error_ (MHD_SCKT_EAGAIN_);
679 else
680 {
681 fprintf (stderr, "The error returned by gnutls_record_send() is "
682 "'%s' ", gnutls_strerror ((int) ret));
683#if GNUTLS_VERSION_NUMBER >= 0x020600
684 fprintf (stderr, "(%s)\n", gnutls_strerror_name ((int) ret));
685#else /* GNUTLS_VERSION_NUMBER < 0x020600 */
686 fprintf (stderr, "(%d)\n", (int) ret);
687#endif /* GNUTLS_VERSION_NUMBER < 0x020600 */
688 testErrorLogDesc ("gnutls_record_send() failed with hard error");
689 MHD_socket_set_error_ (MHD_SCKT_ECONNABORTED_); /* hard error */
690 return -1;
691 }
692 }
693#endif /* HTTPS_SUPPORT */
694 testErrorLogDesc ("HTTPS socket send called, but code does not support" \
695 " HTTPS sockets");
696 return -1;
697}
698
699
700/**
701 * Receive data from remote by socket.
702 * @param s the socket to use
703 * @param buf the buffer to store received data
704 * @param len the length of @a buf
705 * @return number of bytes were received if succeed,
706 * -1 if failed. Use #MHD_socket_get_error_()
707 * to get socket error.
708 */
709static ssize_t
710wr_recv (struct wr_socket *s,
711 void *buf,
712 size_t len)
713{
714 if (wr_plain == s->t)
715 return MHD_recv_ (s->fd, buf, len);
716#ifdef HTTPS_SUPPORT
717 if (wr_tls == s->t)
718 {
719 ssize_t ret;
720 if (! s->tls_connected && ! wr_handshake (s))
721 return -1;
722
723 ret = gnutls_record_recv (s->tls_s, buf, len);
724 if (ret >= 0)
725 return ret;
726 if (GNUTLS_E_AGAIN == ret)
727 MHD_socket_set_error_ (MHD_SCKT_EAGAIN_);
728 else
729 {
730 fprintf (stderr, "The error returned by gnutls_record_recv() is "
731 "'%s' ", gnutls_strerror ((int) ret));
732#if GNUTLS_VERSION_NUMBER >= 0x020600
733 fprintf (stderr, "(%s)\n", gnutls_strerror_name ((int) ret));
734#else /* GNUTLS_VERSION_NUMBER < 0x020600 */
735 fprintf (stderr, "(%d)\n", (int) ret);
736#endif /* GNUTLS_VERSION_NUMBER < 0x020600 */
737 testErrorLogDesc ("gnutls_record_recv() failed with hard error");
738 MHD_socket_set_error_ (MHD_SCKT_ECONNABORTED_); /* hard error */
739 return -1;
740 }
741 }
742#endif /* HTTPS_SUPPORT */
743 return -1;
744}
745
746
747/**
748 * Close socket and release allocated resourced
749 * @param s the socket to close
750 * @return zero on succeed, -1 otherwise
751 */
752static int
753wr_close (struct wr_socket *s)
754{
755 int ret = (MHD_socket_close_ (s->fd)) ? 0 : -1;
756#ifdef HTTPS_SUPPORT
757 if (wr_tls == s->t)
758 {
759 gnutls_deinit (s->tls_s);
760 gnutls_certificate_free_credentials (s->tls_crd);
761 }
762#endif /* HTTPS_SUPPORT */
763 free (s);
764 return ret;
765}
766
767
768/**
769 * Thread we use to run the interaction with the upgraded socket.
770 */
771static pthread_t pt;
772
773/**
774 * Will be set to the upgraded socket.
775 */
776static struct wr_socket *volatile usock;
777
778/**
779 * Thread we use to run the interaction with the upgraded socket.
780 */
781static pthread_t pt_client;
782
783/**
784 * Flag set to 1 once the test is finished.
785 */
786static volatile bool done;
787
788
789static const char *
790term_reason_str (enum MHD_RequestTerminationCode term_code)
791{
792 switch ((int) term_code)
793 {
794 case MHD_REQUEST_TERMINATED_COMPLETED_OK:
795 return "COMPLETED_OK";
796 case MHD_REQUEST_TERMINATED_WITH_ERROR:
797 return "TERMINATED_WITH_ERROR";
798 case MHD_REQUEST_TERMINATED_TIMEOUT_REACHED:
799 return "TIMEOUT_REACHED";
800 case MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN:
801 return "DAEMON_SHUTDOWN";
802 case MHD_REQUEST_TERMINATED_READ_ERROR:
803 return "READ_ERROR";
804 case MHD_REQUEST_TERMINATED_CLIENT_ABORT:
805 return "CLIENT_ABORT";
806 case -1:
807 return "(not called)";
808 default:
809 return "(unknown code)";
810 }
811 return "(problem)"; /* unreachable */
812}
813
814
815/**
816 * Callback used by MHD to notify the application about completed
817 * requests. Frees memory.
818 *
819 * @param cls client-defined closure
820 * @param connection connection handle
821 * @param req_cls value as set by the last call to
822 * the #MHD_AccessHandlerCallback
823 * @param toe reason for request termination
824 */
825static void
826notify_completed_cb (void *cls,
827 struct MHD_Connection *connection,
828 void **req_cls,
829 enum MHD_RequestTerminationCode toe)
830{
831 (void) cls;
832 (void) connection; /* Unused. Silent compiler warning. */
833 if (verbose)
834 printf ("notify_completed_cb() has been called with '%s' code.\n",
835 term_reason_str (toe));
836 if ( (toe != MHD_REQUEST_TERMINATED_COMPLETED_OK) &&
837 (toe != MHD_REQUEST_TERMINATED_CLIENT_ABORT) &&
838 (toe != MHD_REQUEST_TERMINATED_DAEMON_SHUTDOWN) )
839 mhdErrorExitDesc ("notify_completed_cb() called with wrong code");
840 if (NULL == req_cls)
841 mhdErrorExitDesc ("'req_cls' parameter is NULL");
842 if (NULL == *req_cls)
843 mhdErrorExitDesc ("'*req_cls' pointer is NULL");
844 if (! pthread_equal (**((pthread_t **) req_cls),
845 pthread_self ()))
846 mhdErrorExitDesc ("notify_completed_cb() is called in wrong thread");
847 free (*req_cls);
848 *req_cls = NULL;
849}
850
851
852/**
853 * Logging callback.
854 *
855 * @param cls logging closure (NULL)
856 * @param uri access URI
857 * @param connection connection handle
858 * @return #TEST_PTR
859 */
860static void *
861log_cb (void *cls,
862 const char *uri,
863 struct MHD_Connection *connection)
864{
865 pthread_t *ppth;
866
867 (void) cls;
868 (void) connection; /* Unused. Silent compiler warning. */
869 if (NULL == uri)
870 mhdErrorExitDesc ("The 'uri' parameter is NULL");
871 if (0 != strcmp (uri, "/"))
872 {
873 fprintf (stderr, "Wrong 'uri' value: '%s'. ", uri);
874 mhdErrorExit ();
875 }
876 ppth = malloc (sizeof (pthread_t));
877 if (NULL == ppth)
878 externalErrorExitDesc ("malloc() failed");
879 *ppth = pthread_self ();
880 return (void *) ppth;
881}
882
883
884/**
885 * Function to check that MHD properly notifies about starting
886 * and stopping.
887 *
888 * @param cls client-defined closure
889 * @param connection connection handle
890 * @param socket_context socket-specific pointer where the
891 * client can associate some state specific
892 * to the TCP connection; note that this is
893 * different from the "req_cls" which is per
894 * HTTP request. The client can initialize
895 * during #MHD_CONNECTION_NOTIFY_STARTED and
896 * cleanup during #MHD_CONNECTION_NOTIFY_CLOSED
897 * and access in the meantime using
898 * #MHD_CONNECTION_INFO_SOCKET_CONTEXT.
899 * @param toe reason for connection notification
900 * @see #MHD_OPTION_NOTIFY_CONNECTION
901 * @ingroup request
902 */
903static void
904notify_connection_cb (void *cls,
905 struct MHD_Connection *connection,
906 void **socket_context,
907 enum MHD_ConnectionNotificationCode toe)
908{
909 static int started = MHD_NO;
910
911 (void) cls;
912 (void) connection; /* Unused. Silent compiler warning. */
913 switch (toe)
914 {
915 case MHD_CONNECTION_NOTIFY_STARTED:
916 if (MHD_NO != started)
917 mhdErrorExitDesc ("The connection has been already started");
918 started = MHD_YES;
919 *socket_context = &started;
920 break;
921 case MHD_CONNECTION_NOTIFY_CLOSED:
922 if (MHD_YES != started)
923 mhdErrorExitDesc ("The connection has not been started before");
924 if (&started != *socket_context)
925 mhdErrorExitDesc ("Wrong '*socket_context' value");
926 *socket_context = NULL;
927 started = MHD_NO;
928 break;
929 }
930}
931
932
933/**
934 * Change socket to blocking.
935 *
936 * @param fd the socket to manipulate
937 */
938static void
939make_blocking (MHD_socket fd)
940{
941#if defined(MHD_POSIX_SOCKETS)
942 int flags;
943
944 flags = fcntl (fd, F_GETFL);
945 if (-1 == flags)
946 externalErrorExitDesc ("fcntl() failed");
947 if ((flags & ~O_NONBLOCK) != flags)
948 if (-1 == fcntl (fd, F_SETFL, flags & ~O_NONBLOCK))
949 externalErrorExitDesc ("fcntl() failed");
950#elif defined(MHD_WINSOCK_SOCKETS)
951 unsigned long flags = 0;
952
953 if (0 != ioctlsocket (fd, (int) FIONBIO, &flags))
954 externalErrorExitDesc ("ioctlsocket() failed");
955#endif /* MHD_WINSOCK_SOCKETS */
956}
957
958
959static void
960kick_select (void)
961{
962 if (MHD_ITC_IS_VALID_ (kicker))
963 {
964 (void) MHD_itc_activate_ (kicker, "K");
965 }
966}
967
968
969static void
970send_all (struct wr_socket *sock,
971 const char *text)
972{
973 size_t len = strlen (text);
974 ssize_t ret;
975 size_t off;
976
977 make_blocking (wr_fd (sock));
978 for (off = 0; off < len; off += (size_t) ret)
979 {
980 ret = wr_send (sock,
981 &text[off],
982 len - off);
983 if (0 > ret)
984 {
985 if (! MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ()) &&
986 ! MHD_SCKT_ERR_IS_EINTR_ (MHD_socket_get_error_ ()))
987 externalErrorExitDesc ("send() failed");
988 else
989 ret = 0;
990 }
991 kick_select ();
992 }
993}
994
995
996/**
997 * Read character-by-character until we
998 * get 'CRLNCRLN'.
999 */
1000static void
1001recv_hdr (struct wr_socket *sock)
1002{
1003 unsigned int i;
1004 char next;
1005 char c;
1006 ssize_t ret;
1007
1008 make_blocking (wr_fd (sock));
1009 next = '\r';
1010 i = 0;
1011 while (i < 4)
1012 {
1013 ret = wr_recv (sock,
1014 &c,
1015 1);
1016 if (0 > ret)
1017 {
1018 if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ()))
1019 continue;
1020 if (MHD_SCKT_ERR_IS_EINTR_ (MHD_socket_get_error_ ()))
1021 continue;
1022 externalErrorExitDesc ("recv() failed");
1023 }
1024 if (0 == ret)
1025 mhdErrorExitDesc ("The server unexpectedly closed connection");
1026 kick_select ();
1027 if (c == next)
1028 {
1029 i++;
1030 if (next == '\r')
1031 next = '\n';
1032 else
1033 next = '\r';
1034 continue;
1035 }
1036 if (c == '\r')
1037 {
1038 i = 1;
1039 next = '\n';
1040 continue;
1041 }
1042 i = 0;
1043 next = '\r';
1044 }
1045}
1046
1047
1048static void
1049recv_all (struct wr_socket *sock,
1050 const char *text)
1051{
1052 size_t len = strlen (text);
1053 char buf[len];
1054 ssize_t ret;
1055 size_t off;
1056
1057 make_blocking (wr_fd (sock));
1058 for (off = 0; off < len; off += (size_t) ret)
1059 {
1060 ret = wr_recv (sock,
1061 &buf[off],
1062 len - off);
1063 if (0 > ret)
1064 {
1065 if (MHD_SCKT_ERR_IS_EAGAIN_ (MHD_socket_get_error_ ()) ||
1066 MHD_SCKT_ERR_IS_EINTR_ (MHD_socket_get_error_ ()))
1067 {
1068 ret = 0;
1069 continue;
1070 }
1071 externalErrorExitDesc ("recv() failed");
1072 }
1073 if (0 == ret)
1074 {
1075 fprintf (stderr, "Partial only received text. Expected: '%s' ."
1076 "Got: '%.*s'. ", text, (int) (off + (size_t) ret), buf);
1077 mhdErrorExitDesc ("The server unexpectedly closed connection");
1078 }
1079 if (0 != strncmp (text, buf, off + (size_t) ret))
1080 {
1081 fprintf (stderr, "Wrong received text. Expected: '%s' ."
1082 "Got: '%.*s'. ", text, (int) (off + (size_t) ret), buf);
1083 mhdErrorExit ();
1084 }
1085 }
1086 if (0 != strncmp (text, buf, len))
1087 {
1088 fprintf (stderr, "Wrong received text. Expected: '%s' ."
1089 "Got: '%.*s'. ", text, (int) len, buf);
1090 mhdErrorExit ();
1091 }
1092}
1093
1094
1095/**
1096 * Main function for the thread that runs the interaction with
1097 * the upgraded socket.
1098 *
1099 * @param cls the handle for the upgrade
1100 */
1101static void *
1102run_usock (void *cls)
1103{
1104 struct MHD_UpgradeResponseHandle *urh = cls;
1105
1106 send_all (usock,
1107 LARGE_STRING);
1108 recv_all (usock,
1109 LARGE_REPLY_STRING);
1110 send_all (usock,
1111 "Finished");
1112 MHD_upgrade_action (urh,
1113 MHD_UPGRADE_ACTION_CLOSE);
1114 free (usock);
1115 usock = NULL;
1116 return NULL;
1117}
1118
1119
1120/**
1121 * Main function for the thread that runs the client-side of the
1122 * interaction with the upgraded socket.
1123 *
1124 * @param cls the client socket
1125 */
1126static void *
1127run_usock_client (void *cls)
1128{
1129 struct wr_socket *sock = cls;
1130
1131 send_all (sock,
1132 "GET / HTTP/1.1\r\nHost: localhost\r\nConnection: Upgrade\r\n\r\n");
1133 recv_hdr (sock);
1134 recv_all (sock,
1135 LARGE_STRING);
1136 send_all (sock,
1137 LARGE_REPLY_STRING);
1138 recv_all (sock,
1139 "Finished");
1140 wr_close (sock);
1141 done = true;
1142 return NULL;
1143}
1144
1145
1146/**
1147 * Function called after a protocol "upgrade" response was sent
1148 * successfully and the socket should now be controlled by some
1149 * protocol other than HTTP.
1150 *
1151 * Any data already received on the socket will be made available in
1152 * @e extra_in. This can happen if the application sent extra data
1153 * before MHD send the upgrade response. The application should
1154 * treat data from @a extra_in as if it had read it from the socket.
1155 *
1156 * Note that the application must not close() @a sock directly,
1157 * but instead use #MHD_upgrade_action() for special operations
1158 * on @a sock.
1159 *
1160 * Except when in 'thread-per-connection' mode, implementations
1161 * of this function should never block (as it will still be called
1162 * from within the main event loop).
1163 *
1164 * @param cls closure, whatever was given to #MHD_create_response_for_upgrade().
1165 * @param connection original HTTP connection handle,
1166 * giving the function a last chance
1167 * to inspect the original HTTP request
1168 * @param req_cls last value left in `req_cls` of the `MHD_AccessHandlerCallback`
1169 * @param extra_in if we happened to have read bytes after the
1170 * HTTP header already (because the client sent
1171 * more than the HTTP header of the request before
1172 * we sent the upgrade response),
1173 * these are the extra bytes already read from @a sock
1174 * by MHD. The application should treat these as if
1175 * it had read them from @a sock.
1176 * @param extra_in_size number of bytes in @a extra_in
1177 * @param sock socket to use for bi-directional communication
1178 * with the client. For HTTPS, this may not be a socket
1179 * that is directly connected to the client and thus certain
1180 * operations (TCP-specific setsockopt(), getsockopt(), etc.)
1181 * may not work as expected (as the socket could be from a
1182 * socketpair() or a TCP-loopback). The application is expected
1183 * to perform read()/recv() and write()/send() calls on the socket.
1184 * The application may also call shutdown(), but must not call
1185 * close() directly.
1186 * @param urh argument for #MHD_upgrade_action()s on this @a connection.
1187 * Applications must eventually use this callback to (indirectly)
1188 * perform the close() action on the @a sock.
1189 */
1190static void
1191upgrade_cb (void *cls,
1192 struct MHD_Connection *connection,
1193 void *req_cls,
1194 const char *extra_in,
1195 size_t extra_in_size,
1196 MHD_socket sock,
1197 struct MHD_UpgradeResponseHandle *urh)
1198{
1199 (void) cls;
1200 (void) connection;
1201 (void) req_cls;
1202 (void) extra_in; /* Unused. Silent compiler warning. */
1203
1204 usock = wr_create_from_plain_sckt (sock);
1205 if (0 != extra_in_size)
1206 mhdErrorExitDesc ("'extra_in_size' is not zero");
1207 if (0 != pthread_create (&pt,
1208 NULL,
1209 &run_usock,
1210 urh))
1211 externalErrorExitDesc ("pthread_create() failed");
1212}
1213
1214
1215/**
1216 * A client has requested the given url using the given method
1217 * (#MHD_HTTP_METHOD_GET, #MHD_HTTP_METHOD_PUT,
1218 * #MHD_HTTP_METHOD_DELETE, #MHD_HTTP_METHOD_POST, etc). The callback
1219 * must call MHD callbacks to provide content to give back to the
1220 * client and return an HTTP status code (i.e. #MHD_HTTP_OK,
1221 * #MHD_HTTP_NOT_FOUND, etc.).
1222 *
1223 * @param cls argument given together with the function
1224 * pointer when the handler was registered with MHD
1225 * @param url the requested url
1226 * @param method the HTTP method used (#MHD_HTTP_METHOD_GET,
1227 * #MHD_HTTP_METHOD_PUT, etc.)
1228 * @param version the HTTP version string (i.e.
1229 * #MHD_HTTP_VERSION_1_1)
1230 * @param upload_data the data being uploaded (excluding HEADERS,
1231 * for a POST that fits into memory and that is encoded
1232 * with a supported encoding, the POST data will NOT be
1233 * given in upload_data and is instead available as
1234 * part of #MHD_get_connection_values; very large POST
1235 * data *will* be made available incrementally in
1236 * @a upload_data)
1237 * @param upload_data_size set initially to the size of the
1238 * @a upload_data provided; the method must update this
1239 * value to the number of bytes NOT processed;
1240 * @param req_cls pointer that the callback can set to some
1241 * address and that will be preserved by MHD for future
1242 * calls for this request; since the access handler may
1243 * be called many times (i.e., for a PUT/POST operation
1244 * with plenty of upload data) this allows the application
1245 * to easily associate some request-specific state.
1246 * If necessary, this state can be cleaned up in the
1247 * global #MHD_RequestCompletedCallback (which
1248 * can be set with the #MHD_OPTION_NOTIFY_COMPLETED).
1249 * Initially, `*req_cls` will be NULL.
1250 * @return #MHD_YES if the connection was handled successfully,
1251 * #MHD_NO if the socket must be closed due to a serious
1252 * error while handling the request
1253 */
1254static enum MHD_Result
1255ahc_upgrade (void *cls,
1256 struct MHD_Connection *connection,
1257 const char *url,
1258 const char *method,
1259 const char *version,
1260 const char *upload_data,
1261 size_t *upload_data_size,
1262 void **req_cls)
1263{
1264 struct MHD_Response *resp;
1265 (void) cls;
1266 (void) url;
1267 (void) method; /* Unused. Silent compiler warning. */
1268 (void) version;
1269 (void) upload_data;
1270 (void) upload_data_size; /* Unused. Silent compiler warning. */
1271
1272 if (NULL == req_cls)
1273 mhdErrorExitDesc ("'req_cls' is NULL");
1274 if (NULL == *req_cls)
1275 mhdErrorExitDesc ("'*req_cls' value is NULL");
1276 if (! pthread_equal (**((pthread_t **) req_cls), pthread_self ()))
1277 mhdErrorExitDesc ("ahc_upgrade() is called in wrong thread");
1278 resp = MHD_create_response_for_upgrade (&upgrade_cb,
1279 NULL);
1280 if (NULL == resp)
1281 mhdErrorExitDesc ("MHD_create_response_for_upgrade() failed");
1282 if (MHD_YES != MHD_add_response_header (resp,
1283 MHD_HTTP_HEADER_UPGRADE,
1284 "Hello World Protocol"))
1285 mhdErrorExitDesc ("MHD_add_response_header() failed");
1286 if (MHD_YES != MHD_queue_response (connection,
1287 MHD_HTTP_SWITCHING_PROTOCOLS,
1288 resp))
1289 mhdErrorExitDesc ("MHD_queue_response() failed");
1290 MHD_destroy_response (resp);
1291 return MHD_YES;
1292}
1293
1294
1295/**
1296 * Run the MHD external event loop using select.
1297 *
1298 * @param daemon daemon to run it for
1299 */
1300static void
1301run_mhd_select_loop (struct MHD_Daemon *daemon)
1302{
1303 fd_set rs;
1304 fd_set ws;
1305 fd_set es;
1306 MHD_socket max_fd;
1307 uint64_t to64;
1308 struct timeval tv;
1309
1310 while (! done)
1311 {
1312 FD_ZERO (&rs);
1313 FD_ZERO (&ws);
1314 FD_ZERO (&es);
1315 max_fd = MHD_INVALID_SOCKET;
1316 to64 = 1000;
1317
1318 FD_SET (MHD_itc_r_fd_ (kicker), &rs);
1319 if (MHD_YES !=
1320 MHD_get_fdset (daemon,
1321 &rs,
1322 &ws,
1323 &es,
1324 &max_fd))
1325 mhdErrorExitDesc ("MHD_get_fdset() failed");
1326 (void) MHD_get_timeout64 (daemon,
1327 &to64);
1328 if (1000 < to64)
1329 to64 = 1000;
1330#if ! defined(_WIN32) || defined(__CYGWIN__)
1331 tv.tv_sec = (time_t) (to64 / 1000);
1332#else /* Native W32 */
1333 tv.tv_sec = (long) (to64 / 1000);
1334#endif /* Native W32 */
1335 tv.tv_usec = (long) (1000 * (to64 % 1000));
1336 if (0 > MHD_SYS_select_ (max_fd + 1,
1337 &rs,
1338 &ws,
1339 &es,
1340 &tv))
1341 {
1342#ifdef MHD_POSIX_SOCKETS
1343 if (EINTR != errno)
1344 externalErrorExitDesc ("Unexpected select() error");
1345#else
1346 if ((WSAEINVAL != WSAGetLastError ()) ||
1347 (0 != rs.fd_count) || (0 != ws.fd_count) || (0 != es.fd_count) )
1348 externalErrorExitDesc ("Unexpected select() error");
1349 Sleep ((DWORD) (tv.tv_sec * 1000 + tv.tv_usec / 1000));
1350#endif
1351 }
1352 if (FD_ISSET (MHD_itc_r_fd_ (kicker), &rs))
1353 MHD_itc_clear_ (kicker);
1354 MHD_run_from_select (daemon,
1355 &rs,
1356 &ws,
1357 &es);
1358 }
1359}
1360
1361
1362#ifdef HAVE_POLL
1363
1364/**
1365 * Run the MHD external event loop using select.
1366 *
1367 * @param daemon daemon to run it for
1368 */
1369_MHD_NORETURN static void
1370run_mhd_poll_loop (struct MHD_Daemon *daemon)
1371{
1372 (void) daemon; /* Unused. Silent compiler warning. */
1373 externalErrorExitDesc ("Not implementable with MHD API");
1374}
1375
1376
1377#endif /* HAVE_POLL */
1378
1379
1380#ifdef EPOLL_SUPPORT
1381/**
1382 * Run the MHD external event loop using select.
1383 *
1384 * @param daemon daemon to run it for
1385 */
1386static void
1387run_mhd_epoll_loop (struct MHD_Daemon *daemon)
1388{
1389 const union MHD_DaemonInfo *di;
1390 MHD_socket ep;
1391 fd_set rs;
1392 uint64_t to64;
1393 struct timeval tv;
1394 int ret;
1395
1396 di = MHD_get_daemon_info (daemon,
1397 MHD_DAEMON_INFO_EPOLL_FD);
1398 if (NULL == di)
1399 mhdErrorExitDesc ("MHD_get_daemon_info() failed");
1400 ep = di->listen_fd;
1401 while (! done)
1402 {
1403 FD_ZERO (&rs);
1404 to64 = 1000;
1405 FD_SET (MHD_itc_r_fd_ (kicker), &rs);
1406 FD_SET (ep, &rs);
1407 (void) MHD_get_timeout64 (daemon,
1408 &to64);
1409 if (1000 < to64)
1410 to64 = 1000;
1411#if ! defined(_WIN32) || defined(__CYGWIN__)
1412 tv.tv_sec = (time_t) (to64 / 1000);
1413#else /* Native W32 */
1414 tv.tv_sec = (long) (to64 / 1000);
1415#endif /* Native W32 */
1416 tv.tv_usec = (int) (1000 * (to64 % 1000));
1417 ret = select (ep + 1,
1418 &rs,
1419 NULL,
1420 NULL,
1421 &tv);
1422 if (0 > ret)
1423 {
1424#ifdef MHD_POSIX_SOCKETS
1425 if (EINTR != errno)
1426 externalErrorExitDesc ("Unexpected select() error");
1427#else
1428 if ((WSAEINVAL != WSAGetLastError ()) ||
1429 (0 != rs.fd_count) || (0 != ws.fd_count) || (0 != es.fd_count) )
1430 externalErrorExitDesc ("Unexpected select() error");
1431 Sleep ((DWORD) (tv.tv_sec * 1000 + tv.tv_usec / 1000));
1432#endif
1433 }
1434 if (FD_ISSET (MHD_itc_r_fd_ (kicker), &rs))
1435 MHD_itc_clear_ (kicker);
1436 MHD_run (daemon);
1437 }
1438}
1439
1440
1441#endif /* EPOLL_SUPPORT */
1442
1443/**
1444 * Run the MHD external event loop using select.
1445 *
1446 * @param daemon daemon to run it for
1447 */
1448static void
1449run_mhd_loop (struct MHD_Daemon *daemon,
1450 unsigned int flags)
1451{
1452 if (0 == (flags & (MHD_USE_POLL | MHD_USE_EPOLL)))
1453 run_mhd_select_loop (daemon);
1454#ifdef HAVE_POLL
1455 else if (0 != (flags & MHD_USE_POLL))
1456 run_mhd_poll_loop (daemon);
1457#endif /* HAVE_POLL */
1458#ifdef EPOLL_SUPPORT
1459 else if (0 != (flags & MHD_USE_EPOLL))
1460 run_mhd_epoll_loop (daemon);
1461#endif
1462 else
1463 externalErrorExitDesc ("Wrong 'flags' value");
1464}
1465
1466
1467static bool test_tls;
1468
1469/**
1470 * Test upgrading a connection.
1471 *
1472 * @param flags which event loop style should be tested
1473 * @param pool size of the thread pool, 0 to disable
1474 */
1475static unsigned int
1476test_upgrade (unsigned int flags,
1477 unsigned int pool)
1478{
1479 struct MHD_Daemon *d = NULL;
1480 struct wr_socket *sock;
1481 struct sockaddr_in sa;
1482 enum MHD_FLAG used_flags;
1483 const union MHD_DaemonInfo *dinfo;
1484#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID)
1485 pid_t pid = -1;
1486#endif /* HTTPS_SUPPORT && HAVE_FORK && HAVE_WAITPID */
1487
1488 done = false;
1489
1490 if (! test_tls)
1491 d = MHD_start_daemon (flags | MHD_USE_ERROR_LOG | MHD_ALLOW_UPGRADE,
1492 global_port,
1493 NULL, NULL,
1494 &ahc_upgrade, NULL,
1495 MHD_OPTION_CONNECTION_MEMORY_LIMIT, (size_t) 512,
1496 MHD_OPTION_URI_LOG_CALLBACK, &log_cb, NULL,
1497 MHD_OPTION_NOTIFY_COMPLETED, &notify_completed_cb,
1498 NULL,
1499 MHD_OPTION_NOTIFY_CONNECTION, &notify_connection_cb,
1500 NULL,
1501 MHD_OPTION_THREAD_POOL_SIZE, pool,
1502 MHD_OPTION_END);
1503#ifdef HTTPS_SUPPORT
1504 else
1505 d = MHD_start_daemon (flags | MHD_USE_ERROR_LOG | MHD_ALLOW_UPGRADE
1506 | MHD_USE_TLS,
1507 global_port,
1508 NULL, NULL,
1509 &ahc_upgrade, NULL,
1510 MHD_OPTION_CONNECTION_MEMORY_LIMIT, (size_t) 512,
1511 MHD_OPTION_URI_LOG_CALLBACK, &log_cb, NULL,
1512 MHD_OPTION_NOTIFY_COMPLETED, &notify_completed_cb,
1513 NULL,
1514 MHD_OPTION_NOTIFY_CONNECTION, &notify_connection_cb,
1515 NULL,
1516 MHD_OPTION_HTTPS_MEM_KEY, srv_signed_key_pem,
1517 MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
1518 MHD_OPTION_THREAD_POOL_SIZE, pool,
1519 MHD_OPTION_END);
1520#endif /* HTTPS_SUPPORT */
1521 if (NULL == d)
1522 mhdErrorExitDesc ("MHD_start_daemon() failed");
1523 dinfo = MHD_get_daemon_info (d,
1524 MHD_DAEMON_INFO_FLAGS);
1525 if (NULL == dinfo)
1526 mhdErrorExitDesc ("MHD_get_daemon_info() failed");
1527 used_flags = dinfo->flags;
1528 dinfo = MHD_get_daemon_info (d,
1529 MHD_DAEMON_INFO_BIND_PORT);
1530 if ( (NULL == dinfo) ||
1531 (0 == dinfo->port) )
1532 mhdErrorExitDesc ("MHD_get_daemon_info() failed");
1533 global_port = dinfo->port; /* Re-use the same port for the next checks */
1534 if (! test_tls || (TLS_LIB_GNUTLS == use_tls_tool))
1535 {
1536 sock = test_tls ? wr_create_tls_sckt () : wr_create_plain_sckt ();
1537 if (NULL == sock)
1538 externalErrorExitDesc ("Create socket failed");
1539 sa.sin_family = AF_INET;
1540 sa.sin_port = htons (dinfo->port);
1541 sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
1542 if (0 != wr_connect (sock,
1543 (struct sockaddr *) &sa,
1544 sizeof (sa)))
1545 externalErrorExitDesc ("Connect socket failed");
1546 }
1547 else
1548 {
1549#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID)
1550 MHD_socket tls_fork_sock;
1551 uint16_t port;
1552
1553 port = dinfo->port;
1554 if (-1 == (pid = gnutlscli_connect (&tls_fork_sock,
1555 port)))
1556 externalErrorExitDesc ("gnutlscli_connect() failed");
1557
1558 sock = wr_create_from_plain_sckt (tls_fork_sock);
1559 if (NULL == sock)
1560 externalErrorExitDesc ("wr_create_from_plain_sckt() failed");
1561#else /* !HTTPS_SUPPORT || !HAVE_FORK || !HAVE_WAITPID */
1562 externalErrorExitDesc ("Unsupported 'use_tls_tool' value");
1563#endif /* !HTTPS_SUPPORT || !HAVE_FORK || !HAVE_WAITPID */
1564 }
1565
1566 if (0 == (flags & MHD_USE_INTERNAL_POLLING_THREAD) )
1567 {
1568 if (! MHD_itc_init_ (kicker))
1569 externalErrorExitDesc ("MHD_itc_init_() failed");
1570 }
1571
1572 if (0 != pthread_create (&pt_client,
1573 NULL,
1574 &run_usock_client,
1575 sock))
1576 externalErrorExitDesc ("pthread_create() failed");
1577 if (0 == (flags & MHD_USE_INTERNAL_POLLING_THREAD) )
1578 run_mhd_loop (d, used_flags);
1579 if (0 != pthread_join (pt_client,
1580 NULL))
1581 externalErrorExitDesc ("pthread_join() failed");
1582 if (0 != pthread_join (pt,
1583 NULL))
1584 externalErrorExitDesc ("pthread_join() failed");
1585#if defined(HTTPS_SUPPORT) && defined(HAVE_FORK) && defined(HAVE_WAITPID)
1586 if (test_tls && (TLS_LIB_GNUTLS != use_tls_tool))
1587 {
1588 if ((pid_t) -1 == waitpid (pid, NULL, 0))
1589 externalErrorExitDesc ("waitpid() failed");
1590 }
1591#endif /* HTTPS_SUPPORT && HAVE_FORK && HAVE_WAITPID */
1592 if (0 == (flags & MHD_USE_INTERNAL_POLLING_THREAD) )
1593 {
1594 (void) MHD_itc_destroy_ (kicker);
1595 MHD_itc_set_invalid_ (kicker);
1596 }
1597 MHD_stop_daemon (d);
1598 return 0;
1599}
1600
1601
1602int
1603main (int argc,
1604 char *const *argv)
1605{
1606 unsigned int error_count = 0;
1607 unsigned int res;
1608
1609 use_tls_tool = TLS_CLI_NO_TOOL;
1610 test_tls = has_in_name (argv[0], "_tls");
1611
1612 verbose = ! (has_param (argc, argv, "-q") ||
1613 has_param (argc, argv, "--quiet") ||
1614 has_param (argc, argv, "-s") ||
1615 has_param (argc, argv, "--silent"));
1616 if (test_tls)
1617 {
1618#ifdef HTTPS_SUPPORT
1619 use_tls_tool = TLS_LIB_GNUTLS; /* Should be always available as MHD uses it. */
1620 if (has_param (argc, argv, "--use-gnutls-cli"))
1621 use_tls_tool = TLS_CLI_GNUTLS;
1622 else if (has_param (argc, argv, "--use-openssl"))
1623 use_tls_tool = TLS_CLI_OPENSSL;
1624 else if (has_param (argc, argv, "--use-gnutls-lib"))
1625 use_tls_tool = TLS_LIB_GNUTLS;
1626#if defined(HAVE_FORK) && defined(HAVE_WAITPID)
1627 else if (0 == system ("gnutls-cli --version 1> /dev/null 2> /dev/null"))
1628 use_tls_tool = TLS_CLI_GNUTLS;
1629 else if (0 == system ("openssl version 1> /dev/null 2> /dev/null"))
1630 use_tls_tool = TLS_CLI_OPENSSL;
1631#endif /* HAVE_FORK && HAVE_WAITPID */
1632 if (verbose)
1633 {
1634 switch (use_tls_tool)
1635 {
1636 case TLS_CLI_GNUTLS:
1637 printf ("GnuTLS-CLI will be used for testing.\n");
1638 break;
1639 case TLS_CLI_OPENSSL:
1640 printf ("Command line version of OpenSSL will be used for testing.\n");
1641 break;
1642 case TLS_LIB_GNUTLS:
1643 printf ("GnuTLS library will be used for testing.\n");
1644 break;
1645 case TLS_CLI_NO_TOOL:
1646 default:
1647 externalErrorExitDesc ("Wrong 'use_tls_tool' value");
1648 }
1649 }
1650 if ( (TLS_LIB_GNUTLS == use_tls_tool) &&
1651 (GNUTLS_E_SUCCESS != gnutls_global_init ()) )
1652 externalErrorExitDesc ("gnutls_global_init() failed");
1653
1654#else /* ! HTTPS_SUPPORT */
1655 fprintf (stderr, "HTTPS support was disabled by configure.\n");
1656 return 77;
1657#endif /* ! HTTPS_SUPPORT */
1658 }
1659
1660 global_port = MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT) ?
1661 0 : (test_tls ? 1093 : 1092);
1662
1663 /* run tests */
1664 if (verbose)
1665 printf ("Starting HTTP \"Upgrade\" tests with %s connections.\n",
1666 test_tls ? "TLS" : "plain");
1667 /* try external select */
1668 res = test_upgrade (0,
1669 0);
1670 fflush_allstd ();
1671 error_count += res;
1672 if (res)
1673 fprintf (stderr,
1674 "FAILED: Upgrade with external select, return code %u.\n",
1675 res);
1676 else if (verbose)
1677 printf ("PASSED: Upgrade with external select.\n");
1678
1679 /* Try external auto */
1680 res = test_upgrade (MHD_USE_AUTO,
1681 0);
1682 fflush_allstd ();
1683 error_count += res;
1684 if (res)
1685 fprintf (stderr,
1686 "FAILED: Upgrade with external 'auto', return code %u.\n",
1687 res);
1688 else if (verbose)
1689 printf ("PASSED: Upgrade with external 'auto'.\n");
1690
1691#ifdef EPOLL_SUPPORT
1692 res = test_upgrade (MHD_USE_EPOLL,
1693 0);
1694 fflush_allstd ();
1695 error_count += res;
1696 if (res)
1697 fprintf (stderr,
1698 "FAILED: Upgrade with external select with EPOLL, return code %u.\n",
1699 res);
1700 else if (verbose)
1701 printf ("PASSED: Upgrade with external select with EPOLL.\n");
1702#endif
1703
1704 /* Test thread-per-connection */
1705 res = test_upgrade (MHD_USE_INTERNAL_POLLING_THREAD
1706 | MHD_USE_THREAD_PER_CONNECTION,
1707 0);
1708 fflush_allstd ();
1709 error_count += res;
1710 if (res)
1711 fprintf (stderr,
1712 "FAILED: Upgrade with thread per connection, return code %u.\n",
1713 res);
1714 else if (verbose)
1715 printf ("PASSED: Upgrade with thread per connection.\n");
1716
1717 res = test_upgrade (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD
1718 | MHD_USE_THREAD_PER_CONNECTION,
1719 0);
1720 fflush_allstd ();
1721 error_count += res;
1722 if (res)
1723 fprintf (stderr,
1724 "FAILED: Upgrade with thread per connection and 'auto', return code %u.\n",
1725 res);
1726 else if (verbose)
1727 printf ("PASSED: Upgrade with thread per connection and 'auto'.\n");
1728#ifdef HAVE_POLL
1729 res = test_upgrade (MHD_USE_INTERNAL_POLLING_THREAD
1730 | MHD_USE_THREAD_PER_CONNECTION | MHD_USE_POLL,
1731 0);
1732 fflush_allstd ();
1733 error_count += res;
1734 if (res)
1735 fprintf (stderr,
1736 "FAILED: Upgrade with thread per connection and poll, return code %u.\n",
1737 res);
1738 else if (verbose)
1739 printf ("PASSED: Upgrade with thread per connection and poll.\n");
1740#endif /* HAVE_POLL */
1741
1742 /* Test different event loops, with and without thread pool */
1743 res = test_upgrade (MHD_USE_INTERNAL_POLLING_THREAD,
1744 0);
1745 fflush_allstd ();
1746 error_count += res;
1747 if (res)
1748 fprintf (stderr,
1749 "FAILED: Upgrade with internal select, return code %u.\n",
1750 res);
1751 else if (verbose)
1752 printf ("PASSED: Upgrade with internal select.\n");
1753 res = test_upgrade (MHD_USE_INTERNAL_POLLING_THREAD,
1754 2);
1755 fflush_allstd ();
1756 error_count += res;
1757 if (res)
1758 fprintf (stderr,
1759 "FAILED: Upgrade with internal select with thread pool, return code %u.\n",
1760 res);
1761 else if (verbose)
1762 printf ("PASSED: Upgrade with internal select with thread pool.\n");
1763 res = test_upgrade (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD,
1764 0);
1765 fflush_allstd ();
1766 error_count += res;
1767 if (res)
1768 fprintf (stderr,
1769 "FAILED: Upgrade with internal 'auto' return code %u.\n",
1770 res);
1771 else if (verbose)
1772 printf ("PASSED: Upgrade with internal 'auto'.\n");
1773 res = test_upgrade (MHD_USE_AUTO | MHD_USE_INTERNAL_POLLING_THREAD,
1774 2);
1775 fflush_allstd ();
1776 error_count += res;
1777 if (res)
1778 fprintf (stderr,
1779 "FAILED: Upgrade with internal 'auto' with thread pool, return code %u.\n",
1780 res);
1781 else if (verbose)
1782 printf ("PASSED: Upgrade with internal 'auto' with thread pool.\n");
1783#ifdef HAVE_POLL
1784 res = test_upgrade (MHD_USE_POLL_INTERNAL_THREAD,
1785 0);
1786 fflush_allstd ();
1787 error_count += res;
1788 if (res)
1789 fprintf (stderr,
1790 "FAILED: Upgrade with internal poll, return code %u.\n",
1791 res);
1792 else if (verbose)
1793 printf ("PASSED: Upgrade with internal poll.\n");
1794 res = test_upgrade (MHD_USE_POLL_INTERNAL_THREAD,
1795 2);
1796 fflush_allstd ();
1797 if (res)
1798 fprintf (stderr,
1799 "FAILED: Upgrade with internal poll with thread pool, return code %u.\n",
1800 res);
1801 else if (verbose)
1802 printf ("PASSED: Upgrade with internal poll with thread pool.\n");
1803#endif
1804#ifdef EPOLL_SUPPORT
1805 res = test_upgrade (MHD_USE_EPOLL_INTERNAL_THREAD,
1806 0);
1807 fflush_allstd ();
1808 if (res)
1809 fprintf (stderr,
1810 "FAILED: Upgrade with internal epoll, return code %u.\n",
1811 res);
1812 else if (verbose)
1813 printf ("PASSED: Upgrade with internal epoll.\n");
1814 res = test_upgrade (MHD_USE_EPOLL_INTERNAL_THREAD,
1815 2);
1816 fflush_allstd ();
1817 if (res)
1818 fprintf (stderr,
1819 "FAILED: Upgrade with internal epoll, return code %u.\n",
1820 res);
1821 else if (verbose)
1822 printf ("PASSED: Upgrade with internal epoll.\n");
1823#endif
1824 /* report result */
1825 if (0 != error_count)
1826 fprintf (stderr,
1827 "Error (code: %u)\n",
1828 error_count);
1829#ifdef HTTPS_SUPPORT
1830 if (test_tls && (TLS_LIB_GNUTLS == use_tls_tool))
1831 gnutls_global_deinit ();
1832#endif /* HTTPS_SUPPORT */
1833 return error_count != 0; /* 0 == pass */
1834}