public async Task AllowedHeaders_Copied(string names, int expected) { var httpContext = new DefaultHttpContext(); var proxyRequest = new HttpRequestMessage(); httpContext.Request.Headers["header1"] = "value1"; httpContext.Request.Headers["header2"] = "value2"; httpContext.Request.Headers["header3"] = "value3"; httpContext.Request.Headers["header4"] = "value4"; httpContext.Request.Headers["header5"] = "value5"; httpContext.Request.Headers.ContentLength = 0; var allowed = names.Split(';'); var transform = new RequestHeadersAllowedTransform(allowed); var transformContext = new RequestTransformContext() { HttpContext = httpContext, ProxyRequest = proxyRequest, HeadersCopied = false, }; await transform.ApplyAsync(transformContext); Assert.True(transformContext.HeadersCopied); Assert.Equal(expected, proxyRequest.Headers.Count()); foreach (var header in proxyRequest.Headers) { Assert.Contains(header.Key, allowed, StringComparer.OrdinalIgnoreCase); } }
// See https://github.com/microsoft/reverse-proxy/blob/51d797986b1fea03500a1ad173d13a1176fb5552/src/ReverseProxy/Forwarder/RequestUtilities.cs#L61-L83 public async Task RestrictedHeaders_CopiedIfAllowed(string names, int expected) { var httpContext = new DefaultHttpContext(); var proxyRequest = new HttpRequestMessage(); httpContext.Request.Headers[HeaderNames.Connection] = "value1"; httpContext.Request.Headers[HeaderNames.TransferEncoding] = "value2"; httpContext.Request.Headers[HeaderNames.KeepAlive] = "value3"; var allowed = names.Split(';'); var transform = new RequestHeadersAllowedTransform(allowed); var transformContext = new RequestTransformContext() { HttpContext = httpContext, ProxyRequest = proxyRequest, HeadersCopied = false, }; await transform.ApplyAsync(transformContext); Assert.True(transformContext.HeadersCopied); Assert.Equal(expected, proxyRequest.Headers.Count()); foreach (var header in proxyRequest.Headers) { Assert.Contains(header.Key, allowed, StringComparer.OrdinalIgnoreCase); } }
public async Task ContentHeaders_CopiedIfAllowed(string names, int expected) { var httpContext = new DefaultHttpContext(); var proxyRequest = new HttpRequestMessage(); httpContext.Request.Headers[HeaderNames.Allow] = "value1"; httpContext.Request.Headers[HeaderNames.ContentDisposition] = "value2"; httpContext.Request.Headers[HeaderNames.ContentEncoding] = "value3"; httpContext.Request.Headers[HeaderNames.ContentLanguage] = "value4"; httpContext.Request.Headers[HeaderNames.ContentLocation] = "value5"; httpContext.Request.Headers[HeaderNames.ContentMD5] = "value6"; httpContext.Request.Headers[HeaderNames.ContentRange] = "value7"; httpContext.Request.Headers[HeaderNames.ContentType] = "value8"; httpContext.Request.Headers[HeaderNames.Expires] = "value9"; httpContext.Request.Headers[HeaderNames.LastModified] = "value10"; httpContext.Request.Headers.ContentLength = 0; var allowed = names.Split(';'); var transform = new RequestHeadersAllowedTransform(allowed); var transformContext = new RequestTransformContext() { HttpContext = httpContext, ProxyRequest = proxyRequest, HeadersCopied = false, }; await transform.ApplyAsync(transformContext); Assert.True(transformContext.HeadersCopied); Assert.Empty(proxyRequest.Headers); var content = proxyRequest.Content; if (expected == 0) { Assert.Null(content); return; } Assert.Equal(expected, content.Headers.Count()); foreach (var header in content.Headers) { Assert.Contains(header.Key, allowed, StringComparer.OrdinalIgnoreCase); } }