public async Task GetContentWhenRegionReturnsRedirectResponseThenFollowRedirect()
        {
            var redirectHttpResponse = new HttpResponseMessage
            {
                StatusCode = HttpStatusCode.Redirect,
                Content    = new StringContent(DummyChildAppContent),
            };

            redirectHttpResponse.Headers.Location = new Uri("http://SomeLocation");

            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Returns(redirectHttpResponse);

            var fakeRedirectHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            var redirectHttpClient             = new HttpClient(fakeRedirectHttpMessageHandler)
            {
                BaseAddress = new Uri("http://SomeRegionBaseAddress"),
            };

            var model = new RegionModel
            {
                IsHealthy = true,
            };

            var service = new ContentRetriever(redirectHttpClient, logger, appRegistryDataService, httpResponseMessageHandler, markupMessages);

            await service.GetContent("someUrl", "path", model, true, "baseUrl").ConfigureAwait(false);

            A.CallTo(() => httpResponseMessageHandler.Process(null)).MustHaveHappened();

            fakeRedirectHttpMessageHandler.Dispose();
            redirectHttpResponse.Dispose();
            redirectHttpClient.Dispose();
        }
        private async Task <string> GetContent_WithoutCaching(string url, string path, RegionModel regionModel, bool followRedirects, string requestBaseUrl, IHeaderDictionary headers)
        {
            const int MaxRedirections = 10;

            _ = regionModel ?? throw new ArgumentNullException(nameof(regionModel));

            string results = null;

            try
            {
                if (regionModel.IsHealthy)
                {
                    logger.LogInformation($"{nameof(GetContent)}: Getting child response from: {url}");

                    var response = await GetContentIfRedirectedAsync(requestBaseUrl, url, followRedirects, MaxRedirections, regionModel, headers);

                    if (response != null && !response.IsSuccessStatusCode)
                    {
                        throw new EnhancedHttpException(response.StatusCode, response.ReasonPhrase, url);
                    }

                    responseHandler.Process(response);

                    if (response != null)
                    {
                        results = await response.Content.ReadAsStringAsync();
                    }

                    logger.LogInformation($"{nameof(GetContent)}: Received child response from: {url}");
                }
                else
                {
                    results = !string.IsNullOrWhiteSpace(regionModel.OfflineHtml) ? regionModel.OfflineHtml : markupMessages.GetRegionOfflineHtml(regionModel.PageRegion);
                }
            }
            catch (BrokenCircuitException ex)
            {
                logger.LogError(ex, $"{nameof(ContentRetriever)}: BrokenCircuit: {url} - {ex.Message}");

                if (regionModel.HealthCheckRequired)
                {
                    await appRegistryDataService.SetRegionHealthState(path, regionModel.PageRegion, false);
                }

                results = !string.IsNullOrWhiteSpace(regionModel.OfflineHtml) ? regionModel.OfflineHtml : markupMessages.GetRegionOfflineHtml(regionModel.PageRegion);
            }

            return(results);
        }
Example #3
0
        public async Task <string> GetContent(string url, RegionModel regionModel, bool followRedirects, string requestBaseUrl)
        {
            const int MaxRedirections = 10;

            if (regionModel == null)
            {
                throw new ArgumentNullException(nameof(regionModel));
            }

            string results = null;

            try
            {
                if (regionModel.IsHealthy)
                {
                    logger.LogInformation($"{nameof(GetContent)}: Getting child response from: {url}");

                    var response = await GetContentIfRedirectedAsync(requestBaseUrl, url, followRedirects, MaxRedirections).ConfigureAwait(false);

                    if (response != null && !response.IsSuccessStatusCode)
                    {
                        throw new EnhancedHttpException(response.StatusCode, response.ReasonPhrase, url);
                    }

                    responseHandler.Process(response);

                    if (response != null)
                    {
                        results = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                    }

                    logger.LogInformation($"{nameof(GetContent)}: Received child response from: {url}");
                }
                else if (!string.IsNullOrWhiteSpace(regionModel.OfflineHTML))
                {
                    results = regionModel.OfflineHTML;
                }
            }
            catch (BrokenCircuitException ex)
            {
                logger.LogError(ex, $"{nameof(ContentRetriever)}: BrokenCircuit: {url} - {ex.Message}");

                if (regionModel.HealthCheckRequired)
                {
                    await regionService.SetRegionHealthState(regionModel.Path, regionModel.PageRegion, false).ConfigureAwait(false);
                }

                results = regionModel.OfflineHTML;
            }

            return(results);
        }
Example #4
0
        public async Task GetContentWhenRegionReturnsRedirectResponseThenFollowRedirect()
        {
            using var redirectHttpResponse = new HttpResponseMessage
                  {
                      StatusCode = HttpStatusCode.Redirect,
                      Content    = new StringContent(DummyChildAppContent),
                  };
            redirectHttpResponse.Headers.Location = new Uri("http://someUrl");

            var fakeHttpRequestSender = A.Fake <IFakeHttpRequestSender>();

            A.CallTo(() => fakeHttpRequestSender.Send(A <HttpRequestMessage> .Ignored)).Returns(redirectHttpResponse);

            using var fakeRedirectHttpMessageHandler = new FakeHttpMessageHandler(fakeHttpRequestSender);
            using var redirectHttpClient             = new HttpClient(fakeRedirectHttpMessageHandler)
                  {
                      BaseAddress = new Uri("http://SomeRegionBaseAddress"),
                  };

            var model = new RegionModel
            {
                IsHealthy = true,
            };

            using var httpHandler = new MockHttpMessageHandler();
            httpHandler.When(HttpMethod.Get, "http://someUrl").Respond(_ => redirectHttpResponse);

            var localHttpClientFactory = A.Fake <IUriSpecifcHttpClientFactory>();

            A.CallTo(() => localHttpClientFactory.GetClientForRegionEndpoint(A <string> .Ignored)).Returns(httpHandler.ToHttpClient());

            var service = new ContentRetriever(localHttpClientFactory, logger, appRegistryDataService, httpResponseMessageHandler, markupMessages, memoryCache, passOnHeaderSettings);

            await service.GetContent("http://someUrl", "path", model, true, baseUri, new HeaderDictionary());

            A.CallTo(() => httpResponseMessageHandler.Process(null)).MustHaveHappened();
        }