Skip to content

Commit

Permalink
Reset all Uri fields when reusing an instance (dotnet#41324)
Browse files Browse the repository at this point in the history
* Reset all Uri fields when reusing an instance

* Test combined Uri's AbsoluteUri
  • Loading branch information
MihaZupan committed Aug 26, 2020
1 parent 5f32450 commit 436f155
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/libraries/System.Private.Uri/src/System/Uri.cs
Original file line number Diff line number Diff line change
Expand Up @@ -504,6 +504,7 @@ private void CreateUri(Uri baseUri, string? relativeUri, bool dontEscape)
_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);
}
Expand Down Expand Up @@ -550,6 +551,7 @@ public Uri(Uri baseUri, Uri relativeUri)
_flags = Flags.Zero;
_info = null!;
_syntax = null!;
_originalUnicodeString = null!;
CreateThis(newUriString, dontEscape, UriKind.Absolute);
DebugSetLeftCtor();
}
Expand Down
2 changes: 2 additions & 0 deletions src/libraries/System.Private.Uri/src/System/UriExt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ private void CreateThis(string? uri, bool dontEscape, UriKind uriKind)

_string = uri ?? string.Empty;

Debug.Assert(_originalUnicodeString is null && _info is null && _syntax is null && _flags == Flags.Zero);

if (dontEscape)
_flags |= Flags.UserEscaped;

Expand Down
19 changes: 19 additions & 0 deletions src/libraries/System.Private.Uri/tests/FunctionalTests/UriTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,25 @@ public static void Uri_EmptyPort_UsesDefaultPort()
Assert.Equal(80, u.Port);
}

[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()
{
Expand Down

0 comments on commit 436f155

Please sign in to comment.