1- using System . Reflection ;
2- using System . Text . RegularExpressions ;
3- using System . Web ;
1+ using System . Text . RegularExpressions ;
42using Microsoft . AspNetCore . Routing ;
53using Microsoft . AspNetCore . WebUtilities ;
64using 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