This class can be used to discover the public address ranges for AWS. The information is retrieved from the publicly accessible https://ip-ranges.amazonaws.com/ip-ranges.json file.
The information in this file is generated from our internal system-of-record and is authoritative. You can expect it to change several times per week and should poll accordingly.
        /// <summary>
        /// Downloads the most recent copy of the endpoint address file and
        /// parses it to a collection of address range objects.
        /// </summary>
        public static AWSPublicIpAddressRanges Load(IWebProxy proxy)
        {
            const int maxDownloadRetries = 3;

            var retries = 0;

            while (retries < maxDownloadRetries)
            {
                try
                {
                    var content = AWSSDKUtils.DownloadStringContent(IpAddressRangeEndpoint, proxy);
                    AWSPublicIpAddressRanges instance = Parse(content);

                    return(instance);
                }
                catch (Exception e)
                {
                    retries++;
                    if (retries == maxDownloadRetries)
                    {
                        throw new AmazonServiceException(
                                  string.Format(CultureInfo.InvariantCulture,
                                                "Error downloading public IP address ranges file from {0}.", IpAddressRangeEndpoint),
                                  e);
                    }
                }

                var delay = (int)(Math.Pow(4, retries) * 100);
                delay = Math.Min(delay, 30 * 1000);
                AWSSDKUtils.Sleep(delay);
            }

            return(null);
        }
        private static AWSPublicIpAddressRanges Parse(string fileContent)
        {
            const string createDateKey = "createDate";
            const string prefixesKey   = "prefixes";
            const string ipPrefixKey   = "ip_prefix";
            const string regionKey     = "region";
            const string serviceKey    = "service";

            const string createDateFormatString = "yyyy-MM-dd-HH-mm-ss";

            try
            {
                var instance = new AWSPublicIpAddressRanges();

                var json = JsonMapper.ToObject(new JsonReader(fileContent));

                DateTime?creationDateTime = null;
                try
                {
                    var createdAt = (string)json[createDateKey];
                    creationDateTime = DateTime.ParseExact(createdAt, createDateFormatString, null);
                }
                catch (FormatException) { }
                catch (ArgumentNullException) { }

                instance.CreateDate = creationDateTime.GetValueOrDefault(DateTime.Now.ToUniversalTime());

                var parsedRanges = new List <AWSPublicIpAddressRange>();
                instance.AllAddressRanges = parsedRanges;

                var ranges = json[prefixesKey];
                if (!ranges.IsArray)
                {
                    throw new InvalidDataException("Expected array content for prefixes key.");
                }

                parsedRanges.AddRange(from JsonData range in ranges
                                      select new AWSPublicIpAddressRange
                {
                    IpPrefix = (string)range[ipPrefixKey],
                    Region   = (string)range[regionKey],
                    Service  = (string)range[serviceKey]
                });

                return(instance);
            }
            catch (Exception e)
            {
                throw new InvalidDataException("IP address ranges content in unexpected/invalid format.", e);
            }
        }
        private static AWSPublicIpAddressRanges Parse(string fileContent)
        {
            try
            {
                var instance = new AWSPublicIpAddressRanges();

                var json = JsonMapper.ToObject(new JsonReader(fileContent));

                DateTime?creationDateTime = null;
                try
                {
                    var createdAt = (string)json[createDateKey];
                    creationDateTime = DateTime.ParseExact(createdAt, createDateFormatString, null);
                }
                catch (FormatException)
                {
                }
                catch (ArgumentNullException)
                {
                }

#pragma warning disable CS0612 // Type or member is obsolete
                instance.CreateDate = creationDateTime.GetValueOrDefault(AWSSDKUtils.CorrectedUtcNow);
#pragma warning restore CS0612 // Type or member is obsolete

                // ipv4 and v6 addresses occupy different keys in the data file and can't easily be merged
                // so process each subset separately
                var parsedRanges = new List <AWSPublicIpAddressRange>();
                var ipv4Ranges   = json[ipv4PrefixesKey];
                var ipv6Ranges   = json[ipv6PrefixesKey];
                if (!ipv4Ranges.IsArray || !ipv6Ranges.IsArray)
                {
                    throw new InvalidDataException("Expected array content for ip_prefixes and/or ipv6_prefixes keys.");
                }

                parsedRanges.AddRange(ParseRange(ipv4Ranges, AWSPublicIpAddressRange.AddressFormat.Ipv4));
                parsedRanges.AddRange(ParseRange(ipv6Ranges, AWSPublicIpAddressRange.AddressFormat.Ipv6));

                instance.AllAddressRanges = parsedRanges;
                return(instance);
            }
            catch (Exception e)
            {
                throw new InvalidDataException("IP address ranges content in unexpected/invalid format.", e);
            }
        }
 private static AWSPublicIpAddressRanges Parse(string fileContent)
 {
     try
     {
         AWSPublicIpAddressRanges aWSPublicIpAddressRanges = new AWSPublicIpAddressRanges();
         JsonData jsonData = JsonMapper.ToObject(new JsonReader(fileContent));
         DateTime?dateTime = null;
         try
         {
             string s = (string)jsonData["createDate"];
             dateTime = DateTime.ParseExact(s, "yyyy-MM-dd-HH-mm-ss", null);
         }
         catch (FormatException)
         {
         }
         catch (ArgumentNullException)
         {
         }
         aWSPublicIpAddressRanges.CreateDate = dateTime.GetValueOrDefault(DateTime.Now.ToUniversalTime());
         List <AWSPublicIpAddressRange> list = new List <AWSPublicIpAddressRange>();
         JsonData jsonData2 = jsonData["prefixes"];
         JsonData jsonData3 = jsonData["ipv6_prefixes"];
         if (!jsonData2.IsArray || !jsonData3.IsArray)
         {
             throw new InvalidDataException("Expected array content for ip_prefixes and/or ipv6_prefixes keys.");
         }
         list.AddRange(ParseRange(jsonData2, AWSPublicIpAddressRange.AddressFormat.Ipv4));
         list.AddRange(ParseRange(jsonData3, AWSPublicIpAddressRange.AddressFormat.Ipv6));
         aWSPublicIpAddressRanges.AllAddressRanges = list;
         return(aWSPublicIpAddressRanges);
     }
     catch (Exception innerException)
     {
         throw new InvalidDataException("IP address ranges content in unexpected/invalid format.", innerException);
     }
 }
