From 77f5da61c8b50645e1ed0ef09feb8a8c3511ffef Mon Sep 17 00:00:00 2001 From: HappyMaarten <144103965+HappyMaarten@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:06:59 +0100 Subject: [PATCH 1/2] Fixed redirect being overwritten Fixed query results not being added to QS --- .../RewriteUrlToTemplateMiddleware.cs | 76 ++++++++++--------- 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs b/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs index 2a1e6500..d4875ce1 100644 --- a/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs +++ b/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs @@ -93,7 +93,9 @@ public async Task Invoke(HttpContext context, IObjectsService objectsService, ID await HandleRewritesAsync(context, path, queryString, templatesService, objectsService, databaseConnection, replacementsMediator); - await next.Invoke(context); + // if a Redirect() has been called, don't invoke the next context + if (context.Response.StatusCode != 302) + await next.Invoke(context); } /// @@ -135,21 +137,31 @@ private async Task HandleRewritesAsync(HttpContext context, string path, QuerySt context.Request.Path = "/template.gcl"; break; case TemplateTypes.Query when template is QueryTemplate{ UsedForRedirect: true }: - var redirectTo = await RunRedirectQuery(template, queryString, databaseConnection, templatesService, replacementsMediator); - if (redirectTo is null) + var redirectResults = await RunRedirectQuery(template, queryString, databaseConnection, templatesService, replacementsMediator); + + // if we need to redirect, do that (this sets StatusCode to 302) + if (redirectResults.ContainsKey("redirecturl")) { - context.Response.StatusCode = StatusCodes.Status404NotFound; + context.Response.Redirect(redirectResults["redirecturl"]); return; } - - if (Int32.TryParse(redirectTo, out Int32 templateId)) + // if the redirect result is a number, it's a template id, so use that + if (redirectResults.ContainsKey("templateid") && Int32.TryParse(redirectResults["templateid"], out Int32 templateId)) { - template.Id = templateId; context.Request.Path = "/template.gcl"; + template.Id = templateId; + foreach (var kvp in redirectResults) + { + if (kvp.Key.Equals("templateid", StringComparison.InvariantCultureIgnoreCase)) + continue; + + queryString.Add(kvp.Key, kvp.Value); + } } + // If the query doesn't give a (correct) result, we go 404. else { - context.Request.Path = redirectTo; + context.Response.StatusCode = StatusCodes.Status404NotFound; return; } break; @@ -291,20 +303,30 @@ private async Task HandleRewritesAsync(HttpContext context, string path, QuerySt var template = await templatesService.GetTemplateAsync(number); if (template is QueryTemplate { UsedForRedirect: true }) { - var redirectTo = await RunRedirectQuery(template, queryString, databaseConnection, templatesService, replacementsMediator); - if (redirectTo is null) + var redirectResults = await RunRedirectQuery(template, queryString, databaseConnection, templatesService, replacementsMediator); + + // if we need to redirect, do that (this sets StatusCode to 302) + if (redirectResults.ContainsKey("redirecturl")) { - context.Response.StatusCode = StatusCodes.Status404NotFound; + context.Response.Redirect(redirectResults["redirecturl"]); return; } - - if (Int32.TryParse(redirectTo, out Int32 templateId)) + // if the redirect result is a number, it's a template id, so use that + if (redirectResults.ContainsKey("templateid") && Int32.TryParse(redirectResults["templateid"], out Int32 templateId)) { - queryString = CombineQueryString(queryString, $"?templateid={templateId}"); + queryString = CombineQueryString(queryString, $"?templateid={urlMatchLastPart.Replace($"{number}", $"{templateId}").Replace("?", "&")}"); + foreach (var kvp in redirectResults) + { + if (kvp.Key.Equals("templateid", StringComparison.InvariantCultureIgnoreCase)) + continue; + + queryString.Add(kvp.Key, kvp.Value); + } } + // If the query doesn't give a (correct) result, we go 404. else { - context.Request.Path = redirectTo; + context.Response.StatusCode = StatusCodes.Status404NotFound; return; } } @@ -325,7 +347,7 @@ private async Task HandleRewritesAsync(HttpContext context, string path, QuerySt } } - private async Task RunRedirectQuery(Template template, QueryString queryString, IDatabaseConnection databaseConnection, ITemplatesService templatesService, IReplacementsMediator replacementsMediator) + private async Task> RunRedirectQuery(Template template, QueryString queryString, IDatabaseConnection databaseConnection, ITemplatesService templatesService, IReplacementsMediator replacementsMediator) { var queryStringCollection = System.Web.HttpUtility.ParseQueryString(queryString.ToString()); var query = template.Content; @@ -338,28 +360,14 @@ private async Task RunRedirectQuery(Template template, QueryString query throw new Exception($"Redirect query (id {template.Id}) returned {dataTable.Rows.Count} results, expected one!"); var dataRow = dataTable.Rows[0]; - string result = null; + var dict = new Dictionary(StringComparer.InvariantCultureIgnoreCase); foreach (DataColumn column in dataTable.Columns) { - switch (column.ColumnName.ToLower()) - { - case "templateid": - var id = dataRow.IsNull(column) ? 0 : Convert.ToInt64(dataRow[column]); - if (id > 0) - result = id.ToString(); - break; - case "redirecturl": - var url = dataRow.Field(column); - if (!String.IsNullOrWhiteSpace(url)) - result = url; - break; - default: - queryString = queryString.Add(column.ColumnName, dataRow.Field(column)); - break; - } + string value = dataRow[column] == DBNull.Value ? "" : dataRow[column].ToString(); + dict.Add(column.ColumnName, value); } - return result; + return dict; } /// From 500ba9c4bd3cedaa70c8baa878890ea7ed86b39a Mon Sep 17 00:00:00 2001 From: HappyMaarten <144103965+HappyMaarten@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:48:42 +0100 Subject: [PATCH 2/2] review fixes --- .../Middlewares/RewriteUrlToTemplateMiddleware.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs b/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs index d4875ce1..91fb9695 100644 --- a/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs +++ b/GeeksCoreLibrary/Modules/Templates/Middlewares/RewriteUrlToTemplateMiddleware.cs @@ -357,17 +357,17 @@ private async Task> RunRedirectQuery(Template templat var dataTable = await databaseConnection.GetAsync(query); if (dataTable.Rows.Count != 1) - throw new Exception($"Redirect query (id {template.Id}) returned {dataTable.Rows.Count} results, expected one!"); + throw new InvalidOperationException($"Redirect query (id {template.Id}) returned {dataTable.Rows.Count} results, expected one!"); var dataRow = dataTable.Rows[0]; - var dict = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + var queryResults = new Dictionary(StringComparer.InvariantCultureIgnoreCase); foreach (DataColumn column in dataTable.Columns) { string value = dataRow[column] == DBNull.Value ? "" : dataRow[column].ToString(); - dict.Add(column.ColumnName, value); + queryResults.Add(column.ColumnName, value); } - return dict; + return queryResults; } ///