mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-29 04:09:31 +03:00
Make testsuite parallel build compatible (part 2)
This commit is contained in:
15 files changed
+271
-79
No files matched your search
@@ -77,19 +77,33 @@ testInternalSelectGet ()
|
||||
struct CURLMsg *msg;
|
||||
time_t start;
|
||||
struct timeval tv;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3000;
|
||||
|
||||
multi = NULL;
|
||||
cbc.buf = buf;
|
||||
cbc.size = 2048;
|
||||
cbc.pos = 0;
|
||||
d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_TLS | MHD_USE_INTERNAL_POLLING_THREAD,
|
||||
1082, NULL, NULL, &ahc_echo, "GET",
|
||||
port, NULL, NULL, &ahc_echo, "GET",
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
MHD_OPTION_END);
|
||||
if (d == NULL)
|
||||
return 256;
|
||||
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return 32; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
char *aes256_sha = "AES256-SHA";
|
||||
if (curl_uses_nss_ssl() == 0)
|
||||
{
|
||||
@@ -97,7 +111,8 @@ testInternalSelectGet ()
|
||||
}
|
||||
|
||||
c = curl_easy_init ();
|
||||
curl_easy_setopt (c, CURLOPT_URL, "https://127.0.0.1:1082/hello_world");
|
||||
curl_easy_setopt (c, CURLOPT_URL, "https://127.0.0.1/hello_world");
|
||||
curl_easy_setopt (c, CURLOPT_PORT, (long)port);
|
||||
curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, ©Buffer);
|
||||
curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
|
||||
/* TLS options */
|
||||
|
||||
@@ -47,9 +47,15 @@ test_cipher_option (FILE * test_fd,
|
||||
{
|
||||
int ret;
|
||||
struct MHD_Daemon *d;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3040;
|
||||
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, 4233,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
@@ -60,8 +66,16 @@ test_cipher_option (FILE * test_fd,
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
ret = test_https_transfer (test_fd, cipher_suite, proto_version);
|
||||
ret = test_https_transfer (test_fd, port, cipher_suite, proto_version);
|
||||
|
||||
MHD_stop_daemon (d);
|
||||
return ret;
|
||||
@@ -76,9 +90,15 @@ test_secure_get (FILE * test_fd,
|
||||
{
|
||||
int ret;
|
||||
struct MHD_Daemon *d;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3041;
|
||||
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, 4233,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_signed_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
|
||||
@@ -89,8 +109,16 @@ test_secure_get (FILE * test_fd,
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
ret = test_https_transfer (test_fd, cipher_suite, proto_version);
|
||||
ret = test_https_transfer (test_fd, port, cipher_suite, proto_version);
|
||||
|
||||
MHD_stop_daemon (d);
|
||||
return ret;
|
||||
|
||||
@@ -62,7 +62,7 @@ https_transfer_thread_adapter (void *args)
|
||||
|
||||
/* time spread incomming requests */
|
||||
usleep ((useconds_t) 10.0 * ((double) rand ()) / ((double) RAND_MAX));
|
||||
ret = test_https_transfer (NULL,
|
||||
ret = test_https_transfer (NULL, cargs->port,
|
||||
cargs->cipher_suite, cargs->proto_version);
|
||||
if (ret == 0)
|
||||
return NULL;
|
||||
@@ -78,12 +78,12 @@ https_transfer_thread_adapter (void *args)
|
||||
* TODO : make client_count a parameter - number of curl client threads to spawn
|
||||
*/
|
||||
static int
|
||||
test_single_client (void *cls, const char *cipher_suite,
|
||||
test_single_client (void *cls, int port, const char *cipher_suite,
|
||||
int curl_proto_version)
|
||||
{
|
||||
void *client_thread_ret;
|
||||
struct https_test_data client_args =
|
||||
{ NULL, cipher_suite, curl_proto_version };
|
||||
{ NULL, port, cipher_suite, curl_proto_version };
|
||||
|
||||
client_thread_ret = https_transfer_thread_adapter (&client_args);
|
||||
if (client_thread_ret != NULL)
|
||||
@@ -100,7 +100,7 @@ test_single_client (void *cls, const char *cipher_suite,
|
||||
* TODO : make client_count a parameter - numver of curl client threads to spawn
|
||||
*/
|
||||
static int
|
||||
test_parallel_clients (void * cls, const char *cipher_suite,
|
||||
test_parallel_clients (void * cls, int port, const char *cipher_suite,
|
||||
int curl_proto_version)
|
||||
{
|
||||
int i;
|
||||
@@ -108,7 +108,7 @@ test_parallel_clients (void * cls, const char *cipher_suite,
|
||||
void *client_thread_ret;
|
||||
pthread_t client_arr[client_count];
|
||||
struct https_test_data client_args =
|
||||
{ NULL, cipher_suite, curl_proto_version };
|
||||
{ NULL, port, cipher_suite, curl_proto_version };
|
||||
|
||||
for (i = 0; i < client_count; ++i)
|
||||
{
|
||||
@@ -137,6 +137,12 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
unsigned int errorCount = 0;
|
||||
const char *aes256_sha = "AES256-SHA";
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3020;
|
||||
|
||||
/* initialize random seed used by curl clients */
|
||||
unsigned int iseed = (unsigned int) time (NULL);
|
||||
@@ -157,7 +163,7 @@ main (int argc, char *const *argv)
|
||||
#ifdef EPOLL_SUPPORT
|
||||
errorCount +=
|
||||
test_wrap ("single threaded daemon, single client, epoll", &test_single_client,
|
||||
NULL,
|
||||
NULL, port,
|
||||
MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG | MHD_USE_EPOLL,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
@@ -165,7 +171,7 @@ main (int argc, char *const *argv)
|
||||
#endif
|
||||
errorCount +=
|
||||
test_wrap ("single threaded daemon, single client", &test_single_client,
|
||||
NULL,
|
||||
NULL, port,
|
||||
MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
@@ -173,7 +179,7 @@ main (int argc, char *const *argv)
|
||||
#ifdef EPOLL_SUPPORT
|
||||
errorCount +=
|
||||
test_wrap ("single threaded daemon, parallel clients, epoll",
|
||||
&test_parallel_clients, NULL,
|
||||
&test_parallel_clients, NULL, port,
|
||||
MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG | MHD_USE_EPOLL,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
@@ -181,7 +187,7 @@ main (int argc, char *const *argv)
|
||||
#endif
|
||||
errorCount +=
|
||||
test_wrap ("single threaded daemon, parallel clients",
|
||||
&test_parallel_clients, NULL,
|
||||
&test_parallel_clients, NULL, port,
|
||||
MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
|
||||
@@ -63,7 +63,7 @@ https_transfer_thread_adapter (void *args)
|
||||
|
||||
/* time spread incomming requests */
|
||||
usleep ((useconds_t) 10.0 * ((double) rand ()) / ((double) RAND_MAX));
|
||||
ret = test_https_transfer (cargs->cls,
|
||||
ret = test_https_transfer (cargs->cls, cargs->port,
|
||||
cargs->cipher_suite, cargs->proto_version);
|
||||
if (ret == 0)
|
||||
return NULL;
|
||||
@@ -78,12 +78,12 @@ https_transfer_thread_adapter (void *args)
|
||||
* TODO : make client_count a parameter - numver of curl client threads to spawn
|
||||
*/
|
||||
static int
|
||||
test_single_client (void *cls, const char *cipher_suite,
|
||||
test_single_client (void *cls, int port, const char *cipher_suite,
|
||||
int curl_proto_version)
|
||||
{
|
||||
void *client_thread_ret;
|
||||
struct https_test_data client_args =
|
||||
{ NULL, cipher_suite, curl_proto_version };
|
||||
{ NULL, port, cipher_suite, curl_proto_version };
|
||||
|
||||
client_thread_ret = https_transfer_thread_adapter (&client_args);
|
||||
if (client_thread_ret != NULL)
|
||||
@@ -100,7 +100,7 @@ test_single_client (void *cls, const char *cipher_suite,
|
||||
* TODO : make client_count a parameter - numver of curl client threads to spawn
|
||||
*/
|
||||
static int
|
||||
test_parallel_clients (void *cls, const char *cipher_suite,
|
||||
test_parallel_clients (void *cls, int port, const char *cipher_suite,
|
||||
int curl_proto_version)
|
||||
{
|
||||
int i;
|
||||
@@ -108,7 +108,7 @@ test_parallel_clients (void *cls, const char *cipher_suite,
|
||||
void *client_thread_ret;
|
||||
pthread_t client_arr[client_count];
|
||||
struct https_test_data client_args =
|
||||
{ NULL, cipher_suite, curl_proto_version };
|
||||
{ NULL, port, cipher_suite, curl_proto_version };
|
||||
|
||||
for (i = 0; i < client_count; ++i)
|
||||
{
|
||||
@@ -138,6 +138,12 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
unsigned int errorCount = 0;
|
||||
const char *ssl_version;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3010;
|
||||
|
||||
/* initialize random seed used by curl clients */
|
||||
unsigned int iseed = (unsigned int) time (NULL);
|
||||
@@ -175,7 +181,7 @@ main (int argc, char *const *argv)
|
||||
|
||||
errorCount +=
|
||||
test_wrap ("multi threaded daemon, single client", &test_single_client,
|
||||
NULL,
|
||||
NULL, port,
|
||||
MHD_USE_TLS | MHD_USE_ERROR_LOG | MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
@@ -183,7 +189,7 @@ main (int argc, char *const *argv)
|
||||
|
||||
errorCount +=
|
||||
test_wrap ("multi threaded daemon, parallel client",
|
||||
&test_parallel_clients, NULL,
|
||||
&test_parallel_clients, NULL, port,
|
||||
MHD_USE_TLS | MHD_USE_ERROR_LOG | MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD,
|
||||
aes256_sha, CURL_SSLVERSION_TLSv1, MHD_OPTION_HTTPS_MEM_KEY,
|
||||
srv_key_pem, MHD_OPTION_HTTPS_MEM_CERT,
|
||||
|
||||
@@ -97,24 +97,39 @@ testExternalGet (int flags)
|
||||
time_t start;
|
||||
struct timeval tv;
|
||||
const char *aes256_sha = "AES256-SHA";
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3030;
|
||||
|
||||
multi = NULL;
|
||||
cbc.buf = buf;
|
||||
cbc.size = 2048;
|
||||
cbc.pos = 0;
|
||||
d = MHD_start_daemon (MHD_USE_ERROR_LOG | MHD_USE_TLS | flags,
|
||||
1082, NULL, NULL, &ahc_echo, "GET",
|
||||
port, NULL, NULL, &ahc_echo, "GET",
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
MHD_OPTION_END);
|
||||
if (d == NULL)
|
||||
return 256;
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return 32; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
if (curl_uses_nss_ssl() == 0)
|
||||
aes256_sha = "rsa_aes_256_sha";
|
||||
|
||||
c = curl_easy_init ();
|
||||
curl_easy_setopt (c, CURLOPT_URL, "https://127.0.0.1:1082/hello_world");
|
||||
curl_easy_setopt (c, CURLOPT_URL, "https://127.0.0.1/hello_world");
|
||||
curl_easy_setopt (c, CURLOPT_PORT, (long)port);
|
||||
curl_easy_setopt (c, CURLOPT_WRITEFUNCTION, ©Buffer);
|
||||
curl_easy_setopt (c, CURLOPT_WRITEDATA, &cbc);
|
||||
/* TLS options */
|
||||
|
||||
@@ -47,13 +47,21 @@ test_concurent_daemon_pair (void *cls,
|
||||
const char *cipher_suite,
|
||||
int proto_version)
|
||||
{
|
||||
|
||||
int ret;
|
||||
struct MHD_Daemon *d1;
|
||||
struct MHD_Daemon *d2;
|
||||
int port1, port2;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port1 = port2 = 0;
|
||||
else
|
||||
{
|
||||
port1 = 3050;
|
||||
port2 = 3051;
|
||||
}
|
||||
|
||||
d1 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT,
|
||||
MHD_USE_ERROR_LOG, port1,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
@@ -64,9 +72,17 @@ test_concurent_daemon_pair (void *cls,
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port1)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d1, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d1); return -1; }
|
||||
port1 = (int)dinfo->port;
|
||||
}
|
||||
|
||||
d2 = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT + 1,
|
||||
MHD_USE_ERROR_LOG, port2,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
@@ -78,16 +94,28 @@ test_concurent_daemon_pair (void *cls,
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port2)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d2, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{
|
||||
MHD_stop_daemon (d1);
|
||||
MHD_stop_daemon (d2);
|
||||
return -1;
|
||||
}
|
||||
port2 = (int)dinfo->port;
|
||||
}
|
||||
|
||||
ret =
|
||||
test_daemon_get (NULL, cipher_suite, proto_version, DEAMON_TEST_PORT, 0);
|
||||
test_daemon_get (NULL, cipher_suite, proto_version, port1, 0);
|
||||
ret +=
|
||||
test_daemon_get (NULL, cipher_suite, proto_version,
|
||||
DEAMON_TEST_PORT + 1, 0);
|
||||
port2, 0);
|
||||
|
||||
MHD_stop_daemon (d2);
|
||||
ret +=
|
||||
test_daemon_get (NULL, cipher_suite, proto_version, DEAMON_TEST_PORT, 0);
|
||||
test_daemon_get (NULL, cipher_suite, proto_version, port1, 0);
|
||||
MHD_stop_daemon (d1);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -100,17 +100,21 @@ test_query_session ()
|
||||
struct CBC cbc;
|
||||
CURLcode errornum;
|
||||
char url[256];
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3060;
|
||||
|
||||
if (NULL == (cbc.buf = malloc (sizeof (char) * 255)))
|
||||
return 16;
|
||||
cbc.size = 255;
|
||||
cbc.pos = 0;
|
||||
|
||||
gen_test_file_url (url, DEAMON_TEST_PORT);
|
||||
|
||||
/* setup test */
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &query_session_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_PRIORITIES, "NORMAL:+ARCFOUR-128",
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
@@ -122,6 +126,14 @@ test_query_session ()
|
||||
free (cbc.buf);
|
||||
return 2;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return 32; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
const char *aes256_sha = "AES256-SHA";
|
||||
if (curl_uses_nss_ssl() == 0)
|
||||
@@ -129,6 +141,7 @@ test_query_session ()
|
||||
aes256_sha = "rsa_aes_256_sha";
|
||||
}
|
||||
|
||||
gen_test_file_url (url, port);
|
||||
c = curl_easy_init ();
|
||||
#if DEBUG_HTTPS_TEST
|
||||
curl_easy_setopt (c, CURLOPT_VERBOSE, 1);
|
||||
@@ -172,6 +185,7 @@ test_query_session ()
|
||||
int
|
||||
main (int argc, char *const *argv)
|
||||
{
|
||||
#if LIBCURL_VERSION_NUM >= 0x072200
|
||||
unsigned int errorCount = 0;
|
||||
const char *ssl_version;
|
||||
|
||||
@@ -200,10 +214,11 @@ main (int argc, char *const *argv)
|
||||
curl_global_cleanup ();
|
||||
return 77;
|
||||
}
|
||||
#if LIBCURL_VERSION_NUM >= 0x072200
|
||||
errorCount += test_query_session ();
|
||||
#endif
|
||||
print_test_result (errorCount, argv[0]);
|
||||
curl_global_cleanup ();
|
||||
return errorCount != 0 ? 1 : 0;
|
||||
#else /* LIBCURL_VERSION_NUM < 0x072200 */
|
||||
return 77;
|
||||
#endif /* LIBCURL_VERSION_NUM < 0x072200 */
|
||||
}
|
||||
@@ -180,13 +180,14 @@ sni_callback (gnutls_session_t session,
|
||||
|
||||
/* perform a HTTP GET request via SSL/TLS */
|
||||
static int
|
||||
do_get (const char *url)
|
||||
do_get (const char *url, int port)
|
||||
{
|
||||
CURL *c;
|
||||
struct CBC cbc;
|
||||
CURLcode errornum;
|
||||
size_t len;
|
||||
struct curl_slist *dns_info;
|
||||
char buf[256];
|
||||
|
||||
len = strlen (test_data);
|
||||
if (NULL == (cbc.buf = malloc (sizeof (char) * len)))
|
||||
@@ -202,6 +203,7 @@ do_get (const char *url)
|
||||
curl_easy_setopt (c, CURLOPT_VERBOSE, 1);
|
||||
#endif
|
||||
curl_easy_setopt (c, CURLOPT_URL, url);
|
||||
curl_easy_setopt (c, CURLOPT_PORT, (long)port);
|
||||
curl_easy_setopt (c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
|
||||
curl_easy_setopt (c, CURLOPT_TIMEOUT, 10L);
|
||||
curl_easy_setopt (c, CURLOPT_CONNECTTIMEOUT, 10L);
|
||||
@@ -212,8 +214,10 @@ do_get (const char *url)
|
||||
/* TODO merge into send_curl_req */
|
||||
curl_easy_setopt (c, CURLOPT_SSL_VERIFYPEER, 0);
|
||||
curl_easy_setopt (c, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
dns_info = curl_slist_append (NULL, "host1:4233:127.0.0.1");
|
||||
dns_info = curl_slist_append (dns_info, "host2:4233:127.0.0.1");
|
||||
sprintf(buf, "host1:%d:127.0.0.1", port);
|
||||
dns_info = curl_slist_append (NULL, buf);
|
||||
sprintf(buf, "host2:%d:127.0.0.1", port);
|
||||
dns_info = curl_slist_append (dns_info, buf);
|
||||
curl_easy_setopt (c, CURLOPT_RESOLVE, dns_info);
|
||||
curl_easy_setopt (c, CURLOPT_FAILONERROR, 1);
|
||||
|
||||
@@ -250,6 +254,12 @@ main (int argc, char *const *argv)
|
||||
{
|
||||
unsigned int error_count = 0;
|
||||
struct MHD_Daemon *d;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3060;
|
||||
|
||||
#ifdef MHD_HTTPS_REQUIRE_GRYPT
|
||||
gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
|
||||
@@ -272,7 +282,7 @@ main (int argc, char *const *argv)
|
||||
load_keys ("host1", ABS_SRCDIR "/host1.crt", ABS_SRCDIR "/host1.key");
|
||||
load_keys ("host2", ABS_SRCDIR "/host2.crt", ABS_SRCDIR "/host2.key");
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG,
|
||||
4233,
|
||||
port,
|
||||
NULL, NULL,
|
||||
&http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_CERT_CALLBACK, &sni_callback,
|
||||
@@ -282,9 +292,17 @@ main (int argc, char *const *argv)
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 != do_get ("https://host1:4233/"))
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
if (0 != do_get ("https://host1/", port))
|
||||
error_count++;
|
||||
if (0 != do_get ("https://host2:4233/"))
|
||||
if (0 != do_get ("https://host2/", port))
|
||||
error_count++;
|
||||
|
||||
MHD_stop_daemon (d);
|
||||
|
||||
@@ -47,7 +47,7 @@ extern const char srv_self_signed_cert_pem[];
|
||||
static const int TIME_OUT = 3;
|
||||
|
||||
static int
|
||||
test_tls_session_time_out (gnutls_session_t session)
|
||||
test_tls_session_time_out (gnutls_session_t session, int port)
|
||||
{
|
||||
int ret;
|
||||
MHD_socket sd;
|
||||
@@ -62,7 +62,7 @@ test_tls_session_time_out (gnutls_session_t session)
|
||||
|
||||
memset (&sa, '\0', sizeof (struct sockaddr_in));
|
||||
sa.sin_family = AF_INET;
|
||||
sa.sin_port = htons (DEAMON_TEST_PORT);
|
||||
sa.sin_port = htons (port);
|
||||
sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
||||
|
||||
gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) (intptr_t) sd);
|
||||
@@ -109,7 +109,12 @@ main (int argc, char *const *argv)
|
||||
gnutls_datum_t key;
|
||||
gnutls_datum_t cert;
|
||||
gnutls_certificate_credentials_t xcred;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3070;
|
||||
|
||||
#ifdef MHD_HTTPS_REQUIRE_GRYPT
|
||||
gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
|
||||
@@ -121,7 +126,7 @@ main (int argc, char *const *argv)
|
||||
gnutls_global_set_log_level (11);
|
||||
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &http_dummy_ahc, NULL,
|
||||
MHD_OPTION_CONNECTION_TIMEOUT, TIME_OUT,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
@@ -133,13 +138,21 @@ main (int argc, char *const *argv)
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
if (0 != setup_session (&session, &key, &cert, &xcred))
|
||||
{
|
||||
fprintf (stderr, "failed to setup session\n");
|
||||
return 1;
|
||||
}
|
||||
errorCount += test_tls_session_time_out (session);
|
||||
errorCount += test_tls_session_time_out (session, port);
|
||||
teardown_session (session, &key, &cert, xcred);
|
||||
|
||||
print_test_result (errorCount, argv[0]);
|
||||
|
||||
@@ -50,9 +50,15 @@ test_secure_get (void * cls, char *cipher_suite, int proto_version)
|
||||
{
|
||||
int ret;
|
||||
struct MHD_Daemon *d;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3070;
|
||||
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_signed_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_signed_cert_pem,
|
||||
@@ -63,8 +69,16 @@ test_secure_get (void * cls, char *cipher_suite, int proto_version)
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
ret = test_daemon_get (NULL, cipher_suite, proto_version, DEAMON_TEST_PORT, 0);
|
||||
ret = test_daemon_get (NULL, cipher_suite, proto_version, port, 0);
|
||||
|
||||
MHD_stop_daemon (d);
|
||||
return ret;
|
||||
|
||||
@@ -42,13 +42,14 @@ extern const char srv_self_signed_cert_pem[];
|
||||
* Test daemon response to TLS client hello requests containing extensions
|
||||
*
|
||||
* @param session
|
||||
* @param port
|
||||
* @param exten_t - the type of extension being appended to client hello request
|
||||
* @param ext_count - the number of consecutive extension replicas inserted into request
|
||||
* @param ext_length - the length of each appended extension
|
||||
* @return 0 on successful test completion, -1 otherwise
|
||||
*/
|
||||
static int
|
||||
test_hello_extension (gnutls_session_t session, extensions_t exten_t,
|
||||
test_hello_extension (gnutls_session_t session, int port, extensions_t exten_t,
|
||||
int ext_count, int ext_length)
|
||||
{
|
||||
int i, ret = 0, pos = 0;
|
||||
@@ -84,7 +85,7 @@ test_hello_extension (gnutls_session_t session, extensions_t exten_t,
|
||||
}
|
||||
memset (&sa, '\0', sizeof (struct sockaddr_in));
|
||||
sa.sin_family = AF_INET;
|
||||
sa.sin_port = htons (DEAMON_TEST_PORT);
|
||||
sa.sin_port = htons (port);
|
||||
sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
|
||||
|
||||
enum MHD_GNUTLS_Protocol hver;
|
||||
@@ -167,7 +168,7 @@ test_hello_extension (gnutls_session_t session, extensions_t exten_t,
|
||||
|
||||
gnutls_transport_set_ptr (session, (MHD_gnutls_transport_ptr_t) (long) sd);
|
||||
|
||||
if (gen_test_file_url (url, DEAMON_TEST_PORT))
|
||||
if (gen_test_file_url (url, port))
|
||||
{
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
@@ -210,11 +211,16 @@ main (int argc, char *const *argv)
|
||||
gnutls_datum_t key;
|
||||
gnutls_datum_t cert;
|
||||
gnutls_certificate_credentials_t xcred;
|
||||
|
||||
const int ext_arr[] = {
|
||||
GNUTLS_EXTENSION_SERVER_NAME,
|
||||
-1
|
||||
};
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3080;
|
||||
|
||||
#ifdef MHD_HTTPS_REQUIRE_GRYPT
|
||||
gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
|
||||
@@ -237,7 +243,7 @@ main (int argc, char *const *argv)
|
||||
}
|
||||
|
||||
d = MHD_start_daemon (MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS |
|
||||
MHD_USE_ERROR_LOG, DEAMON_TEST_PORT,
|
||||
MHD_USE_ERROR_LOG, port,
|
||||
NULL, NULL, &http_ahc, NULL,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
MHD_OPTION_HTTPS_MEM_CERT, srv_self_signed_cert_pem,
|
||||
@@ -248,26 +254,34 @@ main (int argc, char *const *argv)
|
||||
fprintf (stderr, "%s\n", MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
}
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{ MHD_stop_daemon (d); return -1; }
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
i = 0;
|
||||
setup_session (&session, &key, &cert, &xcred);
|
||||
errorCount += test_hello_extension (session, ext_arr[i], 1, 16);
|
||||
errorCount += test_hello_extension (session, port, ext_arr[i], 1, 16);
|
||||
teardown_session (session, &key, &cert, xcred);
|
||||
#if 1
|
||||
i = 0;
|
||||
while (ext_arr[i] != -1)
|
||||
{
|
||||
setup_session (&session, &key, &cert, &xcred);
|
||||
errorCount += test_hello_extension (session, ext_arr[i], 1, 16);
|
||||
errorCount += test_hello_extension (session, port, ext_arr[i], 1, 16);
|
||||
teardown_session (session, &key, &cert, xcred);
|
||||
|
||||
setup_session (&session, &key, &cert, &xcred);
|
||||
errorCount += test_hello_extension (session, ext_arr[i], 3, 8);
|
||||
errorCount += test_hello_extension (session, port, ext_arr[i], 3, 8);
|
||||
teardown_session (session, &key, &cert, xcred);
|
||||
|
||||
/* this test specifically tests the issue raised in CVE-2008-1948 */
|
||||
setup_session (&session, &key, &cert, &xcred);
|
||||
errorCount += test_hello_extension (session, ext_arr[i], 6, 0);
|
||||
errorCount += test_hello_extension (session, port, ext_arr[i], 6, 0);
|
||||
teardown_session (session, &key, &cert, xcred);
|
||||
i++;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ int curl_check_version (const char *req_version, ...);
|
||||
*
|
||||
*/
|
||||
static int
|
||||
test_unmatching_ssl_version (void * cls, const char *cipher_suite,
|
||||
test_unmatching_ssl_version (void * cls, int port, const char *cipher_suite,
|
||||
int curl_req_ssl_version)
|
||||
{
|
||||
struct CBC cbc;
|
||||
@@ -57,7 +57,7 @@ test_unmatching_ssl_version (void * cls, const char *cipher_suite,
|
||||
cbc.pos = 0;
|
||||
|
||||
char url[255];
|
||||
if (gen_test_file_url (url, DEAMON_TEST_PORT))
|
||||
if (gen_test_file_url (url, port))
|
||||
{
|
||||
free (cbc.buf);
|
||||
fprintf (stderr, "Internal error in gen_test_file_url\n");
|
||||
@@ -86,6 +86,12 @@ main (int argc, char *const *argv)
|
||||
const char *ssl_version;
|
||||
int daemon_flags =
|
||||
MHD_USE_THREAD_PER_CONNECTION | MHD_USE_INTERNAL_POLLING_THREAD | MHD_USE_TLS | MHD_USE_ERROR_LOG;
|
||||
int port;
|
||||
|
||||
if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_AUTODETECT_BIND_PORT))
|
||||
port = 0;
|
||||
else
|
||||
port = 3010;
|
||||
|
||||
#ifdef MHD_HTTPS_REQUIRE_GRYPT
|
||||
gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
|
||||
@@ -127,7 +133,7 @@ main (int argc, char *const *argv)
|
||||
|
||||
if (0 !=
|
||||
test_wrap ("TLS1.0-AES-SHA1",
|
||||
&test_https_transfer, NULL, daemon_flags,
|
||||
&test_https_transfer, NULL, port, daemon_flags,
|
||||
aes128_sha,
|
||||
CURL_SSLVERSION_TLSv1,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
@@ -142,7 +148,7 @@ main (int argc, char *const *argv)
|
||||
"The following handshake should fail (and print an error message)...\n");
|
||||
if (0 !=
|
||||
test_wrap ("TLS1.0 vs SSL3",
|
||||
&test_unmatching_ssl_version, NULL, daemon_flags,
|
||||
&test_unmatching_ssl_version, NULL, port, daemon_flags,
|
||||
aes256_sha,
|
||||
CURL_SSLVERSION_SSLv3,
|
||||
MHD_OPTION_HTTPS_MEM_KEY, srv_key_pem,
|
||||
|
||||
@@ -318,7 +318,7 @@ gen_test_file_url (char *url, int port)
|
||||
* test HTTPS file transfer
|
||||
*/
|
||||
int
|
||||
test_https_transfer (void *cls, const char *cipher_suite, int proto_version)
|
||||
test_https_transfer (void *cls, int port, const char *cipher_suite, int proto_version)
|
||||
{
|
||||
int len;
|
||||
int ret = 0;
|
||||
@@ -334,7 +334,7 @@ test_https_transfer (void *cls, const char *cipher_suite, int proto_version)
|
||||
cbc.size = len;
|
||||
cbc.pos = 0;
|
||||
|
||||
if (gen_test_file_url (url, DEAMON_TEST_PORT))
|
||||
if (gen_test_file_url (url, port))
|
||||
{
|
||||
ret = -1;
|
||||
goto cleanup;
|
||||
@@ -366,21 +366,33 @@ cleanup:
|
||||
* @param d
|
||||
* @param daemon_flags
|
||||
* @param arg_list
|
||||
* @return
|
||||
* @return port number on success or zero on failure
|
||||
*/
|
||||
int
|
||||
setup_testcase (struct MHD_Daemon **d, int daemon_flags, va_list arg_list)
|
||||
setup_testcase (struct MHD_Daemon **d, int port, int daemon_flags, va_list arg_list)
|
||||
{
|
||||
*d = MHD_start_daemon_va (daemon_flags, DEAMON_TEST_PORT,
|
||||
*d = MHD_start_daemon_va (daemon_flags, port,
|
||||
NULL, NULL, &http_ahc, NULL, arg_list);
|
||||
|
||||
if (*d == NULL)
|
||||
{
|
||||
fprintf (stderr, MHD_E_SERVER_INIT);
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (0 == port)
|
||||
{
|
||||
const union MHD_DaemonInfo *dinfo;
|
||||
dinfo = MHD_get_daemon_info (*d, MHD_DAEMON_INFO_BIND_PORT);
|
||||
if (NULL == dinfo || 0 == dinfo->port)
|
||||
{
|
||||
MHD_stop_daemon (*d);
|
||||
return 0;
|
||||
}
|
||||
port = (int)dinfo->port;
|
||||
}
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -454,8 +466,9 @@ teardown_session (gnutls_session_t session,
|
||||
/* TODO test_wrap: change sig to (setup_func, test, va_list test_arg) */
|
||||
int
|
||||
test_wrap (const char *test_name, int
|
||||
(*test_function) (void * cls, const char *cipher_suite,
|
||||
(*test_function) (void * cls, int port, const char *cipher_suite,
|
||||
int proto_version), void * cls,
|
||||
int port,
|
||||
int daemon_flags, const char *cipher_suite, int proto_version, ...)
|
||||
{
|
||||
int ret;
|
||||
@@ -463,7 +476,8 @@ test_wrap (const char *test_name, int
|
||||
struct MHD_Daemon *d;
|
||||
|
||||
va_start (arg_list, proto_version);
|
||||
if (setup_testcase (&d, daemon_flags, arg_list) != 0)
|
||||
port = setup_testcase (&d, port, daemon_flags, arg_list);
|
||||
if (0 == port)
|
||||
{
|
||||
va_end (arg_list);
|
||||
fprintf (stderr, "Failed to setup testcase %s\n", test_name);
|
||||
@@ -472,7 +486,7 @@ test_wrap (const char *test_name, int
|
||||
#if 0
|
||||
fprintf (stdout, "running test: %s ", test_name);
|
||||
#endif
|
||||
ret = test_function (NULL, cipher_suite, proto_version);
|
||||
ret = test_function (NULL, port, cipher_suite, proto_version);
|
||||
#if 0
|
||||
if (ret == 0)
|
||||
{
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
#define DEBUG_HTTPS_TEST 0
|
||||
#define CURL_VERBOS_LEVEL 0
|
||||
|
||||
#define DEAMON_TEST_PORT 4233
|
||||
|
||||
#define test_data "Hello World\n"
|
||||
#define ca_cert_file_name "tmp_ca_cert.pem"
|
||||
|
||||
@@ -51,6 +49,7 @@
|
||||
struct https_test_data
|
||||
{
|
||||
void *cls;
|
||||
int port;
|
||||
const char *cipher_suite;
|
||||
int proto_version;
|
||||
};
|
||||
@@ -114,10 +113,10 @@ send_curl_req (char *url, struct CBC *cbc, const char *cipher_suite,
|
||||
int proto_version);
|
||||
|
||||
int
|
||||
test_https_transfer (void *cls, const char *cipher_suite, int proto_version);
|
||||
test_https_transfer (void *cls, int port, const char *cipher_suite, int proto_version);
|
||||
|
||||
int
|
||||
setup_testcase (struct MHD_Daemon **d, int daemon_flags, va_list arg_list);
|
||||
setup_testcase (struct MHD_Daemon **d, int port, int daemon_flags, va_list arg_list);
|
||||
|
||||
void teardown_testcase (struct MHD_Daemon *d);
|
||||
|
||||
@@ -135,7 +134,8 @@ teardown_session (gnutls_session_t session,
|
||||
|
||||
int
|
||||
test_wrap (const char *test_name, int
|
||||
(*test_function) (void * cls, const char *cipher_suite,
|
||||
int proto_version), void *test_function_cls,
|
||||
(*test_function) (void * cls, int port, const char *cipher_suite,
|
||||
int proto_version), void * cls,
|
||||
int port,
|
||||
int daemon_flags, const char *cipher_suite, int proto_version, ...);
|
||||
#endif /* TLS_TEST_COMMON_H_ */
|
||||
Reference in new issue
Block a user