public async Task Expect100Continue_WaitsExpectedPeriodOfTimeBeforeSendingContent()
        {
            await LoopbackServerFactory.CreateClientAndServerAsync(async uri =>
            {
                using (var handler = CreateHttpClientHandler())
                    using (var invoker = new HttpMessageInvoker(handler))
                    {
                        var socketsHandler = GetUnderlyingSocketsHttpHandler(handler);
                        TimeSpan delay     = TimeSpan.FromSeconds(3);
                        socketsHandler.Expect100ContinueTimeout = delay;

                        var tcs     = new TaskCompletionSource <bool>();
                        var content = new SetTcsContent(new MemoryStream(new byte[1]), tcs);
                        var request = new HttpRequestMessage(HttpMethod.Post, uri)
                        {
                            Content = content, Version = UseVersion
                        };
                        request.Headers.ExpectContinue = true;

                        long start = Environment.TickCount64;
                        (await invoker.SendAsync(TestAsync, request, default)).Dispose();
                        long elapsed = content.Ticks - start;
                        Assert.True(elapsed >= delay.TotalMilliseconds);
                    }
            }, async server =>
            {
                await server.AcceptConnectionAsync(async connection =>
                {
                    await connection.HandleRequestAsync();
                });
            });
        }
Пример #2
0
        public async Task Expect100Continue_WaitsExpectedPeriodOfTimeBeforeSendingContent()
        {
            await LoopbackServer.CreateClientAndServerAsync(async uri =>
            {
                using (var handler = new SocketsHttpHandler())
                    using (var invoker = new HttpMessageInvoker(handler))
                    {
                        TimeSpan delay = TimeSpan.FromSeconds(3);
                        handler.Expect100ContinueTimeout = delay;

                        var tcs     = new TaskCompletionSource <bool>();
                        var content = new SetTcsContent(new MemoryStream(new byte[1]), tcs);
                        var request = new HttpRequestMessage(HttpMethod.Post, uri)
                        {
                            Content = content, Version = UseVersion
                        };
                        request.Headers.ExpectContinue = true;

                        var sw = Stopwatch.StartNew();
                        (await invoker.SendAsync(TestAsync, request, default)).Dispose();
                        sw.Stop();

                        Assert.InRange(sw.Elapsed, delay - TimeSpan.FromSeconds(.5), delay * 20); // arbitrary wiggle room
                    }
            }, async server =>
            {
                await server.AcceptConnectionAsync(async connection =>
                {
                    await connection.ReadRequestHeaderAsync();
                    await connection.ReadAsync(new byte[1], 0, 1);
                    await connection.SendResponseAsync();
                });
            });
        }