diff --git a/src/Docker.DotNet/Microsoft.Net.Http.Client/ManagedHandler.cs b/src/Docker.DotNet/Microsoft.Net.Http.Client/ManagedHandler.cs index 6d92f6c0..f8aab940 100644 --- a/src/Docker.DotNet/Microsoft.Net.Http.Client/ManagedHandler.cs +++ b/src/Docker.DotNet/Microsoft.Net.Http.Client/ManagedHandler.cs @@ -332,7 +332,19 @@ private static async Task TCPSocketOpenerAsync(string host, int port, Ca var s = new Socket(address.AddressFamily, SocketType.Stream, ProtocolType.Tcp); try { - await s.ConnectAsync(address, port).ConfigureAwait(false); +#if (NETSTANDARD1_3 || NETSTANDARD1_6 || NETSTANDARD2_0) + // TODO: This method can be replaced by native ConnectAsync when this functionality is available: + // https://github.com/dotnet/runtime/pull/40750 + await s.ConnectAsync(address, port, cancellationToken).ConfigureAwait(false); +#else + await Task.Factory.FromAsync( + s.BeginConnect, + s.EndConnect, + new IPEndPoint(address, port), + null + ).ConfigureAwait(false); +#endif + connectedSocket = s; break; } diff --git a/src/Docker.DotNet/Microsoft.Net.Http.Client/SocketExtensionMethods.cs b/src/Docker.DotNet/Microsoft.Net.Http.Client/SocketExtensionMethods.cs new file mode 100644 index 00000000..0e921f4a --- /dev/null +++ b/src/Docker.DotNet/Microsoft.Net.Http.Client/SocketExtensionMethods.cs @@ -0,0 +1,18 @@ +using System.Net; +using System.Net.Sockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Net.Http.Client +{ + public static class SocketExtensionMethods + { + public static async Task ConnectAsync(this Socket socket, IPAddress address, int port, CancellationToken cancellationToken) + { + Task socketConnectTask = socket.ConnectAsync(address, port); + Task delayTask = Task.Delay(int.MaxValue, cancellationToken); + + await await Task.WhenAny(socketConnectTask, delayTask); + } + } +}