Skip to content

Commit 7141336

Browse files
Refactor: Update ParseUrlParams to use Uri type and leverage Uri properties where possible
1 parent 618f8c8 commit 7141336

1 file changed

Lines changed: 42 additions & 20 deletions

File tree

src/Sitecore.AspNetCore.SDK.RenderingEngine/Extensions/SitecoreFieldExtensions.cs

Lines changed: 42 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System.Reflection;
2-
using System.Text.RegularExpressions;
3-
using System.Web;
1+
using System.Text.RegularExpressions;
42
using Microsoft.AspNetCore.Routing;
53
using Microsoft.AspNetCore.WebUtilities;
64
using Sitecore.AspNetCore.SDK.LayoutService.Client.Response.Model.Fields;
@@ -85,9 +83,9 @@ private static void AddParametersToResult(Dictionary<string, object?> result, ob
8583
return;
8684
}
8785

88-
if (parameters is Dictionary<string, object> paramDict)
86+
if (parameters is Dictionary<string, object?> paramDict)
8987
{
90-
foreach (KeyValuePair<string, object> kvp in paramDict)
88+
foreach (KeyValuePair<string, object?> kvp in paramDict)
9189
{
9290
if (!skipNullValues || kvp.Value != null)
9391
{
@@ -151,7 +149,13 @@ private static string GetSitecoreMediaUriWithPreservation(string urlStr, object?
151149

152150
// Parse existing query parameters and build merged parameters dictionary
153151
Dictionary<string, object?> mergedParams = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
154-
string url = ParseUrlParams(urlStr, mergedParams);
152+
Uri? uri = null;
153+
if (!string.IsNullOrEmpty(urlStr))
154+
{
155+
Uri.TryCreate(urlStr, UriKind.RelativeOrAbsolute, out uri);
156+
}
157+
158+
string url = ParseUrlParams(uri, mergedParams);
155159

156160
// Add new parameters (these will override existing ones)
157161
AddParametersToResult(mergedParams, parameters, skipNullValues: true);
@@ -171,32 +175,50 @@ private static string GetSitecoreMediaUriWithPreservation(string urlStr, object?
171175
/// <summary>
172176
/// Parses URL query string parameters and adds them to the provided dictionary.
173177
/// </summary>
174-
/// <param name="url">The full URL with potential query parameters.</param>
178+
/// <param name="uri">The Uri with potential query parameters.</param>
175179
/// <param name="parameters">The dictionary to add parsed parameters to.</param>
176180
/// <returns>The URL without query parameters.</returns>
177-
private static string ParseUrlParams(string url, Dictionary<string, object?> parameters)
181+
private static string ParseUrlParams(Uri? uri, Dictionary<string, object?> parameters)
178182
{
179-
if (string.IsNullOrEmpty(url))
183+
if (uri == null)
180184
{
181-
return url;
185+
return string.Empty;
182186
}
183187

184-
int queryIndex = url.IndexOf('?');
185-
if (queryIndex < 0)
188+
string urlWithoutQuery;
189+
string? query = null;
190+
191+
if (uri.IsAbsoluteUri)
186192
{
187-
return url;
193+
urlWithoutQuery = uri.GetLeftPart(UriPartial.Path);
194+
query = uri.Query;
195+
}
196+
else
197+
{
198+
// For relative URIs, manually split on '?'
199+
var original = uri.OriginalString;
200+
int idx = original.IndexOf('?');
201+
if (idx >= 0)
202+
{
203+
urlWithoutQuery = original.Substring(0, idx);
204+
query = original.Substring(idx);
205+
}
206+
else
207+
{
208+
urlWithoutQuery = original;
209+
}
188210
}
189211

190-
string cleanUrl = url.Substring(0, queryIndex);
191-
string queryString = url.Substring(queryIndex);
192-
193-
Dictionary<string, Microsoft.Extensions.Primitives.StringValues> parsedQuery = QueryHelpers.ParseQuery(queryString);
194-
foreach (KeyValuePair<string, Microsoft.Extensions.Primitives.StringValues> kvp in parsedQuery)
212+
if (!string.IsNullOrEmpty(query))
195213
{
196-
parameters[kvp.Key] = kvp.Value.Count > 0 ? kvp.Value[0] : null;
214+
var parsedQuery = QueryHelpers.ParseQuery(query);
215+
foreach (var kvp in parsedQuery)
216+
{
217+
parameters[kvp.Key] = kvp.Value.Count > 0 ? kvp.Value[0] : null;
218+
}
197219
}
198220

199-
return cleanUrl;
221+
return urlWithoutQuery;
200222
}
201223

202224
/// <summary>

0 commit comments

Comments
 (0)