cmd.AddOption(new Option("-aspnetlog", "Enable ASP.NET warning and error logging.") { Argument = new Argument<bool>("enable", false) });
cmd.AddOption(new Option("-listOps", "List available options.") { Argument = new Argument<bool>("enable", false) });
cmd.AddOption(new Option("-seed", "Seed for generating pseudo-random parameters for a given -n argument.") { Argument = new Argument<int?>("seed", null)});
- cmd.AddOption(new Option("-p", "Max number of query parameters for a request.") { Argument = new Argument<int>("queryParameters", 1) });
+ cmd.AddOption(new Option("-numParameters", "Max number of query parameters or form fields for a request.") { Argument = new Argument<int>("queryParameters", 1) });
ParseResult cmdline = cmd.Parse(args);
if (cmdline.Errors.Count > 0)
aspnetLog : cmdline.ValueForOption<bool>("-aspnetlog"),
listOps : cmdline.ValueForOption<bool>("-listOps"),
seed : cmdline.ValueForOption<int?>("-seed") ?? new Random().Next(),
- numParameters : cmdline.ValueForOption<int>("-p"));
+ numParameters : cmdline.ValueForOption<int>("-numParameters"));
}
private static void Run(int concurrentRequests, int maxContentLength, Version[] httpVersions, int? connectionLifetime, int[] opIndices, string logPath, bool aspnetLog, bool listOps, int seed, int numParameters)
}
}),
+ ("POST Multipart Data",
+ async ctx =>
+ {
+ (string expected, MultipartContent formDataContent) formData = GetMultipartContent(contentSource, ctx, numParameters);
+ Version httpVersion = ctx.GetRandomVersion(httpVersions);
+
+ using (var req = new HttpRequestMessage(HttpMethod.Post, serverUri) { Version = httpVersion, Content = formData.formDataContent })
+ using (HttpResponseMessage m = await ctx.HttpClient.SendAsync(req))
+ {
+ ValidateResponse(m, httpVersion);
+ ValidateContent($"{formData.expected}", await m.Content.ReadAsStringAsync());;
+ }
+ }),
+
("POST Duplex",
async ctx =>
{
return (queryString.ToString(), expectedString.ToString());
}
+ private static (string, MultipartContent) GetMultipartContent(string contentSource, ClientContext clientContext, int numFormFields)
+ {
+ var multipartContent = new MultipartContent("prefix" + clientContext.GetRandomSubstring(contentSource), "test_boundary");
+ StringBuilder sb = new StringBuilder();
+
+ int num = clientContext.GetRandomInt(numFormFields);
+
+ if (num == 0)
+ return ("--test_boundary\r\n\r\n--test_boundary--\r\n", multipartContent);
+
+ for (int i = 0; i < num; i++)
+ {
+ sb.Append("--test_boundary\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n");
+ string content = clientContext.GetRandomSubstring(contentSource);
+ sb.Append(content);
+ sb.Append("\r\n");
+ multipartContent.Add(new StringContent(content));
+ }
+
+ sb.Append("--test_boundary--\r\n");
+ return (sb.ToString(), multipartContent);
+ }
+
/// <summary>Client context containing information pertaining to a single worker.</summary>
private sealed class ClientContext
{