예제 #5
0
        private static AWSPublicIpAddressRanges Parse(string fileContent)
        {
            try
            {
                var instance = new AWSPublicIpAddressRanges();

                var json = JsonMapper.ToObject(new JsonReader(fileContent));

                DateTime? creationDateTime = null;
                try
                {
                    var createdAt = (string)json[createDateKey];
                    creationDateTime = DateTime.ParseExact(createdAt, createDateFormatString, null);
                }
                catch (FormatException) { }
                catch (ArgumentNullException) { }

                instance.CreateDate = creationDateTime.GetValueOrDefault(DateTime.Now.ToUniversalTime());

                // ipv4 and v6 addresses occupy different keys in the data file and can't easily be merged
                // so process each subset separately
                var parsedRanges = new List<AWSPublicIpAddressRange>();
                var ipv4Ranges = json[ipv4PrefixesKey];
                var ipv6Ranges = json[ipv6PrefixesKey];
                if (!ipv4Ranges.IsArray || !ipv6Ranges.IsArray)
                    throw new InvalidDataException("Expected array content for ip_prefixes and/or ipv6_prefixes keys.");

                parsedRanges.AddRange(ParseRange(ipv4Ranges, AWSPublicIpAddressRange.AddressFormat.Ipv4));
                parsedRanges.AddRange(ParseRange(ipv6Ranges, AWSPublicIpAddressRange.AddressFormat.Ipv6));

                instance.AllAddressRanges = parsedRanges;
                return instance;
            }
            catch (Exception e)
            {
                throw new InvalidDataException("IP address ranges content in unexpected/invalid format.", e);
            }
        }
        private static AWSPublicIpAddressRanges Parse(string fileContent)
        {
            const string createDateKey = "createDate";
            const string prefixesKey = "prefixes";
            const string ipPrefixKey = "ip_prefix";
            const string regionKey = "region";
            const string serviceKey = "service";

            const string createDateFormatString = "yyyy-MM-dd-HH-mm-ss";

            try
            {
                var instance = new AWSPublicIpAddressRanges();

                var json = JsonMapper.ToObject(new JsonReader(fileContent));

                DateTime? creationDateTime = null;
                try
                {
                    var createdAt = (string)json[createDateKey];
                    creationDateTime = DateTime.ParseExact(createdAt, createDateFormatString, null);
                }
                catch (FormatException) { }
                catch (ArgumentNullException) { }

                instance.CreateDate = creationDateTime.GetValueOrDefault(DateTime.Now.ToUniversalTime());

                var parsedRanges = new List<AWSPublicIpAddressRange>();
                instance.AllAddressRanges = parsedRanges;

                var ranges = json[prefixesKey];
                if (!ranges.IsArray)
                    throw new InvalidDataException("Expected array content for prefixes key.");

                parsedRanges.AddRange(from JsonData range in ranges
                    select new AWSPublicIpAddressRange
                    {
                        IpPrefix = (string)range[ipPrefixKey],
                        Region = (string)range[regionKey],
                        Service = (string)range[serviceKey]
                    });

                return instance;
            }
            catch (Exception e)
            {
                throw new InvalidDataException("IP address ranges content in unexpected/invalid format.", e);
            }
        }