Skip to content

Commit 55355a6

Browse files
Merge pull request #399 from Pzixel/unspecified_socket_match_everything
Unspecified socket family matches any single IPAddress
2 parents d0096f6 + 9aa7b55 commit 55355a6

File tree

3 files changed

+44
-9
lines changed

3 files changed

+44
-9
lines changed

projects/client/RabbitMQ.Client/src/client/impl/TcpClientAdapter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ public virtual async Task ConnectAsync(string host, int port)
2626
{
2727
AssertSocket();
2828
var adds = await Dns.GetHostAddressesAsync(host).ConfigureAwait(false);
29-
var ep = adds.FirstOrDefault(a => a.AddressFamily == sock.AddressFamily);
30-
if(ep == default(IPAddress))
29+
var ep = TcpClientAdapterHelper.GetMatchingHost(adds, sock.AddressFamily);
30+
if (ep == default(IPAddress))
3131
{
3232
throw new ArgumentException("No ip address could be resolved for " + host);
3333
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Net;
4+
using System.Net.Sockets;
5+
6+
namespace RabbitMQ.Client
7+
{
8+
public static class TcpClientAdapterHelper
9+
{
10+
public static IPAddress GetMatchingHost(IReadOnlyCollection<IPAddress> addresses, AddressFamily addressFamily)
11+
{
12+
var ep = addresses.FirstOrDefault(a => a.AddressFamily == addressFamily);
13+
if (ep == null && addresses.Count == 1 && addressFamily == AddressFamily.Unspecified)
14+
{
15+
return addresses.Single();
16+
}
17+
return ep;
18+
}
19+
}
20+
}

projects/client/Unit/src/unit/TestTcpClientAdapter.cs

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040

4141
#if !NETFX_CORE
4242
using System;
43+
using System.Net;
4344
using System.Net.Sockets;
4445
using System.Threading;
4546
using NUnit.Framework;
@@ -52,14 +53,28 @@ namespace RabbitMQ.Client.Unit
5253
public class TestTcpClientAdapter
5354
{
5455
[Test]
55-
public void ConnectAsyncThrowsArgumentExceptionWhenNoAddressForAddressFamilyCanBeFound()
56+
public void TcpClientAdapterHelperGetMatchingHostReturnNoAddressIfFamilyDoesNotMatch()
5657
{
57-
var socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
58-
var sut = new TcpClientAdapter(socket);
59-
Assert.Throws<ArgumentException>(() =>
60-
{
61-
sut.ConnectAsync("localhost", 5672).GetAwaiter().GetResult();
62-
});
58+
var address = IPAddress.Parse("127.0.0.1");
59+
var matchingAddress = TcpClientAdapterHelper.GetMatchingHost(new[] { address }, AddressFamily.InterNetworkV6);
60+
Assert.IsNull(matchingAddress);
61+
}
62+
63+
[Test]
64+
public void TcpClientAdapterHelperGetMatchingHostReturnsSingleAddressIfFamilyIsUnspecified()
65+
{
66+
var address = IPAddress.Parse("1.1.1.1");
67+
var matchingAddress = TcpClientAdapterHelper.GetMatchingHost(new[] { address }, AddressFamily.Unspecified);
68+
Assert.AreEqual(address, matchingAddress);
69+
}
70+
71+
[Test]
72+
public void TcpClientAdapterHelperGetMatchingHostReturnNoAddressIfFamilyIsUnspecifiedAndThereIsNoSingleMatch()
73+
{
74+
var address = IPAddress.Parse("1.1.1.1");
75+
var address2 = IPAddress.Parse("2.2.2.2");
76+
var matchingAddress = TcpClientAdapterHelper.GetMatchingHost(new[] { address, address2 }, AddressFamily.Unspecified);
77+
Assert.IsNull(matchingAddress);
6378
}
6479
}
6580
}

0 commit comments

Comments
 (0)