public async Task ShouldProperlyMakeGetRequestByAbsoluteUriWithForwardedHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });
            var          traceEventId = Guid.NewGuid().ToString();
            const string userspaceId  = "10";
            const string uri          = "http://unittest/api/services";

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, traceEventId);
            httpContext.Request.Headers.Add(UserspaceIdHeader, userspaceId);

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var response = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.True(client.DefaultRequestHeaders.Contains(TraceEventIdHeader));
            Assert.True(client.DefaultRequestHeaders.Contains(UserspaceIdHeader));

            Assert.Equal(traceEventId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == TraceEventIdHeader).Value.FirstOrDefault());
            Assert.Equal(userspaceId, client.DefaultRequestHeaders.FirstOrDefault(x => x.Key == UserspaceIdHeader).Value.FirstOrDefault());

            var services = response.ResultObject?.ToList();

            Assert.NotNull(services);
            Assert.Equal(2, services !.Count);
            Assert.Equal(1, services[0].Id);
            Assert.Equal("Service1", services[0].Name);
            Assert.Equal(2, services[1].Id);
            Assert.Equal("Service2", services[1].Name);
            var _logger = _loggers.First();

            Assert.Equal(2, _logger.LoggingEvents.Count);
            Assert.Equal($"Start downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}].", _logger.LoggingEvents[0]);
            Assert.Contains($"Downstream request GET {uri} with http forwarded headers=[{TraceEventIdHeader}, {traceEventId}], [{UserspaceIdHeader}, {userspaceId}] finished with StatusCode {(int)HttpStatusCode.OK} at", _logger.LoggingEvents[1]);
        }
        public RestHttpClientTests()
        {
            _loggerFactory = new StubLoggerFactory(_loggers);
            RestHttpClient.ResetAccessToken();
            RestHttpClient.ResetAuthorizationRequestHandler();

            _configuration.ConfigHeaders(new RestHttpClientHeaderOptions()
            {
                ForwardedHeaders = new HashSet <string>()
                {
                    TraceEventIdHeader, UserspaceIdHeader
                }
            });
        }
        public async Task ShouldProperlyReuseHttpClientObjectInParallelWithHeaders()
        {
            var modelJson = JsonConvert.SerializeObject(new Service[] {
                new Service {
                    Id = 1, Name = "Service1"
                },
                new Service {
                    Id = 2, Name = "Service2"
                }
            });

            const string uri = "http://unittest/api/services";

            var headerOptions = new RestHttpClientHeaderOptions();

            headerOptions.AddForwardedHeader(TraceEventIdHeader);
            headerOptions.AddForwardedHeader(UserspaceIdHeader);
            var conf = new RestHttpClientOptions();

            conf.ConfigHeaders(headerOptions);

            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add(TraceEventIdHeader, "eventId");
            httpContext.Request.Headers.Add(UserspaceIdHeader, "12");
            const int totalRequests = 1000;

            var client         = new HttpClient(CreateDefaultResponseHandler(HttpStatusCode.OK, modelJson));
            var restHttpClient = CreateRestHttpClient(client, httpContext, conf);

            var firstResult = await restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10));

            Assert.Equal(2, firstResult.ResultObject?.Count());

            var results = Enumerable.Range(0, totalRequests).AsParallel().AsOrdered().WithDegreeOfParallelism(10)
                          .Select(_ => restHttpClient.Get <IEnumerable <Service> >(uri, TimeSpan.FromSeconds(10)).GetAwaiter().GetResult())
                          .AsSequential()
                          .ToList();

            Assert.Empty(results.Where(x => x.OriginalResponse?.RequestMessage?.Headers.Count() != 2));
            Assert.Equal(2 * totalRequests, results.Where(x => x.ResultObject is not null).SelectMany(x => x.ResultObject).Count());
        }