Skip to content

Commit 154e971

Browse files
authored
Add parsing of zero port for unknown Uri scheme (#40986)
Fixes #37865
1 parent a949686 commit 154e971

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

src/libraries/System.Private.Uri/src/System/Uri.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2265,7 +2265,7 @@ private unsafe void CreateUriInfo(Flags cF)
22652265
}
22662266
}
22672267
}
2268-
if (notEmpty && info.Offset.PortValue != port)
2268+
if (notEmpty && _syntax.DefaultPort != port)
22692269
{
22702270
info.Offset.PortValue = (ushort)port;
22712271
cF |= Flags.NotDefaultPort;

src/libraries/System.Private.Uri/tests/FunctionalTests/UriGetComponentsTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ public void GetComponents_UnknownScheme_ComponentsUnaffected()
6161
testUri = new Uri("abc://127.00.000.001:01234");
6262
Assert.Equal("127.00.000.001:1234", testUri.Authority);
6363

64-
// Known limitation: port 0 is ignored.
64+
// Port 0 is parsed correctly.
6565
testUri = new Uri("cbd://127.00.1.2:0000");
66-
Assert.Equal("127.00.1.2", testUri.Authority);
66+
Assert.Equal("127.00.1.2:0", testUri.Authority);
6767
testUri = new Uri("cbd://127.00.1.2:0");
68-
Assert.Equal("127.00.1.2", testUri.Authority);
68+
Assert.Equal("127.00.1.2:0", testUri.Authority);
6969

7070
testUri = new Uri("eb://[0000::01:123.32.123.23]/dir");
7171
Assert.Equal("[::1:7b20:7b17]", testUri.Authority);

src/libraries/System.Private.Uri/tests/FunctionalTests/UriTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,5 +818,23 @@ public static void FilePathHandlesNonAscii(string uriString, string toString, st
818818
Assert.Equal(absoluteUri, uri2.AbsoluteUri);
819819
Assert.Equal(localPath, uri2.LocalPath);
820820
}
821+
822+
public static IEnumerable<object[]> ZeroPortIsParsedForBothKnownAndUnknownSchemes_TestData()
823+
{
824+
yield return new object[] { "http://example.com:0", 0, false };
825+
yield return new object[] { "http://example.com", 80, true };
826+
yield return new object[] { "rtsp://example.com:0", 0, false };
827+
yield return new object[] { "rtsp://example.com", -1, true };
828+
}
829+
830+
[Theory]
831+
[MemberData(nameof(ZeroPortIsParsedForBothKnownAndUnknownSchemes_TestData))]
832+
public static void ZeroPortIsParsedForBothKnownAndUnknownSchemes(string uriString, int port, bool isDefaultPort)
833+
{
834+
Uri.TryCreate(uriString, UriKind.Absolute, out var uri);
835+
Assert.Equal(port, uri.Port);
836+
Assert.Equal(isDefaultPort, uri.IsDefaultPort);
837+
Assert.Equal(uriString + "/", uri.ToString());
838+
}
821839
}
822840
}

0 commit comments

Comments
 (0)