/// <exception cref="InvalidArgumentException">Fail</exception> private static IEnumerable <IPAddress> GetRemoteIPAddresses(HttpContext httpContext) { var result = new List <IPAddress>(); if (httpContext.Connection.RemoteIpAddress != null) { result.Add(httpContext.Connection.RemoteIpAddress); } string?failed = null; if (httpContext.Request.Headers.TryGetValue("X-Forwarded-For", out var ipList) && ipList.Any()) { var ips = ipList.Select(x => x.Split(",")).SelectMany(x => x).Where(x => !string.IsNullOrWhiteSpace(x)); foreach (var ip in ips) { // ISSUE: .NET Core 5 has proper attributes for this pattern `when true than not null` then no warning, but with standard need to `!` if (CreyIPAddress.TryParse(ip, out var parsed)) { result.Add(parsed !); } else if (failed == null) { failed = string.Join(",", ips); } } } if (!result.Any() && failed != null) { throw new InvalidArgumentException($"Failed to parse IP from one of:'{failed}'"); } return(result); }
public void Parse() { IPAddress _; Assert.True(CreyIPAddress.TryParse("::ffff:10.65.0.11", out _)); Assert.Equal(_, IPAddress.Parse("10.65.0.11")); Assert.True(CreyIPAddress.TryParse("1fff:0:a88:85a3::ac1f:42", out _)); Assert.True(CreyIPAddress.TryParse("127.0.0.1", out _)); Assert.Equal(_, IPAddress.Parse("127.0.0.1")); Assert.True(CreyIPAddress.TryParse("127.0.0.1:42", out _)); Assert.Equal(_, IPAddress.Parse("127.0.0.1")); Assert.True(CreyIPAddress.TryParse(" 127.0.0.1 ", out _)); Assert.True(CreyIPAddress.TryParse(" 127.0.0.1:42 ", out _)); Assert.Equal(_, IPAddress.Parse("127.0.0.1")); Assert.True(CreyIPAddress.TryParse("1fff:0:a88:85a3::ac1f", out _)); Assert.Equal(_, IPAddress.Parse("1fff:0:a88:85a3::ac1f")); Assert.True(CreyIPAddress.TryParse("[1fff:0:a88:85a3::ac1f]", out _)); Assert.Equal(_, IPAddress.Parse("1fff:0:a88:85a3::ac1f")); Assert.True(CreyIPAddress.TryParse("fe80::1ff:fe23:4567:890a%3", out _)); Assert.True(CreyIPAddress.TryParse("[1fff:0:a88:85a3::ac1f]:42", out _)); Assert.Equal(_, IPAddress.Parse("1fff:0:a88:85a3::ac1f")); Assert.True(CreyIPAddress.TryParse(" [1fff:0:a88:85a3::ac1f]:42 ", out _)); Assert.Equal(_, IPAddress.Parse("1fff:0:a88:85a3::ac1f")); }
public void NotIsInternal() { Assert.False(CreyIPAddress.IsInternal(IPAddress.Parse("::ffff:169.253.0.0"))); Assert.False(CreyIPAddress.IsInternal(IPAddress.Parse("2001:db8::8a2e:370:7334"))); Assert.False(CreyIPAddress.IsInternal(IPAddress.Parse("169.253.0.0"))); Assert.False(CreyIPAddress.IsInternal(IPAddress.Parse("169.255.255.255"))); Assert.False(CreyIPAddress.IsInternal(IPAddress.Parse("ff62:7fa4:80e5:d0bd:ffff:ffff:ffff:ffff"))); }
public void IsInternal() { Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("::ffff:10.65.0.11"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("::1"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("10.0.0.0"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("10.255.255.255"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("127.0.0.0"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("127.255.255.255"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("172.16.0.0"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("172.31.255.255"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("192.168.0.0"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("192.168.255.255"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("fd12:3456:789a:1::1"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("169.254.0.0"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("169.254.255.255"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("fd80::"))); Assert.True(CreyIPAddress.IsInternal(IPAddress.Parse("10.65.1.37"))); }