mirror of https://github.com/Squidex/squidex.git
4 changed files with 176 additions and 34 deletions
@ -0,0 +1,42 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Collections.Generic; |
|||
using System.Net; |
|||
|
|||
namespace Squidex.Infrastructure |
|||
{ |
|||
public sealed class IPAddressComparer : IComparer<IPAddress> |
|||
{ |
|||
public static readonly IPAddressComparer Instance = new IPAddressComparer(); |
|||
|
|||
private IPAddressComparer() |
|||
{ |
|||
} |
|||
|
|||
public int Compare(IPAddress x, IPAddress y) |
|||
{ |
|||
var lbytes = x.GetAddressBytes(); |
|||
var rbytes = y.GetAddressBytes(); |
|||
|
|||
if (lbytes.Length != rbytes.Length) |
|||
{ |
|||
return lbytes.Length - rbytes.Length; |
|||
} |
|||
|
|||
for (var i = 0; i < lbytes.Length; i++) |
|||
{ |
|||
if (lbytes[i] != rbytes[i]) |
|||
{ |
|||
return lbytes[i] - rbytes[i]; |
|||
} |
|||
} |
|||
|
|||
return 0; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,45 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System; |
|||
using System.Linq; |
|||
using System.Net; |
|||
using System.Net.Sockets; |
|||
using System.Threading.Tasks; |
|||
using Squidex.Infrastructure; |
|||
|
|||
namespace Squidex.Config.Orleans |
|||
{ |
|||
public static class Helper |
|||
{ |
|||
internal static async Task<IPAddress> ResolveIPAddressAsync(string addressOrHost, AddressFamily family) |
|||
{ |
|||
var loopback = family == AddressFamily.InterNetwork ? IPAddress.Loopback : IPAddress.IPv6Loopback; |
|||
|
|||
if (addressOrHost.Equals("loopback", StringComparison.OrdinalIgnoreCase)) |
|||
{ |
|||
return loopback; |
|||
} |
|||
|
|||
if (IPAddress.TryParse(addressOrHost, out var address)) |
|||
{ |
|||
return address; |
|||
} |
|||
|
|||
var candidates = await Dns.GetHostAddressesAsync(addressOrHost); |
|||
|
|||
var chosen = candidates.OrderBy(x => x, IPAddressComparer.Instance).FirstOrDefault(); |
|||
|
|||
if (chosen == null) |
|||
{ |
|||
throw new ConfigurationException($"Hostname {addressOrHost} with family {family} is not a valid IP address or DNS name"); |
|||
} |
|||
|
|||
return chosen; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
// ==========================================================================
|
|||
// Squidex Headless CMS
|
|||
// ==========================================================================
|
|||
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|||
// All rights reserved. Licensed under the MIT license.
|
|||
// ==========================================================================
|
|||
|
|||
using System.Linq; |
|||
using System.Net; |
|||
using Xunit; |
|||
|
|||
namespace Squidex.Infrastructure |
|||
{ |
|||
public class IPAddressComparerTests |
|||
{ |
|||
[Fact] |
|||
public void Should_sort_ip_addresses() |
|||
{ |
|||
var source = new[] |
|||
{ |
|||
IPAddress.IPv6Loopback, |
|||
IPAddress.Parse("127.0.0.200"), |
|||
IPAddress.Parse("127.0.0.255"), |
|||
IPAddress.Parse("129.0.0.1"), |
|||
IPAddress.Parse("127.0.0.1"), |
|||
IPAddress.Parse("127.0.0.200"), |
|||
}; |
|||
|
|||
var sorted = source.OrderBy(x => x, IPAddressComparer.Instance); |
|||
|
|||
var expected = new[] |
|||
{ |
|||
IPAddress.Parse("127.0.0.1"), |
|||
IPAddress.Parse("127.0.0.200"), |
|||
IPAddress.Parse("127.0.0.200"), |
|||
IPAddress.Parse("127.0.0.255"), |
|||
IPAddress.Parse("129.0.0.1"), |
|||
IPAddress.IPv6Loopback, |
|||
}; |
|||
|
|||
Assert.Equal(expected, sorted); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue