From 7adca638bdacf84227d5e25e0c5774e3c09a74c6 Mon Sep 17 00:00:00 2001 From: Anirudh Agnihotry Date: Mon, 15 Jul 2019 14:13:30 -0700 Subject: [PATCH] Added client operation for posting form data (dotnet/corefx#39437) * added client operation for post data * client operation for multipart data content * remove the subset test Commit migrated from https://github.com/dotnet/corefx/commit/eee164d069f36ed4d8f850799bd6b9e414b2d23b --- .../tests/StressTests/HttpStress/Program.cs | 41 ++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Net.Http/tests/StressTests/HttpStress/Program.cs b/src/libraries/System.Net.Http/tests/StressTests/HttpStress/Program.cs index 96fbb2b..cd19c42 100644 --- a/src/libraries/System.Net.Http/tests/StressTests/HttpStress/Program.cs +++ b/src/libraries/System.Net.Http/tests/StressTests/HttpStress/Program.cs @@ -45,7 +45,7 @@ public class Program cmd.AddOption(new Option("-aspnetlog", "Enable ASP.NET warning and error logging.") { Argument = new Argument("enable", false) }); cmd.AddOption(new Option("-listOps", "List available options.") { Argument = new Argument("enable", false) }); cmd.AddOption(new Option("-seed", "Seed for generating pseudo-random parameters for a given -n argument.") { Argument = new Argument("seed", null)}); - cmd.AddOption(new Option("-p", "Max number of query parameters for a request.") { Argument = new Argument("queryParameters", 1) }); + cmd.AddOption(new Option("-numParameters", "Max number of query parameters or form fields for a request.") { Argument = new Argument("queryParameters", 1) }); ParseResult cmdline = cmd.Parse(args); if (cmdline.Errors.Count > 0) @@ -68,7 +68,7 @@ public class Program aspnetLog : cmdline.ValueForOption("-aspnetlog"), listOps : cmdline.ValueForOption("-listOps"), seed : cmdline.ValueForOption("-seed") ?? new Random().Next(), - numParameters : cmdline.ValueForOption("-p")); + numParameters : cmdline.ValueForOption("-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) @@ -255,6 +255,20 @@ public class Program } }), + ("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 => { @@ -636,6 +650,29 @@ public class Program 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); + } + /// Client context containing information pertaining to a single worker. private sealed class ClientContext { -- 2.7.4