From 556fd41f04a10b63d4609a9608963ea341200eb8 Mon Sep 17 00:00:00 2001 From: Jacob Marks Date: Sat, 29 Jul 2023 18:39:57 +1000 Subject: [PATCH] fix: Do not dispose a custom HTTP message handler in an HTTP wait strategy (#958) --- .../WaitStrategies/HttpWaitStrategy.cs | 4 ++-- .../WaitUntilHttpRequestIsSucceededTest.cs | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/Testcontainers/Configurations/WaitStrategies/HttpWaitStrategy.cs b/src/Testcontainers/Configurations/WaitStrategies/HttpWaitStrategy.cs index c0b440642..e3da1f117 100644 --- a/src/Testcontainers/Configurations/WaitStrategies/HttpWaitStrategy.cs +++ b/src/Testcontainers/Configurations/WaitStrategies/HttpWaitStrategy.cs @@ -66,7 +66,7 @@ public async Task UntilAsync(IContainer container) return false; } - using (var httpClient = new HttpClient(_httpMessageHandler ?? new HttpClientHandler())) + using (var httpClient = new HttpClient(_httpMessageHandler ?? new HttpClientHandler(), disposeHandler: _httpMessageHandler == null)) { using (var httpRequestMessage = new HttpRequestMessage(_httpMethod, new UriBuilder(_schemeName, host, port, _pathValue).Uri)) { @@ -82,7 +82,7 @@ public async Task UntilAsync(IContainer container) httpResponseMessage = await httpClient.SendAsync(httpRequestMessage) .ConfigureAwait(false); } - catch + catch (HttpRequestException) { return false; } diff --git a/tests/Testcontainers.Tests/Unit/Configurations/WaitUntilHttpRequestIsSucceededTest.cs b/tests/Testcontainers.Tests/Unit/Configurations/WaitUntilHttpRequestIsSucceededTest.cs index ea6c03f9b..33cc395fb 100644 --- a/tests/Testcontainers.Tests/Unit/Configurations/WaitUntilHttpRequestIsSucceededTest.cs +++ b/tests/Testcontainers.Tests/Unit/Configurations/WaitUntilHttpRequestIsSucceededTest.cs @@ -19,7 +19,7 @@ public sealed class WaitUntilHttpRequestIsSucceededTest : IAsyncLifetime private readonly IContainer _container = new ContainerBuilder() .WithImage(CommonImages.Alpine) .WithEntrypoint("/bin/sh", "-c") - .WithCommand($"echo \"HTTP/1.1 200 OK\r\n\" | nc -l -p {HttpPort}") + .WithCommand($"while true; do echo \"HTTP/1.1 200 OK\r\n\" | nc -l -p {HttpPort}; done") .WithPortBinding(HttpPort, true) .Build(); @@ -110,5 +110,22 @@ await Task.Delay(TimeSpan.FromSeconds(1)) Assert.Contains("Cookie", stdout); Assert.Contains("Key1=Value1", stdout); } + + [Fact] + public async Task HttpWaitStrategyCanReuseCustomHttpClientHandler() + { + // Given + var httpWaitStrategy = new HttpWaitStrategy().UsingHttpMessageHandler(new HttpClientHandler()); + + // When + await httpWaitStrategy.UntilAsync(_container) + .ConfigureAwait(false); + + var exceptionOnSubsequentCall = await Record.ExceptionAsync(() => httpWaitStrategy.UntilAsync(_container)) + .ConfigureAwait(false); + + // Then + Assert.Null(exceptionOnSubsequentCall); + } } }