private async Task TestStreamInterruption_Impl()
        {
            var logFactory = new TestLoggerFactory();

            using (CustomListenerHost.Start(app =>
            {
                SetupDefaultAppBuilder(app);
                app.SetLoggerFactory(logFactory);
            }, new NamedPipeListener(TestContext.TestName)))
            {
                var dialer = new NamedPipeDialer(TestContext.TestName);
                using (var fuzzyStream = await dialer.DialAsync(new HttpRequestMessage(), CancellationToken.None))
                {
                    // just write the first line of a valid http request, and drop the connection
                    var payload = Encoding.ASCII.GetBytes("GET /docs/index.html HTTP/1.0\n");
                    await fuzzyStream.WriteAsync(payload, 0, payload.Length);
                }
                var ex = await logFactory.ExceptionReceived.Task;
                Assert.IsInstanceOfType(ex, typeof(EndOfStreamException));

                // Test the stream still works afterwards
                var client = new HttpClient(new DialMessageHandler(dialer));
                var result = await client.PostAsJsonAsync("http://localhost/api/e2e-tests/hello", new PersonMessage { Name = "Test" });

                var wlcMsg = await result.Content.ReadAsAsync <WelcomeMessage>();

                Assert.AreEqual("Hello Test", wlcMsg.Text);
            }
        }
        private async Task TestBodyStream_Impl()
        {
            var listener = new NamedPipeListener(TestContext.TestName);
            var payload  = Encoding.UTF8.GetBytes("Hello world");
            await listener.StartAsync(con =>
            {
                Task.Run(async() =>
                {
                    try
                    {
                        await con.WriteAsync(payload, 0, payload.Length);
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine("... WriteAsync exception:" + e.Message);
                    }
                });
            }, CancellationToken.None);


            var dialer = new NamedPipeDialer(TestContext.TestName);
            var stream = await dialer.DialAsync(new HttpRequestMessage(), CancellationToken.None);

            var bodyStream = new BodyStream(stream, payload.Length);
            var data       = new byte[4096];
            var read       = await bodyStream.ReadAsync(data, 0, data.Length);

            Assert.AreEqual(payload.Length, read);
            read = await bodyStream.ReadAsync(data, 0, data.Length);

            Assert.AreEqual(0, read);

            // Clean up
            await listener.StopAsync(CancellationToken.None);
        }