public void RemoveHeader_RemovesProxyRequestHeader(string names, string removedHeader, string expected)
    {
        var httpContext  = new DefaultHttpContext();
        var proxyRequest = new HttpRequestMessage()
        {
            Content = new EmptyHttpContent()
        };

        foreach (var name in names.Split("; "))
        {
            httpContext.Request.Headers.Add(name, "value0");
            RequestUtilities.AddHeader(proxyRequest, name, "value1");
        }

        RequestTransform.RemoveHeader(new RequestTransformContext()
        {
            HttpContext  = httpContext,
            ProxyRequest = proxyRequest
        }, removedHeader);

        foreach (var name in names.Split("; "))
        {
            Assert.True(httpContext.Request.Headers.TryGetValue(name, out var value));
            Assert.Equal("value0", value);
        }

        var expectedHeaders  = expected.Split("; ", System.StringSplitOptions.RemoveEmptyEntries).OrderBy(h => h);
        var remainingHeaders = proxyRequest.Headers.Union(proxyRequest.Content.Headers).OrderBy(h => h.Key);

        Assert.Equal(expectedHeaders, remainingHeaders.Select(h => h.Key));
        Assert.All(remainingHeaders, h => Assert.Equal("value1", Assert.Single(h.Value)));
    }
        public void TakeHeader_HeadersCopied_ReturnsNothing()
        {
            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add("name", "value0");
            var proxyRequest = new HttpRequestMessage();
            var result       = RequestTransform.TakeHeader(new RequestTransformContext()
            {
                HttpContext   = httpContext,
                ProxyRequest  = proxyRequest,
                HeadersCopied = true,
            }, "name");

            Assert.Equal(StringValues.Empty, result);
        }
        public void TakeHeaderFromContent_RemovesAndReturnsProxyContentHeader(bool copiedHeaders)
        {
            var httpContext = new DefaultHttpContext();

            httpContext.Request.ContentType = "value0";
            var proxyRequest = new HttpRequestMessage();

            proxyRequest.Content = new StringContent("hello world");
            var result = RequestTransform.TakeHeader(new RequestTransformContext()
            {
                HttpContext   = httpContext,
                ProxyRequest  = proxyRequest,
                HeadersCopied = copiedHeaders,
            }, HeaderNames.ContentType);

            Assert.Equal("text/plain; charset=utf-8", result);
            Assert.False(proxyRequest.Content.Headers.TryGetValues(HeaderNames.ContentType, out var _));
        }
        public void TakeHeader_RemovesAndReturnsProxyRequestHeader(bool copiedHeaders)
        {
            var httpContext = new DefaultHttpContext();

            httpContext.Request.Headers.Add("name", "value0");
            var proxyRequest = new HttpRequestMessage();

            proxyRequest.Headers.Add("Name", "value1");
            proxyRequest.Content = new StringContent("hello world");
            proxyRequest.Content.Headers.Add("Name", "value2");
            var result = RequestTransform.TakeHeader(new RequestTransformContext()
            {
                HttpContext   = httpContext,
                ProxyRequest  = proxyRequest,
                HeadersCopied = copiedHeaders,
            }, "name");

            Assert.Equal("value1", result);
            Assert.False(proxyRequest.Headers.TryGetValues("name", out var _));
            Assert.Equal(new[] { "value2" }, proxyRequest.Content.Headers.GetValues("name"));
        }