mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-25 04:09:31 +03:00
perf_replies: backported larger replies
This commit is contained in:
+207
-9
@@ -331,8 +331,10 @@ show_help (void)
|
||||
printf ("Response body size options (mutually exclusive):\n");
|
||||
printf (" -E, --empty empty response, 0 bytes\n");
|
||||
printf (" -T, --tiny tiny response, 3 bytes (default)\n");
|
||||
printf (" -M, --medium medium response, 8 KB\n");
|
||||
printf (" -L, --large large response, 1 MB\n");
|
||||
printf (" -M, --medium medium response, 8 KiB\n");
|
||||
printf (" -L, --large large response, 1 MiB\n");
|
||||
printf (" -X, --xlarge extra large response, 8 MiB\n");
|
||||
printf (" -J, --jumbo jumbo response, 101 MiB\n");
|
||||
printf ("\n");
|
||||
printf ("Response use options (mutually exclusive):\n");
|
||||
printf (" -S, --shared pool of pre-generated shared response\n"
|
||||
@@ -370,6 +372,8 @@ struct PerfRepl_parameters
|
||||
int tiny;
|
||||
int medium;
|
||||
int large;
|
||||
int xlarge;
|
||||
int jumbo;
|
||||
int shared;
|
||||
int single;
|
||||
int unique;
|
||||
@@ -399,6 +403,8 @@ static struct PerfRepl_parameters tool_params = {
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
};
|
||||
|
||||
@@ -573,6 +579,18 @@ process_param__empty (const char *param_name)
|
||||
"with '-L' or '--large'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.xlarge)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-X' or '--xlarge'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.jumbo)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-J' or '--jumbo'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.empty = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
@@ -600,6 +618,18 @@ process_param__tiny (const char *param_name)
|
||||
"with '-L' or '--large'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.xlarge)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-X' or '--xlarge'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.jumbo)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-J' or '--jumbo'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.tiny = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
@@ -627,6 +657,18 @@ process_param__medium (const char *param_name)
|
||||
"with '-L' or '--large'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.xlarge)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-X' or '--xlarge'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.jumbo)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-J' or '--jumbo'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.medium = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
@@ -654,12 +696,102 @@ process_param__large (const char *param_name)
|
||||
"with '-M' or '--medium'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.xlarge)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-X' or '--xlarge'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.jumbo)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-J' or '--jumbo'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.large = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
}
|
||||
|
||||
|
||||
static enum PerfRepl_param_result
|
||||
process_param__xlarge (const char *param_name)
|
||||
{
|
||||
if (tool_params.empty)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-E' or '--empty'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.tiny)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-T' or '--tiny'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.medium)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-M' or '--medium'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.large)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-L' or '--large'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.jumbo)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-J' or '--jumbo'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.xlarge = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
}
|
||||
|
||||
|
||||
static enum PerfRepl_param_result
|
||||
process_param__jumbo (const char *param_name)
|
||||
{
|
||||
if (tool_params.empty)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-E' or '--empty'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.tiny)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-T' or '--tiny'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.medium)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-M' or '--medium'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.large)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-L' or '--large'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
if (tool_params.xlarge)
|
||||
{
|
||||
fprintf (stderr, "Parameter '%s' cannot be used together "
|
||||
"with '-X' or '--xlarge'.\n", param_name);
|
||||
return PERF_RPL_PARAM_ERROR;
|
||||
}
|
||||
tool_params.jumbo = ! 0;
|
||||
return '-' == param_name[1] ?
|
||||
PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
|
||||
}
|
||||
|
||||
|
||||
static enum PerfRepl_param_result
|
||||
process_param__shared (const char *param_name)
|
||||
{
|
||||
@@ -844,6 +976,10 @@ process_short_param (const char *param, const char *next_param)
|
||||
return process_param__medium ("-M");
|
||||
else if ('L' == param_chr)
|
||||
return process_param__large ("-L");
|
||||
else if ('X' == param_chr)
|
||||
return process_param__xlarge ("-X");
|
||||
else if ('J' == param_chr)
|
||||
return process_param__jumbo ("-J");
|
||||
else if ('S' == param_chr)
|
||||
return process_param__shared ("-S");
|
||||
else if ('I' == param_chr)
|
||||
@@ -934,6 +1070,12 @@ process_long_param (const char *param, const char *next_param)
|
||||
else if ((MHD_STATICSTR_LEN_ ("large") == param_len) &&
|
||||
(0 == memcmp (param, "large", MHD_STATICSTR_LEN_ ("large"))))
|
||||
return process_param__large ("--large");
|
||||
else if ((MHD_STATICSTR_LEN_ ("xlarge") == param_len) &&
|
||||
(0 == memcmp (param, "xlarge", MHD_STATICSTR_LEN_ ("xlarge"))))
|
||||
return process_param__xlarge ("--xlarge");
|
||||
else if ((MHD_STATICSTR_LEN_ ("jumbo") == param_len) &&
|
||||
(0 == memcmp (param, "jumbo", MHD_STATICSTR_LEN_ ("jumbo"))))
|
||||
return process_param__jumbo ("--jumbo");
|
||||
else if ((MHD_STATICSTR_LEN_ ("shared") == param_len) &&
|
||||
(0 == memcmp (param, "shared", MHD_STATICSTR_LEN_ ("shared"))))
|
||||
return process_param__shared ("--shared");
|
||||
@@ -1172,10 +1314,10 @@ check_param__poll (void)
|
||||
|
||||
|
||||
static void
|
||||
check_param__empty_tiny_medium_large (void)
|
||||
check_param__empty_tiny_medium_large_xlarge_jumbo (void)
|
||||
{
|
||||
if (0 == (tool_params.empty | tool_params.tiny | tool_params.medium
|
||||
| tool_params.large))
|
||||
| tool_params.large | tool_params.xlarge | tool_params.jumbo))
|
||||
tool_params.tiny = ! 0;
|
||||
}
|
||||
|
||||
@@ -1235,7 +1377,7 @@ check_apply_params (void)
|
||||
return PERF_RPL_ERR_CODE_BAD_PARAM;
|
||||
if (! check_param__poll ())
|
||||
return PERF_RPL_ERR_CODE_BAD_PARAM;
|
||||
check_param__empty_tiny_medium_large ();
|
||||
check_param__empty_tiny_medium_large_xlarge_jumbo ();
|
||||
check_param__shared_single_unique ();
|
||||
if (! check_param__connections ())
|
||||
return PERF_RPL_ERR_CODE_BAD_PARAM;
|
||||
@@ -1243,6 +1385,29 @@ check_apply_params (void)
|
||||
}
|
||||
|
||||
|
||||
static uint64_t
|
||||
mini_rnd (void)
|
||||
{
|
||||
/* Simple xoshiro256+ implementation */
|
||||
static uint64_t s[4] = {
|
||||
0xE220A8397B1DCDAFuLL, 0x6E789E6AA1B965F4uLL,
|
||||
0x06C45D188009454FuLL, 0xF88BB8A8724C81ECuLL
|
||||
}; /* Good enough for static initialisation */
|
||||
|
||||
const uint64_t ret = s[0] + s[3];
|
||||
const uint64_t t = s[1] << 17;
|
||||
|
||||
s[2] ^= s[0];
|
||||
s[3] ^= s[1];
|
||||
s[1] ^= s[2];
|
||||
s[0] ^= s[3];
|
||||
s[2] ^= t;
|
||||
s[3] = ((s[3] << 45u) | (s[3] >> (64u - 45u)));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* The pool of shared responses */
|
||||
static struct MHD_Response **resps = NULL;
|
||||
static unsigned int num_resps = 0;
|
||||
@@ -1267,7 +1432,7 @@ init_response_body_data (void)
|
||||
fprintf (stderr, "Failed to allocate memory.\n");
|
||||
return 0;
|
||||
}
|
||||
if (tool_params.medium)
|
||||
if (16u * 1024u >= body_dyn_size)
|
||||
{
|
||||
/* Fill the body with HTML-like content */
|
||||
size_t pos;
|
||||
@@ -1295,7 +1460,7 @@ init_response_body_data (void)
|
||||
pos += filler_pos;
|
||||
memcpy (body_dyn + pos, body_footer, MHD_STATICSTR_LEN_ (body_footer));
|
||||
}
|
||||
else
|
||||
else if (2u * 1024u * 1024u >= body_dyn_size)
|
||||
{
|
||||
/* Fill the body with binary-like content */
|
||||
size_t pos;
|
||||
@@ -1304,6 +1469,31 @@ init_response_body_data (void)
|
||||
body_dyn[pos] = (char) (unsigned char) (255U - pos % 256U);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Fill the body with pseudo-random binary-like content */
|
||||
size_t pos;
|
||||
uint64_t rnd_data;
|
||||
for (pos = 0; pos < body_dyn_size - body_dyn_size % 8;
|
||||
pos += 8)
|
||||
{
|
||||
rnd_data = mini_rnd ();
|
||||
body_dyn[pos + 0] = (char) (unsigned char) (rnd_data >> 0);
|
||||
body_dyn[pos + 1] = (char) (unsigned char) (rnd_data >> 8);
|
||||
body_dyn[pos + 2] = (char) (unsigned char) (rnd_data >> 16);
|
||||
body_dyn[pos + 3] = (char) (unsigned char) (rnd_data >> 24);
|
||||
body_dyn[pos + 4] = (char) (unsigned char) (rnd_data >> 32);
|
||||
body_dyn[pos + 5] = (char) (unsigned char) (rnd_data >> 40);
|
||||
body_dyn[pos + 6] = (char) (unsigned char) (rnd_data >> 48);
|
||||
body_dyn[pos + 7] = (char) (unsigned char) (rnd_data >> 56);
|
||||
}
|
||||
rnd_data = mini_rnd ();
|
||||
for ((void) pos; pos < body_dyn_size; ++pos)
|
||||
{
|
||||
body_dyn[pos] = (char) (unsigned char) (rnd_data);
|
||||
rnd_data >>= 8u;
|
||||
}
|
||||
}
|
||||
}
|
||||
return ! 0;
|
||||
}
|
||||
@@ -1348,6 +1538,10 @@ init_data (void)
|
||||
body_dyn_size = 8U * 1024U;
|
||||
else if (tool_params.large)
|
||||
body_dyn_size = 1024U * 1024U;
|
||||
else if (tool_params.xlarge)
|
||||
body_dyn_size = 8U * 1024U * 1024U;
|
||||
else if (tool_params.jumbo)
|
||||
body_dyn_size = 101U * 1024U * 1024U;
|
||||
else
|
||||
body_dyn_size = 0;
|
||||
|
||||
@@ -1686,9 +1880,13 @@ get_mhd_response_size (void)
|
||||
else if (tool_params.tiny)
|
||||
return "3 bytes (tiny)";
|
||||
else if (tool_params.medium)
|
||||
return "8 KB (medium)";
|
||||
return "8 KiB (medium)";
|
||||
else if (tool_params.large)
|
||||
return "1 MB (large)";
|
||||
return "1 MiB (large)";
|
||||
else if (tool_params.xlarge)
|
||||
return "8 MiB (xlarge)";
|
||||
else if (tool_params.jumbo)
|
||||
return "101 MiB (jumbo)";
|
||||
return "!!internal error!!";
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user