@@ -45,6 +45,7 @@ namespace RabbitMQ.Client.Impl
45
45
internal sealed class SocketFrameHandler : IFrameHandler
46
46
{
47
47
private readonly AmqpTcpEndpoint _amqpTcpEndpoint ;
48
+ private readonly IPAddress [ ] _amqpTcpEndpointAddresses ;
48
49
private readonly Func < AddressFamily , ITcpClient > _socketFactory ;
49
50
private readonly TimeSpan _connectionTimeout ;
50
51
@@ -74,6 +75,15 @@ public SocketFrameHandler(AmqpTcpEndpoint amqpTcpEndpoint,
74
75
_readTimeout = readTimeout ;
75
76
_writeTimeout = writeTimeout ;
76
77
78
+ /*
79
+ * Resolve the hostname early to validate.
80
+ * Used by SelectOne in EndpointResolverExtensions, which catches the thrown exception
81
+ * if the hostname does not resolve. It's set up this way so that CreateFrameHandler captures
82
+ * various configuration values when selecting a SocketFrameHandler for the Connection to use.
83
+ * TODO this is not ideal, because it does not allow using Dns.GetHostAddressesAsync
84
+ */
85
+ _amqpTcpEndpointAddresses = Dns . GetHostAddresses ( _amqpTcpEndpoint . HostName ) ;
86
+
77
87
var channel = Channel . CreateBounded < RentedMemory > (
78
88
new BoundedChannelOptions ( 128 )
79
89
{
@@ -138,11 +148,8 @@ public TimeSpan WriteTimeout
138
148
139
149
public async Task ConnectAsync ( CancellationToken cancellationToken )
140
150
{
141
- // Resolve the hostname to know if it's even possible to even try IPv6
142
151
// TODO cancellation token
143
- IPAddress [ ] adds = await Dns . GetHostAddressesAsync ( _amqpTcpEndpoint . HostName )
144
- . ConfigureAwait ( false ) ;
145
- IPAddress ipv6 = TcpClientAdapter . GetMatchingHost ( adds , AddressFamily . InterNetworkV6 ) ;
152
+ IPAddress ipv6 = TcpClientAdapter . GetMatchingHost ( _amqpTcpEndpointAddresses , AddressFamily . InterNetworkV6 ) ;
146
153
147
154
if ( ipv6 == default ( IPAddress ) )
148
155
{
@@ -168,7 +175,7 @@ public async Task ConnectAsync(CancellationToken cancellationToken)
168
175
169
176
if ( _socket is null )
170
177
{
171
- IPAddress ipv4 = TcpClientAdapter . GetMatchingHost ( adds , AddressFamily . InterNetwork ) ;
178
+ IPAddress ipv4 = TcpClientAdapter . GetMatchingHost ( _amqpTcpEndpointAddresses , AddressFamily . InterNetwork ) ;
172
179
if ( ipv4 == default ( IPAddress ) )
173
180
{
174
181
throw new ConnectFailureException ( "Connection failed" , new ArgumentException ( $ "No ip address could be resolved for { _amqpTcpEndpoint . HostName } ") ) ;
0 commit comments