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(); }); }); }
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(); }); }); }