From 45f8a37ffe1df0c632f78f5b8f017656f6414297 Mon Sep 17 00:00:00 2001 From: Tomas Weinfurt Date: Sun, 15 Nov 2020 09:50:22 -0800 Subject: [PATCH] improve parsing network files on WSL (#44680) * improve parsing network files on WSL * Apply suggestions from code review Co-authored-by: Stephen Toub --- .../StringParsingHelpers.Connections.cs | 43 +++++++++++++++++-- .../ConnectionsParsingTests.cs | 16 +++++++ .../tests/FunctionalTests/NetworkFiles/empty | 0 3 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/NetworkFiles/empty diff --git a/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/StringParsingHelpers.Connections.cs b/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/StringParsingHelpers.Connections.cs index 5f2548e5102b7..f48a231517ef2 100644 --- a/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/StringParsingHelpers.Connections.cs +++ b/src/libraries/System.Net.NetworkInformation/src/System/Net/NetworkInformation/StringParsingHelpers.Connections.cs @@ -42,8 +42,20 @@ internal static TcpConnectionInformation[] ParseActiveTcpConnectionsFromFiles(st string tcp6FileContents = File.ReadAllText(tcp6ConnectionsFile); string[] v6connections = tcp6FileContents.Split(s_newLineSeparator, StringSplitOptions.RemoveEmptyEntries); + // First line is header in each file. On WSL, this file may be empty. + int count = 0; + if (v4connections.Length > 0) + { + count += v4connections.Length - 1; + } + + if (v6connections.Length > 0) + { + count += v6connections.Length - 1; + } + // First line is header in each file. - TcpConnectionInformation[] connections = new TcpConnectionInformation[v4connections.Length + v6connections.Length - 2]; + TcpConnectionInformation[] connections = new TcpConnectionInformation[count]; int index = 0; int skip = 0; @@ -98,8 +110,20 @@ internal static IPEndPoint[] ParseActiveTcpListenersFromFiles(string tcp4Connect string tcp6FileContents = File.ReadAllText(tcp6ConnectionsFile); string[] v6connections = tcp6FileContents.Split(s_newLineSeparator, StringSplitOptions.RemoveEmptyEntries); + // First line is header in each file. On WSL, this file may be empty. + int count = 0; + if (v4connections.Length > 0) + { + count += v4connections.Length - 1; + } + + if (v6connections.Length > 0) + { + count += v6connections.Length - 1; + } + // First line is header in each file. - IPEndPoint[] endPoints = new IPEndPoint[v4connections.Length + v6connections.Length - 2]; + IPEndPoint[] endPoints = new IPEndPoint[count]; int index = 0; int skip = 0; @@ -154,8 +178,19 @@ public static IPEndPoint[] ParseActiveUdpListenersFromFiles(string udp4File, str string udp6FileContents = File.ReadAllText(udp6File); string[] v6connections = udp6FileContents.Split(s_newLineSeparator, StringSplitOptions.RemoveEmptyEntries); - // First line is header in each file. - IPEndPoint[] endPoints = new IPEndPoint[v4connections.Length + v6connections.Length - 2]; + // First line is header in each file. On WSL, this file may be empty. + int count = 0; + if (v4connections.Length > 0) + { + count += v4connections.Length - 1; + } + + if (v6connections.Length > 0) + { + count += v6connections.Length - 1; + } + + IPEndPoint[] endPoints = new IPEndPoint[count]; int index = 0; // UDP Connections diff --git a/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs b/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs index ce5cc09543835..6a5764c98d91b 100644 --- a/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs +++ b/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/ConnectionsParsingTests.cs @@ -128,6 +128,22 @@ public void UdpListenersParsing() Assert.Equal(listeners[16], new IPEndPoint(IPAddress.Parse("fe80::215:5dff:fe00:402"), 123)); } + [Fact] + public void WSLListenersParsing() + { + // WSL1 may have files empty + string emptyFile = GetTestFilePath(); + FileUtil.NormalizeLineEndings("NetworkFiles/empty", emptyFile); + + IPEndPoint[] tcpListeners = StringParsingHelpers.ParseActiveTcpListenersFromFiles(emptyFile, emptyFile); + IPEndPoint[] udpListeners = StringParsingHelpers.ParseActiveUdpListenersFromFiles(emptyFile, emptyFile); + TcpConnectionInformation[] tcpConnections = StringParsingHelpers.ParseActiveTcpConnectionsFromFiles(emptyFile, emptyFile); + + Assert.Equal(0, tcpListeners.Length); + Assert.Equal(0, udpListeners.Length); + Assert.Equal(0, tcpConnections.Length); + } + private static void ValidateInfo(TcpConnectionInformation tcpConnectionInformation, IPEndPoint localEP, IPEndPoint remoteEP, TcpState state) { Assert.Equal(localEP, tcpConnectionInformation.LocalEndPoint); diff --git a/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/NetworkFiles/empty b/src/libraries/System.Net.NetworkInformation/tests/FunctionalTests/NetworkFiles/empty new file mode 100644 index 0000000000000..e69de29bb2d1d