public async Task OkStatusShouldPassThrough()
        {
            var handler = CreateMockHttpHandler(new HttpResponseMessage(HttpStatusCode.OK));
            var adapter = new HttpClientAdapter(handler);

            var httpRequestMessage = CreateRequest(HttpMethod.Get);

            var response = await adapter.SendAsync(httpRequestMessage, new CancellationToken());

            Assert.Equal(response.StatusCode, HttpStatusCode.OK);
            Assert.Same(response.RequestMessage, httpRequestMessage);
        }
        public async Task Status303ShouldRedirectChangeMethod()
        {
            var redirectResponse = new HttpResponseMessage(HttpStatusCode.SeeOther);
            redirectResponse.Headers.Location = new Uri("http://example.org/bar");

            var handler = CreateMockHttpHandler(redirectResponse, new HttpResponseMessage(HttpStatusCode.OK));
            var adapter = new HttpClientAdapter(handler);

            var httpRequestMessage = CreateRequest(HttpMethod.Post);

            var response = await adapter.SendAsync(httpRequestMessage, new CancellationToken());

            Assert.Equal(HttpMethod.Get, response.RequestMessage.Method);
            Assert.NotSame(response.RequestMessage, httpRequestMessage);
        }
        public async Task RedirectWithSameHostShouldKeepAuthHeader()
        {
            var redirectResponse = new HttpResponseMessage(HttpStatusCode.Redirect);
            redirectResponse.Headers.Location = new Uri("http://example.org/bar");

            var handler = CreateMockHttpHandler(redirectResponse, new HttpResponseMessage(HttpStatusCode.OK));
            var adapter = new HttpClientAdapter(handler);

            var httpRequestMessage = CreateRequest(HttpMethod.Get);
            httpRequestMessage.Headers.Authorization = new AuthenticationHeaderValue("fooAuth", "aparam");

            var response = await adapter.SendAsync(httpRequestMessage, new CancellationToken());

            Assert.NotSame(response.RequestMessage, httpRequestMessage);
            Assert.Equal("fooAuth", response.RequestMessage.Headers.Authorization.Scheme);
        }
        public async Task Exceed3RedirectsShouldReturn()
        {
            var redirectResponse = new HttpResponseMessage(HttpStatusCode.Found);
            redirectResponse.Headers.Location = new Uri("http://example.org/bar");

            var redirectResponse2 = new HttpResponseMessage(HttpStatusCode.Found);
            redirectResponse2.Headers.Location = new Uri("http://example.org/foo");
            
            var handler = CreateMockHttpHandler(redirectResponse, redirectResponse2);
            var adapter = new HttpClientAdapter(handler);

            var httpRequestMessage = CreateRequest(HttpMethod.Get);

            Assert.ThrowsAsync<InvalidOperationException>(
                () => adapter.SendAsync(httpRequestMessage, new CancellationToken()));
        }
        [InlineData(HttpStatusCode.TemporaryRedirect)]  // 307
        public async Task Status301ShouldRedirectPOSTWithBody(HttpStatusCode statusCode)
        {
            var redirectResponse = new HttpResponseMessage(statusCode);
            redirectResponse.Headers.Location = new Uri("http://example.org/bar");

            var handler = CreateMockHttpHandler(redirectResponse, new HttpResponseMessage(HttpStatusCode.OK));
            var adapter = new HttpClientAdapter(handler);

            var httpRequestMessage = CreateRequest(HttpMethod.Post);
            httpRequestMessage.Content = new StringContent("Hello World");

            var response = await adapter.SendAsync(httpRequestMessage, new CancellationToken());
            
            Assert.Equal(response.RequestMessage.Method, httpRequestMessage.Method);
            Assert.NotSame(response.RequestMessage, httpRequestMessage);
        }