private static async Task Dispatch(IRequestContext ctx, Handler handler)
 {
     try
     {
         await handler(ctx).ConfigureAwait(false);
     }
     catch (Exception e)
     {
         ctx.SetStatus(500);
         await Handlers.BodyString("text/plain", "Internal error from test server: " + e.ToString())(ctx);
     };
 }
        public async Task BodyStringWithCharsetInHeader()
        {
            string body = "hello";

            await WithServerAndClient(Handlers.BodyString("text/weird", body, Encoding.UTF8), async (server, client) =>
            {
                var resp = await client.GetAsync(server.Uri);
                Assert.Equal(200, (int)resp.StatusCode);
                AssertHeader(resp, "content-type", "text/weird; charset=utf-8");
                Assert.Equal(body, await resp.Content.ReadAsStringAsync());
            });
        }
        public async Task ChainStatusAndHeadersAndBody()
        {
            var handler = Handlers.Status(201)
                          .Then(Handlers.Header("name1", "value1"))
                          .Then(Handlers.Header("name2", "value2"))
                          .Then(Handlers.BodyString("text/plain", "hello"));

            await WithServerAndClient(handler, async (server, client) =>
            {
                var resp = await client.GetAsync(server.Uri);
                Assert.Equal(201, (int)resp.StatusCode);
                AssertHeader(resp, "name1", "value1");
                AssertHeader(resp, "name2", "value2");
                AssertHeader(resp, "content-type", "text/plain");
                Assert.Equal("hello", await resp.Content.ReadAsStringAsync());
            });
        }
        public async Task ServerCanBeUsedAsFakeProxy()
        {
            var proxyResp = Handlers.Status(200).Then(Handlers.BodyString("text/plain", "hello"));

            using (var fakeProxy = HttpServer.Start(proxyResp))
            {
                var proxyParam = new WebProxy(fakeProxy.Uri);
                using (var client = new HttpClient(new HttpClientHandler {
                    Proxy = proxyParam
                }, true))
                {
                    var fakeTargetUri = new Uri("http://example/not/real");
                    var resp          = await client.GetAsync(fakeTargetUri);

                    Assert.Equal(200, (int)resp.StatusCode);
                    Assert.Equal("hello", await resp.Content.ReadAsStringAsync());

                    var request = fakeProxy.Recorder.RequireRequest();
                    Assert.Equal("GET", request.Method);
                    Assert.Equal(fakeTargetUri, request.Uri);
                    Assert.Equal("/not/real", request.Path);
                }
            }
        }