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