private async Task <string> GetImdsUriApiVersionAsync(ICoreLogger logger, Dictionary <string, string> headers) { Uri imdsErrorUri = new Uri(ImdsEndpoint); HttpResponse response = await _httpManager.SendGetAsync(imdsErrorUri, headers, logger).ConfigureAwait(false); // When IMDS endpoint is called without the api version query param, bad request response comes back with latest version. if (response.StatusCode == HttpStatusCode.BadRequest) { LocalImdsErrorResponse errorResponse = JsonHelper.DeserializeFromJson <LocalImdsErrorResponse>(response.Body); if (errorResponse != null && !errorResponse.NewestVersions.IsNullOrEmpty()) { logger.Info("[Region discovery] Updated the version for IMDS endpoint to: " + errorResponse.NewestVersions[0]); return(errorResponse.NewestVersions[0]); } logger.Info("[Region Discovery] The response is empty or does not contain the newest versions."); } logger.Info($"[Region Discovery] Failed to get the updated version for IMDS endpoint. HttpStatusCode: {response.StatusCode}"); throw MsalServiceExceptionFactory.FromImdsResponse( MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailed, response); }
private async Task <string> GetRegionAsync(RequestContext requestContext) { string region = Environment.GetEnvironmentVariable(RegionName); if (!string.IsNullOrEmpty(region)) { requestContext.Logger.Info($"[Region discovery] Region found in environment variable: {region}."); LogTelemetryData(region, RegionSource.EnvVariable, requestContext); return(region); } try { var headers = new Dictionary <string, string> { { "Metadata", "true" } }; HttpResponse response = await _httpManager.SendGetAsync(BuildImdsUri(DefaultApiVersion), headers, requestContext.Logger, retry : false, GetCancellationToken(requestContext.UserCancellationToken)).ConfigureAwait(false); // A bad request occurs when the version in the IMDS call is no longer supported. if (response.StatusCode == HttpStatusCode.BadRequest) { string apiVersion = await GetImdsUriApiVersionAsync(requestContext.Logger, headers, requestContext.UserCancellationToken).ConfigureAwait(false); // Get the latest version response = await _httpManager.SendGetAsync(BuildImdsUri(apiVersion), headers, requestContext.Logger, retry : false, GetCancellationToken(requestContext.UserCancellationToken)).ConfigureAwait(false); // Call again with updated version } if (response.StatusCode == HttpStatusCode.OK && !response.Body.IsNullOrEmpty()) { region = response.Body; LogTelemetryData(region, RegionSource.Imds, requestContext); return(region); } requestContext.Logger.Info($"[Region discovery] Call to local IMDS failed with status code: {response.StatusCode} or an empty response."); throw MsalServiceExceptionFactory.FromImdsResponse( MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailed, response); } catch (MsalServiceException e) { if (MsalError.RequestTimeout.Equals(e.ErrorCode)) { throw new MsalServiceException(MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailedWithTimeout, e); } throw e; } catch (Exception e) { requestContext.Logger.Info("[Region discovery] Call to local IMDS failed. " + e); throw new MsalServiceException(MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailed, e); } }
private async Task <string> GetRegionAsync(RequestContext requestContext) { ICoreLogger logger = requestContext.Logger; string region = Environment.GetEnvironmentVariable(RegionName); if (!string.IsNullOrEmpty(region)) { logger.Info($"[Region discovery] Region found in environment variable: {region}."); LogTelemetryData(region, RegionSource.EnvVariable, requestContext); return(region); } try { var headers = new Dictionary <string, string> { { "Metadata", "true" } }; HttpResponse response = await _httpManager.SendGetAsync(BuildImdsUri(DefaultApiVersion), headers, logger).ConfigureAwait(false); // A bad request occurs when the version in the IMDS call is no longer supported. if (response.StatusCode == HttpStatusCode.BadRequest) { string apiVersion = await GetImdsUriApiVersionAsync(logger, headers).ConfigureAwait(false); // Get the latest version response = await _httpManager.SendGetAsync(BuildImdsUri(apiVersion), headers, logger).ConfigureAwait(false); // Call again with updated version } if (response.StatusCode == HttpStatusCode.OK && !response.Body.IsNullOrEmpty()) { LocalImdsResponse localImdsResponse = JsonHelper.DeserializeFromJson <LocalImdsResponse>(response.Body); if (localImdsResponse != null && !localImdsResponse.location.IsNullOrEmpty()) { logger.Info($"[Region discovery] Call to local IMDS returned region: {localImdsResponse.location}"); LogTelemetryData(localImdsResponse.location, RegionSource.Imds, requestContext); return(localImdsResponse.location); } } logger.Info($"[Region discovery] Call to local IMDS failed with status code: {response.StatusCode} or an empty response."); throw MsalServiceExceptionFactory.FromImdsResponse( MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailed, response); } catch (MsalServiceException) { throw; } catch (Exception e) { logger.Info("[Region discovery] Call to local imds failed." + e.Message); throw new MsalServiceException(MsalError.RegionDiscoveryFailed, MsalErrorMessage.RegionDiscoveryFailed); } }