_flags = Flags.Zero;
_info = null!;
_syntax = null!;
+ _originalUnicodeString = null!;
// If not resolved, we reparse modified Uri string and populate Uri internal data.
CreateThis(relativeUri, dontEscape, UriKind.Absolute);
}
_flags = Flags.Zero;
_info = null!;
_syntax = null!;
+ _originalUnicodeString = null!;
CreateThis(newUriString, dontEscape, UriKind.Absolute);
DebugSetLeftCtor();
}
}
[Fact]
+ public static void Uri_CombineUsesNewUriString()
+ {
+ // Tests that internal Uri fields were properly reset during a Combine operation
+ // Otherwise, the wrong Uri string would be used if the relative Uri contains non-ascii characters
+ // This will only affect parsers without the IriParsing flag - only custom parsers
+ UriParser.Register(new GenericUriParser(GenericUriParserOptions.GenericAuthority), "combine-scheme", -1);
+
+ const string BaseUriString = "combine-scheme://foo";
+ const string RelativeUriString = "/relative/uri/with/non/ascii/\u00FC";
+ const string Combined = BaseUriString + "/relative/uri/with/non/ascii/%C3%BC";
+
+ var baseUri = new Uri(BaseUriString, UriKind.Absolute);
+ var relativeUri = new Uri(RelativeUriString, UriKind.Relative);
+
+ Assert.Equal(Combined, new Uri(baseUri, relativeUri).AbsoluteUri);
+ Assert.Equal(Combined, new Uri(baseUri, RelativeUriString).AbsoluteUri);
+ }
+
+ [Fact]
public static void Uri_CachesIdnHost()
{
var uri = new Uri("https://\u00FCnicode/foo");