Skip to content

Commit

Permalink
Do not redirect to 404 with 302
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Nielsen committed Dec 18, 2023
1 parent 89c4073 commit 5b5dd3d
Showing 1 changed file with 54 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.StaticFiles;
Expand Down Expand Up @@ -167,8 +168,8 @@ public static void UsePageNotFound(this IApplicationBuilder application)
{
//get new path
var pageNotFoundPath = "/page-not-found";
//re-execute request with new path
context.HttpContext.Response.Redirect(context.HttpContext.Request.PathBase + pageNotFoundPath);
await CreateHandler(pageNotFoundPath, null)(context);
}
finally
{
Expand Down Expand Up @@ -538,5 +539,56 @@ public static void UseNopWebMarkupMin(this IApplicationBuilder application)

application.UseWebMarkupMin();
}

private static Func<StatusCodeContext, Task> CreateHandler(
string pathFormat,
string queryFormat,
RequestDelegate next = null)
{
return (async context =>
{
var statusCode = context.HttpContext.Response.StatusCode;
var pathString = new PathString(string.Format(CultureInfo.InvariantCulture, pathFormat, statusCode));
var str = queryFormat == null ? null : string.Format(CultureInfo.InvariantCulture, queryFormat, statusCode);
var queryString = queryFormat == null ? QueryString.Empty : new QueryString(str);
var originalPath = context.HttpContext.Request.Path;
var originalQueryString = context.HttpContext.Request.QueryString;
var routeValuesFeature = context.HttpContext.Features.Get<IRouteValuesFeature>();
context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(new StatusCodeReExecuteFeature
{
OriginalPathBase = context.HttpContext.Request.PathBase.Value!,
OriginalPath = originalPath.Value!,
OriginalQueryString = (originalQueryString.HasValue ? originalQueryString.Value : null),
Endpoint = context.HttpContext.GetEndpoint(),
RouteValues = routeValuesFeature?.RouteValues
});
context.HttpContext.SetEndpoint(null);
if (routeValuesFeature != null)
routeValuesFeature.RouteValues = null!;
context.HttpContext.Request.Path = pathString;
context.HttpContext.Request.QueryString = queryString;
try
{
if (next != null)
{
await next(context.HttpContext);
originalPath = new PathString();
originalQueryString = new QueryString();
}
else
{
await context.Next(context.HttpContext);
originalPath = new PathString();
originalQueryString = new QueryString();
}
}
finally
{
context.HttpContext.Request.QueryString = originalQueryString;
context.HttpContext.Request.Path = originalPath;
context.HttpContext.Features.Set<IStatusCodeReExecuteFeature>(null);
}
});
}
}
}

0 comments on commit 5b5dd3d

Please sign in to comment.