aliyun-net-sdk-core/Regions/Endpoints/EndpointResolve.cs (167 lines of code) (raw):

using System; using System.Collections.Generic; using System.Linq; using Aliyun.Acs.Core.Auth; using Aliyun.Acs.Core.Exceptions; using Aliyun.Acs.Core.Profile; using Aliyun.Acs.Core.Regions.Location; using Aliyun.Acs.Core.Utils; namespace Aliyun.Acs.Core.Regions.Endpoints { internal class EndpointResolve { private static List<Endpoint> _endpoints; private readonly IEndpointsProvider internalEndpointProvider; private readonly IEndpointsProvider remoteEndpointProvider; public EndpointResolve() { _endpoints = new List<Endpoint>(); internalEndpointProvider = new InternalEndpointsParser(); remoteEndpointProvider = new RemoteEndpointsParser(); } public List<Endpoint> Resolve(string product, string regionId, string serviceCode, string endpointType, Credential credential, LocationConfig locationConfig) { try { if (product == null) { return _endpoints; } if (_endpoints.FirstOrDefault(x => x.Name == product) != null) { var endpoint = internalEndpointProvider.GetEndpoint(regionId, product); if (serviceCode != null && endpoint == null) { endpoint = remoteEndpointProvider.GetEndpoint(regionId, product, serviceCode, endpointType, credential, locationConfig); } if (endpoint != null) { foreach (var region in endpoint.RegionIds) { foreach (var productDomain in endpoint.ProductDomains.ToList()) { AddEndpoint(endpoint.Name, region, product, productDomain.DomainName); CacheTimeHelper.AddLastClearTimePerProduct(product, region, DateTime.UtcNow); } } } else { throw new ClientException("SDK.InvalidRegionId", "Can not find endpoint to access."); } } else if (Endpoint.FindProductDomain(regionId, product, _endpoints) == null || CacheTimeHelper.CheckCacheIsExpire(product, regionId)) { var endpoint = internalEndpointProvider.GetEndpoint(regionId, product); if (serviceCode != null && endpoint == null) { endpoint = remoteEndpointProvider.GetEndpoint(regionId, product, serviceCode, endpointType, credential, locationConfig); } if (endpoint != null) { foreach (var region in endpoint.RegionIds) { foreach (var productDomain in endpoint.ProductDomains.ToList()) { AddEndpoint(endpoint.Name, region, product, productDomain.DomainName); CacheTimeHelper.AddLastClearTimePerProduct(product, region, DateTime.UtcNow); } } } } } catch (ClientException ex) { CommonLog.LogException(ex, ex.ErrorCode, ex.ErrorMessage); throw new ClientException(ex.ErrorCode, ex.ErrorMessage); } return _endpoints; } public void AddEndpoint(string endpointName, string regionId, string product, string domain, bool isNeverExpire = false) { if (0 == _endpoints.Count) { _endpoints = GetEndpoints(regionId, product); } var endpoint = FindEndpointByRegionId(regionId); if (null == endpoint) { var regions = new HashSet<string> { regionId }; var productDomains = new List<ProductDomain> { new ProductDomain(product, domain) }; endpoint = new Endpoint(endpointName, regions, productDomains); if (_endpoints == null) { _endpoints = new List<Endpoint>(); } _endpoints.Add(endpoint); } else { UpdateEndpoint(regionId, product, domain, endpoint); } if (isNeverExpire) { var date = DateTime.UtcNow.AddYears(100); CacheTimeHelper.AddLastClearTimePerProduct(product, regionId, date); } } private static Endpoint FindEndpointByRegionId(string regionId) { if (0 == _endpoints.Count) { return null; } foreach (var endpoint in _endpoints.ToList()) { if (endpoint.RegionIds.Contains(regionId)) { return endpoint; } } return null; } public List<Endpoint> GetEndpoints(string regionId, string product) { if (null == _endpoints) { var endpoint = internalEndpointProvider.GetEndpoint(regionId, product); if (endpoint != null) { _endpoints = new List<Endpoint> { endpoint }; } } return _endpoints; } private static void UpdateEndpoint(string regionId, string product, string domain, Endpoint endpoint) { var regionIds = endpoint.RegionIds; regionIds.Add(regionId); var productDomains = endpoint.ProductDomains; var productDomain = FindProductDomain(productDomains, product); if (null == productDomain) { productDomains.Add(new ProductDomain(product, domain)); } else { productDomain.DomainName = domain; } } private static ProductDomain FindProductDomain(List<ProductDomain> productDomains, string product) { foreach (var productDomain in productDomains.ToList()) { if (productDomain.ProductName.Equals(product)) { return productDomain; } } return null; } } }