@@ -41,23 +41,40 @@ public static bool ToUriOrPath(Uri candidateUri, out Uri uri, out string path, s
4141 }
4242 }
4343
44- public static Url Combine ( this Url uri , string relativeUri )
44+ public static Url Combine ( this Url baseUri , string relativeUri , bool preserveBaseQuery = true , bool forcePreserveBaseQuery = false )
4545 {
46- var builder = uri . UriBuilder ;
47- builder . Path = UriCombine ( builder . Path , relativeUri ) ;
48- return builder . Uri ;
46+ return baseUri . Uri . Combine ( relativeUri , preserveBaseQuery , forcePreserveBaseQuery ) ;
4947 }
5048
51- public static Uri Combine ( this Uri uri , string relativeUri )
49+ public static Uri Combine ( this Uri baseUri , string relativeUri , bool preserveBaseQuery = true , bool forcePreserveBaseQuery = false )
5250 {
53- var builder = new UriBuilder ( uri ) ;
54- builder . Path = UriCombine ( builder . Path , relativeUri ) ;
55- return builder . Uri ;
51+ if ( ( ! forcePreserveBaseQuery || string . IsNullOrEmpty ( baseUri . Query ) )
52+ && relativeUri ? . Contains ( ":" ) == true )
53+ {
54+ return new Uri ( relativeUri ) ;
55+ }
56+
57+ var result = new Uri ( baseUri . EnsureTrailingSlash ( ) , relativeUri ) ;
58+ if ( preserveBaseQuery && ! string . IsNullOrEmpty ( baseUri . Query ) )
59+ {
60+ var builder = new UriBuilder ( result ) ;
61+ builder . Query = CombineQuery ( baseUri . Query , builder . Query ) ;
62+ return builder . Uri ;
63+ }
64+
65+ return result ;
66+ }
67+
68+ public static string CombineQuery ( string query1 , string query2 )
69+ {
70+ if ( string . IsNullOrEmpty ( query1 ) ) return query2 ;
71+ else if ( string . IsNullOrEmpty ( query2 ) ) return query1 ;
72+ else return $ "{ query1 } &{ query2 . AsSpan ( ) . TrimStart ( '?' ) } ";
5673 }
5774
5875 public static Uri RemoveQuery ( Url uri )
5976 {
60- return new Uri ( uri . Uri . GetLeftPart ( UriPartial . Path ) ) ;
77+ return new Uri ( uri . UriString . AsSpan ( ) . SubstringBeforeFirstIndexOfAny ( "?" ) . ToString ( ) ) ;
6178 }
6279
6380 public static Uri WithoutQuery ( this Uri uri )
0 commit comments