Пример #1
0
        /// <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);
 }