diff --git a/BasicMiddleware.sln b/BasicMiddleware.sln index d589e2f092..a3fc740b7b 100644 --- a/BasicMiddleware.sln +++ b/BasicMiddleware.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpOverrides", "src\Microsoft.AspNet.HttpOverrides\Microsoft.AspNet.HttpOverrides.xproj", "{517308C3-B477-4B01-B461-CAB9C10B6928}" EndProject @@ -24,6 +24,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9587 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "ResponseBufferingSample", "samples\ResponseBufferingSample\ResponseBufferingSample.xproj", "{E5C55B80-7827-40EB-B661-32B0E0E431CA}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "HttpOverridesSample", "samples\HttpOverridesSample\HttpOverridesSample.xproj", "{7F95478D-E1D4-4A64-BA42-B041591A96EB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -50,6 +52,10 @@ Global {E5C55B80-7827-40EB-B661-32B0E0E431CA}.Debug|Any CPU.Build.0 = Debug|Any CPU {E5C55B80-7827-40EB-B661-32B0E0E431CA}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5C55B80-7827-40EB-B661-32B0E0E431CA}.Release|Any CPU.Build.0 = Release|Any CPU + {7F95478D-E1D4-4A64-BA42-B041591A96EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7F95478D-E1D4-4A64-BA42-B041591A96EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7F95478D-E1D4-4A64-BA42-B041591A96EB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7F95478D-E1D4-4A64-BA42-B041591A96EB}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -60,5 +66,6 @@ Global {2363D0DD-A3BF-437E-9B64-B33AE132D875} = {A5076D28-FA7E-4606-9410-FEDD0D603527} {F5F1D123-9C81-4A9E-8644-AA46B8E578FB} = {8437B0F3-3894-4828-A945-A9187F37631D} {E5C55B80-7827-40EB-B661-32B0E0E431CA} = {9587FE9F-5A17-42C4-8021-E87F59CECB98} + {7F95478D-E1D4-4A64-BA42-B041591A96EB} = {9587FE9F-5A17-42C4-8021-E87F59CECB98} EndGlobalSection EndGlobal diff --git a/samples/HttpOverridesSample/HttpOverridesSample.xproj b/samples/HttpOverridesSample/HttpOverridesSample.xproj new file mode 100644 index 0000000000..d7dd58a746 --- /dev/null +++ b/samples/HttpOverridesSample/HttpOverridesSample.xproj @@ -0,0 +1,25 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 7f95478d-e1d4-4a64-ba42-b041591a96eb + HttpOverridesSample + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + + + + + + diff --git a/samples/HttpOverridesSample/Properties/launchSettings.json b/samples/HttpOverridesSample/Properties/launchSettings.json new file mode 100644 index 0000000000..553b782dd9 --- /dev/null +++ b/samples/HttpOverridesSample/Properties/launchSettings.json @@ -0,0 +1,25 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:1658/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNET_ENVIRONMENT": "Development" + } + }, + "web": { + "commandName": "web", + "environmentVariables": { + "ASPNET_ENVIRONMENT": "Development" + } + } + } +} \ No newline at end of file diff --git a/samples/HttpOverridesSample/Startup.cs b/samples/HttpOverridesSample/Startup.cs new file mode 100644 index 0000000000..dc4e4ccddb --- /dev/null +++ b/samples/HttpOverridesSample/Startup.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpOverrides; + +namespace HttpOverridesSample +{ + public class Startup + { + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app) + { + app.UseIISPlatformHandler(); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.All; + }); + app.UseHttpMethodOverride(); + + app.Run(async (context) => + { + foreach (var header in context.Request.Headers) + { + await context.Response.WriteAsync($"{header.Key}: {header.Value}\r\n"); + } + await context.Response.WriteAsync($"Method: {context.Request.Method}\r\n"); + await context.Response.WriteAsync($"Scheme: {context.Request.Scheme}\r\n"); + await context.Response.WriteAsync($"RemoteIP: {context.Connection.RemoteIpAddress}\r\n"); + await context.Response.WriteAsync($"RemotePort: {context.Connection.RemotePort}\r\n"); + }); + } + + // Entry point for the application. + public static void Main(string[] args) => WebApplication.Run(args); + } +} diff --git a/samples/HttpOverridesSample/hosting.json b/samples/HttpOverridesSample/hosting.json new file mode 100644 index 0000000000..f8ef14574d --- /dev/null +++ b/samples/HttpOverridesSample/hosting.json @@ -0,0 +1,3 @@ +{ + "server": "Microsoft.AspNet.Server.Kestrel" +} diff --git a/samples/HttpOverridesSample/project.json b/samples/HttpOverridesSample/project.json new file mode 100644 index 0000000000..007668ab4b --- /dev/null +++ b/samples/HttpOverridesSample/project.json @@ -0,0 +1,26 @@ +{ + "version": "1.0.0-*", + "compilationOptions": { + "emitEntryPoint": true + }, + "dependencies": { + "Microsoft.AspNet.IISPlatformHandler": "1.0.0-*", + "Microsoft.AspNet.Server.Kestrel": "1.0.0-*", + "Microsoft.AspNet.HttpOverrides": "1.0.0-*" + }, + "commands": { + "web": "HttpOverridesSample" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + }, + "exclude": [ + "wwwroot", + "node_modules" + ], + "publishExclude": [ + "**.user", + "**.vspscc" + ] +} diff --git a/samples/HttpOverridesSample/wwwroot/web.config b/samples/HttpOverridesSample/wwwroot/web.config new file mode 100644 index 0000000000..8485f6719f --- /dev/null +++ b/samples/HttpOverridesSample/wwwroot/web.config @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideExtensions.cs b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideExtensions.cs index 42ae6e93b8..66aa5953a5 100644 --- a/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideExtensions.cs +++ b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNet.HttpOverrides; namespace Microsoft.AspNet.Builder @@ -14,7 +15,11 @@ namespace Microsoft.AspNet.Builder /// public static IApplicationBuilder UseHttpMethodOverride(this IApplicationBuilder builder) { - return builder.Use(next => new HttpMethodOverrideMiddleware(next).Invoke); + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + return builder.Use(next => new HttpMethodOverrideMiddleware(next, new HttpMethodOverrideOptions()).Invoke); } /// @@ -23,9 +28,19 @@ namespace Microsoft.AspNet.Builder /// /// Denotes the element that contains the name of the resulting method type. /// - public static IApplicationBuilder UseHttpMethodOverride(this IApplicationBuilder builder, string formFieldInput) + public static IApplicationBuilder UseHttpMethodOverride(this IApplicationBuilder builder, Action configureOptions) { - return builder.Use(next => new HttpMethodOverrideMiddleware(next, formFieldInput).Invoke); + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configureOptions == null) + { + throw new ArgumentNullException(nameof(configureOptions)); + } + var options = new HttpMethodOverrideOptions(); + configureOptions(options); + return builder.Use(next => new HttpMethodOverrideMiddleware(next, options).Invoke); } } } diff --git a/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideMiddleware.cs b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideMiddleware.cs index 46ede451f6..621f355af2 100644 --- a/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideMiddleware.cs +++ b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideMiddleware.cs @@ -3,7 +3,6 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.HttpOverrides @@ -12,24 +11,32 @@ namespace Microsoft.AspNet.HttpOverrides { private const string xHttpMethodOverride = "X-Http-Method-Override"; private readonly RequestDelegate _next; - private readonly string _formFieldName; + private readonly HttpMethodOverrideOptions _options; - public HttpMethodOverrideMiddleware(RequestDelegate next, string formFieldName = null) + public HttpMethodOverrideMiddleware(RequestDelegate next, HttpMethodOverrideOptions options) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } _next = next; - _formFieldName = formFieldName; + _options = options; } public async Task Invoke(HttpContext context) { if (string.Equals(context.Request.Method,"POST", StringComparison.OrdinalIgnoreCase)) { - if (_formFieldName != null) + if (_options.FormFieldName != null) { if (context.Request.HasFormContentType) { var form = await context.Request.ReadFormAsync(); - var methodType = form[_formFieldName]; + var methodType = form[_options.FormFieldName]; if (!string.IsNullOrEmpty(methodType)) { context.Request.Method = methodType; diff --git a/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideOptions.cs b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideOptions.cs new file mode 100644 index 0000000000..033669acab --- /dev/null +++ b/src/Microsoft.AspNet.HttpOverrides/HttpMethodOverrideOptions.cs @@ -0,0 +1,14 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.HttpOverrides +{ + public class HttpMethodOverrideOptions + { + /// + /// Denotes the form element that contains the name of the resulting method type. + /// If not set the X-Http-Method-Override header will be used. + /// + public string FormFieldName { get; set; } + } +} diff --git a/src/Microsoft.AspNet.HttpOverrides/IPEndPointParser.cs b/src/Microsoft.AspNet.HttpOverrides/IPEndPointParser.cs new file mode 100644 index 0000000000..b303c0d2c6 --- /dev/null +++ b/src/Microsoft.AspNet.HttpOverrides/IPEndPointParser.cs @@ -0,0 +1,73 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; + +namespace Microsoft.AspNet.HttpOverrides +{ + public static class IPEndPointParser + { + public static bool TryParse(string addressWithPort, out IPEndPoint endpoint) + { + string addressPart = null; + string portPart = null; + IPAddress address; + endpoint = null; + + var lastColonIndex = addressWithPort.LastIndexOf(':'); + if (lastColonIndex > 0) + { + // IPv4 with port or IPv6 + var closingIndex = addressWithPort.LastIndexOf(']'); + if (closingIndex > 0) + { + // IPv6 with brackets + addressPart = addressWithPort.Substring(1, closingIndex - 1); + if (closingIndex < lastColonIndex) + { + // IPv6 with port [::1]:80 + portPart = addressWithPort.Substring(lastColonIndex + 1); + } + } + else + { + // IPv6 without port or IPv4 + var firstColonIndex = addressWithPort.IndexOf(':'); + if (firstColonIndex != lastColonIndex) + { + // IPv6 ::1 + addressPart = addressWithPort; + } + else + { + // IPv4 with port 127.0.0.1:123 + addressPart = addressWithPort.Substring(0, firstColonIndex); + portPart = addressWithPort.Substring(firstColonIndex + 1); + } + } + } + else + { + // IPv4 without port + addressPart = addressWithPort; + } + + if (IPAddress.TryParse(addressPart, out address)) + { + if (portPart != null) + { + int port; + if (int.TryParse(portPart, out port)) + { + endpoint = new IPEndPoint(address, port); + return true; + } + return false; + } + endpoint = new IPEndPoint(address, 0); + return true; + } + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderExtensions.cs b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderExtensions.cs index 04acee970c..b02d7c5191 100644 --- a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderExtensions.cs +++ b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNet.HttpOverrides; namespace Microsoft.AspNet.Builder @@ -13,8 +14,18 @@ namespace Microsoft.AspNet.Builder /// /// Enables the different override options. /// - public static IApplicationBuilder UseOverrideHeaders(this IApplicationBuilder builder, OverrideHeaderMiddlewareOptions options) + public static IApplicationBuilder UseOverrideHeaders(this IApplicationBuilder builder, Action configureOptions) { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + if (configureOptions == null) + { + throw new ArgumentNullException(nameof(configureOptions)); + } + var options = new OverrideHeaderOptions(); + configureOptions(options); return builder.Use(next => new OverrideHeaderMiddleware(next, options).Invoke); } } diff --git a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderMiddleware.cs b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderMiddleware.cs index dd3cb92260..f300f65d56 100644 --- a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderMiddleware.cs +++ b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderMiddleware.cs @@ -4,7 +4,6 @@ using System; using System.Net; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.HttpOverrides @@ -14,19 +13,18 @@ namespace Microsoft.AspNet.HttpOverrides private const string XForwardedForHeaderName = "X-Forwarded-For"; private const string XForwardedHostHeaderName = "X-Forwarded-Host"; private const string XForwardedProtoHeaderName = "X-Forwarded-Proto"; - private const string XOriginalIPName = "X-Original-IP"; + private const string XOriginalForName = "X-Original-For"; private const string XOriginalHostName = "X-Original-Host"; private const string XOriginalProtoName = "X-Original-Proto"; - private readonly OverrideHeaderMiddlewareOptions _options; + private readonly OverrideHeaderOptions _options; private readonly RequestDelegate _next; - public OverrideHeaderMiddleware(RequestDelegate next, OverrideHeaderMiddlewareOptions options) + public OverrideHeaderMiddleware(RequestDelegate next, OverrideHeaderOptions options) { if (next == null) { throw new ArgumentNullException(nameof(next)); } - if (options == null) { throw new ArgumentNullException(nameof(options)); @@ -37,25 +35,42 @@ namespace Microsoft.AspNet.HttpOverrides } public Task Invoke(HttpContext context) + { + UpdateRemoteIp(context); + + UpdateHost(context); + + UpdateScheme(context); + + return _next(context); + } + + private void UpdateRemoteIp(HttpContext context) { if ((_options.ForwardedOptions & ForwardedHeaders.XForwardedFor) != 0) { var xForwardedForHeaderValue = context.Request.Headers.GetCommaSeparatedValues(XForwardedForHeaderName); if (xForwardedForHeaderValue != null && xForwardedForHeaderValue.Length > 0) { - IPAddress ipFromHeader; - if (IPAddress.TryParse(xForwardedForHeaderValue[0], out ipFromHeader)) + IPEndPoint endpoint; + if (IPEndPointParser.TryParse(xForwardedForHeaderValue[0], out endpoint)) { - var remoteIPString = context.Connection.RemoteIpAddress?.ToString(); - if (!string.IsNullOrEmpty(remoteIPString)) + var connection = context.Connection; + var remoteIP = connection.RemoteIpAddress; + if (remoteIP != null) { - context.Request.Headers[XOriginalIPName] = remoteIPString; + var remoteIPString = new IPEndPoint(remoteIP, connection.RemotePort).ToString(); + context.Request.Headers[XOriginalForName] = remoteIPString; } - context.Connection.RemoteIpAddress = ipFromHeader; + connection.RemoteIpAddress = endpoint.Address; + connection.RemotePort = endpoint.Port; } } } + } + private void UpdateHost(HttpContext context) + { if ((_options.ForwardedOptions & ForwardedHeaders.XForwardedHost) != 0) { var xForwardHostHeaderValue = context.Request.Headers[XForwardedHostHeaderName]; @@ -69,7 +84,10 @@ namespace Microsoft.AspNet.HttpOverrides context.Request.Host = HostString.FromUriComponent(xForwardHostHeaderValue); } } + } + private void UpdateScheme(HttpContext context) + { if ((_options.ForwardedOptions & ForwardedHeaders.XForwardedProto) != 0) { var xForwardProtoHeaderValue = context.Request.Headers[XForwardedProtoHeaderName]; @@ -82,8 +100,6 @@ namespace Microsoft.AspNet.HttpOverrides context.Request.Scheme = xForwardProtoHeaderValue; } } - - return _next(context); } } } diff --git a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderOptions.cs b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderOptions.cs index 428408ab25..8b4f0756f4 100644 --- a/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderOptions.cs +++ b/src/Microsoft.AspNet.HttpOverrides/OverrideHeaderOptions.cs @@ -3,7 +3,7 @@ namespace Microsoft.AspNet.HttpOverrides { - public class OverrideHeaderMiddlewareOptions + public class OverrideHeaderOptions { public ForwardedHeaders ForwardedOptions { get; set; } } diff --git a/test/Microsoft.AspNet.Buffering.Tests/Microsoft.AspNet.Buffering.Tests.xproj b/test/Microsoft.AspNet.Buffering.Tests/Microsoft.AspNet.Buffering.Tests.xproj index 16b38cf3d8..a047e54513 100644 --- a/test/Microsoft.AspNet.Buffering.Tests/Microsoft.AspNet.Buffering.Tests.xproj +++ b/test/Microsoft.AspNet.Buffering.Tests/Microsoft.AspNet.Buffering.Tests.xproj @@ -4,7 +4,6 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - f5f1d123-9c81-4a9e-8644-aa46b8e578fb @@ -12,9 +11,11 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ - 2.0 + + + - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.HttpOverrides.Tests/IPEndPointParserTest.cs b/test/Microsoft.AspNet.HttpOverrides.Tests/IPEndPointParserTest.cs new file mode 100644 index 0000000000..9970dd8610 --- /dev/null +++ b/test/Microsoft.AspNet.HttpOverrides.Tests/IPEndPointParserTest.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using Xunit; + +namespace Microsoft.AspNet.HttpOverrides +{ + public class IPEndPointParserTests + { + [Theory] + [InlineData("127.0.0.1", "127.0.0.1", 0)] + [InlineData("127.0.0.1:1", "127.0.0.1", 1)] + [InlineData("1", "0.0.0.1", 0)] + [InlineData("1:1", "0.0.0.1", 1)] + [InlineData("::1", "::1", 0)] + [InlineData("[::1]", "::1", 0)] + [InlineData("[::1]:1", "::1", 1)] + public void ParsesCorrectly(string input, string expectedAddress, int expectedPort) + { + IPEndPoint endpoint; + var success = IPEndPointParser.TryParse(input, out endpoint); + Assert.True(success); + Assert.Equal(expectedAddress, endpoint.Address.ToString()); + Assert.Equal(expectedPort, endpoint.Port); + } + + [InlineData(null)] + [InlineData("[::1]:")] + [InlineData("[::1:")] + [InlineData("::1:")] + [InlineData("127:")] + [InlineData("127.0.0.1:")] + [InlineData("")] + [InlineData("[]")] + [InlineData("]")] + [InlineData("]:1")] + public void ShouldNotParse(string input) + { + IPEndPoint endpoint; + var success = IPEndPointParser.TryParse(input, out endpoint); + Assert.False(success); + Assert.Equal(null, endpoint); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.HttpOverrides.Tests/OverrideHeaderMiddlewareTest.cs b/test/Microsoft.AspNet.HttpOverrides.Tests/OverrideHeaderMiddlewareTest.cs index 5355335e5a..38db395f0a 100644 --- a/test/Microsoft.AspNet.HttpOverrides.Tests/OverrideHeaderMiddlewareTest.cs +++ b/test/Microsoft.AspNet.HttpOverrides.Tests/OverrideHeaderMiddlewareTest.cs @@ -15,12 +15,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task XForwardedForOverrideChangesRemoteIp() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.XForwardedFor; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.XForwardedFor; + }); app.Run(context => { Assert.Equal("11.111.111.11", context.Connection.RemoteIpAddress.ToString()); @@ -39,12 +40,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task XForwardedForOverrideBadIpDoesntChangeRemoteIp() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.XForwardedFor; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.XForwardedFor; + }); app.Run(context => { Assert.Null(context.Connection.RemoteIpAddress); @@ -63,12 +65,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task XForwardedHostOverrideChangesRequestHost() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.XForwardedHost; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.XForwardedHost; + }); app.Run(context => { Assert.Equal("testhost", context.Request.Host.ToString()); @@ -87,12 +90,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task XForwardedProtoOverrideChangesRequestProtocol() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.XForwardedProto; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.XForwardedProto; + }); app.Run(context => { Assert.Equal("TestProtocol", context.Request.Scheme); @@ -110,7 +114,7 @@ namespace Microsoft.AspNet.HttpOverrides [Fact] public void AllForwardsDisabledByDefault() { - var options = new OverrideHeaderMiddlewareOptions(); + var options = new OverrideHeaderOptions(); Assert.True(options.ForwardedOptions == 0); } @@ -118,12 +122,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task AllForwardsEnabledChangeRequestRemoteIpHostandProtocol() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.All; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.All; + }); app.Run(context => { Assert.Equal("11.111.111.11", context.Connection.RemoteIpAddress.ToString()); @@ -146,12 +151,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task AllOptionsDisabledRequestDoesntChange() { var assertsExecuted = false; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = ForwardedHeaders.None; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.None; + }); app.Run(context => { Assert.Null(context.Connection.RemoteIpAddress); @@ -174,13 +180,13 @@ namespace Microsoft.AspNet.HttpOverrides public async Task PartiallyEnabledForwardsPartiallyChangesRequest() { var assertsExecuted = false; - var XForwardedForAndProto = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; - var options = new OverrideHeaderMiddlewareOptions(); - options.ForwardedOptions = XForwardedForAndProto; var server = TestServer.Create(app => { - app.UseOverrideHeaders(options); + app.UseOverrideHeaders(options => + { + options.ForwardedOptions = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; + }); app.Run(context => { Assert.Equal("11.111.111.11", context.Connection.RemoteIpAddress.ToString());