diff --git a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs index e86d3bf46..c6bcff2d0 100644 --- a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs +++ b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs @@ -18,6 +18,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Rewrite; using Microsoft.AspNetCore.Routing; diff --git a/dotnet/test/DotNetCoreWebUnitTest/DotNetCoreWebUnitTest.csproj b/dotnet/test/DotNetCoreWebUnitTest/DotNetCoreWebUnitTest.csproj index 789e4b132..61a57b2f2 100644 --- a/dotnet/test/DotNetCoreWebUnitTest/DotNetCoreWebUnitTest.csproj +++ b/dotnet/test/DotNetCoreWebUnitTest/DotNetCoreWebUnitTest.csproj @@ -59,6 +59,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/dotnet/test/DotNetCoreWebUnitTest/Middleware/HeadersTest.cs b/dotnet/test/DotNetCoreWebUnitTest/Middleware/HeadersTest.cs new file mode 100644 index 000000000..cc26e10e5 --- /dev/null +++ b/dotnet/test/DotNetCoreWebUnitTest/Middleware/HeadersTest.cs @@ -0,0 +1,40 @@ +using System; +using System.Net.Http; +using System.Reflection; +using System.Threading.Tasks; +using GeneXus.Metadata; +using Xunit; +namespace xUnitTesting +{ + public class HeadersTest : MiddlewareTest + { + public HeadersTest() : base() + { + ClassLoader.FindType("apps.httpheaders", "GeneXus.Programs.apps", "httpheaders", Assembly.GetExecutingAssembly(), true);//Force loading assembly for append procedure + server.AllowSynchronousIO = true; + + } + protected override void SetEnvironmentVars() + { + Environment.SetEnvironmentVariable("ASPNETCORE_FORWARDEDHEADERS_ENABLED", "true", EnvironmentVariableTarget.Process); + + } + [Fact] + public async Task TestForwardedHeaders() + { + const string host = "192.168.1.100"; + const string scheme = "https"; + const string remoteUrl = $"{scheme}:\\/\\/{host}"; + HttpClient client = server.CreateClient(); + client.DefaultRequestHeaders.Add("X-Forwarded-For", host); + client.DefaultRequestHeaders.Add("X-Forwarded-Proto", scheme); + + HttpResponseMessage response = await client.GetAsync("/rest/apps/httpheaders"); + response.EnsureSuccessStatusCode(); + string resp = await response.Content.ReadAsStringAsync(); + Assert.Contains(remoteUrl, resp, System.StringComparison.OrdinalIgnoreCase); + Assert.Equal(System.Net.HttpStatusCode.OK, response.StatusCode); + } + + } +} \ No newline at end of file diff --git a/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.cs b/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.cs new file mode 100644 index 000000000..5e8a8fef4 --- /dev/null +++ b/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.cs @@ -0,0 +1,57 @@ +using GeneXus.Application; +using GeneXus.Data.NTier; +using GeneXus.Procedure; + +namespace GeneXus.Programs.apps +{ + public class httpheaders : GXWebProcedure + { + + public httpheaders() + { + context = new GxContext(); + DataStoreUtil.LoadDataStores(context); + IsMain = true; + context.SetDefaultTheme("Carmine"); + } + + public httpheaders(IGxContext context) + { + this.context = context; + IsMain = false; + } + + public void execute(out string result) + { + initialize(); + executePrivate(out result); + } + + void executePrivate(out string result) + { + result = (context.GetHttpSecure() == 1 ? "https://" : "http://") + context.GetRemoteAddress(); + + cleanup(); + } + + public override void cleanup() + { + CloseOpenCursors(); + base.cleanup(); + if (IsMain) + { + context.CloseConnections(); + } + ExitApp(); + } + + protected void CloseOpenCursors() + { + } + + public override void initialize() + { + } + } + +} diff --git a/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.svc b/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.svc new file mode 100644 index 000000000..bbfa49ec1 --- /dev/null +++ b/dotnet/test/DotNetCoreWebUnitTest/apps/httpheaders.svc @@ -0,0 +1 @@ +<%@ServiceHost Service= "GeneXus.Programs.apps.httpheaders,apps.httpheaders" %>