Added client operation for posting form data (dotnet/corefx#39437)
authorAnirudh Agnihotry <anirudhagnihotry098@gmail.com>
Mon, 15 Jul 2019 21:13:30 +0000 (14:13 -0700)
committerGitHub <noreply@github.com>
Mon, 15 Jul 2019 21:13:30 +0000 (14:13 -0700)
* 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

src/libraries/System.Net.Http/tests/StressTests/HttpStress/Program.cs

index 96fbb2b..cd19c42 100644 (file)
@@ -45,7 +45,7 @@ public class Program
         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)
@@ -68,7 +68,7 @@ public class Program
             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)
@@ -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);
+    }
+
     /// <summary>Client context containing information pertaining to a single worker.</summary>
     private sealed class ClientContext
     {