internal TimeRestrictedMonitor(TimeoutUtils.TimeLeft timeLeft, TimeoutUtils.OnTimoutAction timoutAction)
 {
     this.timeLeft     = timeLeft;
     this.timoutAction = timoutAction;
     if (!timeLeft.Infinite && timeLeft.TimeMs < 0)
     {
         timoutAction();
     }
     this.watch = Stopwatch.StartNew();
 }
        internal static Uri ResolveActualClusterUri(Uri dataSourceUri, string asAzureServerName, AadTokenHolder aadTokenHolder, ref TimeoutUtils.TimeLeft timeLeft, TimeoutUtils.OnTimoutAction timeoutAction)
        {
            Uri uri = ASAzureUtility.ClustersCache.GetCluster(dataSourceUri, asAzureServerName);

            if (uri != null)
            {
                return(uri);
            }
            try
            {
                using (new TimeoutUtils.TimeRestrictedMonitor(timeLeft, timeoutAction))
                {
                    Uri uri2 = new UriBuilder(dataSourceUri)
                    {
                        Path = "/webapi/clusterResolve"
                    }.Uri;
                    ASAzureUtility.NameResolutionRequest requestObject = new ASAzureUtility.NameResolutionRequest
                    {
                        ServerName = asAzureServerName
                    };
                    ASAzureUtility.NameResolutionResult nameResolutionResult = ASAzureUtility.PostHttpJsonData <ASAzureUtility.NameResolutionRequest, ASAzureUtility.NameResolutionResult>(uri2, requestObject, aadTokenHolder.GetValidAccessToken(), timeLeft.TimeMs);
                    uri = new UriBuilder(dataSourceUri)
                    {
                        Host = nameResolutionResult.ClusterFqdn
                    }.Uri;
                    ASAzureUtility.ClustersCache.AddCluster(dataSourceUri, asAzureServerName, uri);
                }
            }
            catch (WebException ex)
            {
                ASAzureUtility.ThrowConnectionException(ex);
            }
            return(uri);
        }