/// <summary> /// Can be a list of single or comma separated values ips like [ "192.68.12.1", "172.53.22.11, 181.92.91.1, 193.92.91.1".. ] /// </summary> /// <param name="headerValues">all the extracted values from ip related headers</param> /// <param name="https">is a secure connection</param> /// <returns>return ip and port, may be null</returns> internal static IpInfo GetRealIpFromValues(IEnumerable <string> headerValues, bool https) { IpInfo privateIpInfo = null; foreach (var header in headerValues) { var values = header.Split(','); foreach (var potentialIp in values) { var consideredPotentialIp = potentialIp.Trim(); if (string.IsNullOrEmpty(consideredPotentialIp)) { continue; } var addressAndPort = ExtractAddressAndPort(consideredPotentialIp, defaultPort: DefaultPort(https)); consideredPotentialIp = addressAndPort.IpAddress; var success = IPAddress.TryParse(consideredPotentialIp, out var ipAddress); if (success) { if (ipAddress.IsIPv4MappedToIPv6) { ipAddress = ipAddress.MapToIPv4(); } if (IsIpInRange(ipAddress, _ipv4Cidrs) || ipAddress.IsIPv6SiteLocal || ipAddress.IsIPv6LinkLocal) { privateIpInfo = addressAndPort; } else { return(new IpInfo(ipAddress.ToString(), addressAndPort.Port)); } } } } return(privateIpInfo); }
public ExtractedHeadersAndIpInfos(IDictionary <string, string> headersToSend, IpInfo ipInfo) { HeadersToSend = headersToSend; IpInfo = ipInfo; }
internal static IpInfo ExtractIpAndPort(Func <string, string> getHeader, string customIpHeader, IEnumerable <string> customExtraHeaders, bool isSecureConnection, IpInfo peerIpFallback) { var ipPotentialValues = new List <string>(); if (!string.IsNullOrEmpty(customIpHeader)) { var value = getHeader(customIpHeader); if (!string.IsNullOrEmpty(value)) { ipPotentialValues.Add(getHeader(customIpHeader)); } } foreach (var headerIp in IpHeaders) { var potentialIp = getHeader(headerIp); if (!string.IsNullOrEmpty(potentialIp)) { ipPotentialValues.Add(potentialIp); } } var result = IpExtractor.GetRealIpFromValues(ipPotentialValues, isSecureConnection); return(result ?? peerIpFallback); }
public ExtractedHeadersAndIpInfos(IDictionary <string, string> headersToSend, string address, int port) { HeadersToSend = headersToSend; IpInfo = new IpInfo(address, port); }