From 1bf69b802251c8cdf9782582c2ef8b512f617e6a Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 14 Aug 2020 16:41:31 +0200 Subject: [PATCH 1/4] Add NetworkError.TimedOut --- .../System.Net.Primitives/ref/System.Net.Primitives.cs | 1 + .../System.Net.Primitives/src/Resources/Strings.resx | 5 ++++- .../System.Net.Primitives/src/System/Net/NetworkError.cs | 3 +++ .../System.Net.Primitives/src/System/Net/NetworkException.cs | 1 + 4 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs index 9127d1bf3ca59c..a480dba1b13fcd 100644 --- a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs +++ b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs @@ -327,6 +327,7 @@ public enum NetworkError : int Unknown = 0, EndPointInUse, HostNotFound, + TimedOut, ConnectionRefused, OperationAborted, ConnectionAborted, diff --git a/src/libraries/System.Net.Primitives/src/Resources/Strings.resx b/src/libraries/System.Net.Primitives/src/Resources/Strings.resx index d0dbe85701a4cd..3dd58cfefbd1ec 100644 --- a/src/libraries/System.Net.Primitives/src/Resources/Strings.resx +++ b/src/libraries/System.Net.Primitives/src/Resources/Strings.resx @@ -115,7 +115,7 @@ An invalid IPEndPoint was specified. - An unknown network error occurred. + A network error has occured, see InnerException for more details. The requested EndPoint is already in use. @@ -135,4 +135,7 @@ The connection was forcibly closed by the remote host. + + The connection attempt has timed out. + diff --git a/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs b/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs index 44bcac8678a289..de4de11ddedd5b 100644 --- a/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs +++ b/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs @@ -15,6 +15,9 @@ public enum NetworkError : int /// No such host is known. HostNotFound, + /// The connection attempt has timed out. + TimedOut, + /// No connection could be made because the remote host actively refused it. ConnectionRefused, diff --git a/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs b/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs index 7b1b48f9379142..b7a5f8d9e8e45f 100644 --- a/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs +++ b/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs @@ -41,6 +41,7 @@ public override void GetObjectData(SerializationInfo serializationInfo, Streamin private static string GetExceptionMessage(NetworkError error) => error switch { NetworkError.EndPointInUse => SR.networkerror_addressinuse, + NetworkError.TimedOut => SR.networkerror_timedout, NetworkError.HostNotFound => SR.networkerror_hostnotfound, NetworkError.ConnectionRefused => SR.networkerror_connectionrefused, NetworkError.ConnectionAborted => SR.networkerror_connectionaborted, From 0709e4380f02522b9ce69519d3860be26585b3e4 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 14 Aug 2020 16:59:45 +0200 Subject: [PATCH 2/4] NetworkError.Unknown -> NetworkError.Other --- .../System.Net.Primitives/ref/System.Net.Primitives.cs | 2 +- .../System.Net.Primitives/src/Resources/Strings.resx | 2 +- .../System.Net.Primitives/src/System/Net/NetworkError.cs | 8 ++++++-- .../src/System/Net/NetworkException.cs | 2 +- .../tests/FunctionalTests/NetworkExceptionTest.cs | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs index a480dba1b13fcd..4abc120c3831fe 100644 --- a/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs +++ b/src/libraries/System.Net.Primitives/ref/System.Net.Primitives.cs @@ -324,7 +324,7 @@ protected TransportContext() { } } public enum NetworkError : int { - Unknown = 0, + Other = 0, EndPointInUse, HostNotFound, TimedOut, diff --git a/src/libraries/System.Net.Primitives/src/Resources/Strings.resx b/src/libraries/System.Net.Primitives/src/Resources/Strings.resx index 3dd58cfefbd1ec..71c69951284b6e 100644 --- a/src/libraries/System.Net.Primitives/src/Resources/Strings.resx +++ b/src/libraries/System.Net.Primitives/src/Resources/Strings.resx @@ -114,7 +114,7 @@ An invalid IPEndPoint was specified. - + A network error has occured, see InnerException for more details. diff --git a/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs b/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs index de4de11ddedd5b..5d1099a3c044ee 100644 --- a/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs +++ b/src/libraries/System.Net.Primitives/src/System/Net/NetworkError.cs @@ -6,8 +6,12 @@ namespace System.Net /// Defines a set of error codes for use with . public enum NetworkError : int { - /// An unknown network error occurred. - Unknown = 0, + /// A network error has occurred. + /// + /// This value indicates a non-generic, implementation-specific error. + /// Details could be obtained from 's inner exception. + /// + Other = 0, /// The requested EndPoint is already in use. EndPointInUse, diff --git a/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs b/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs index b7a5f8d9e8e45f..37855524415c3e 100644 --- a/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs +++ b/src/libraries/System.Net.Primitives/src/System/Net/NetworkException.cs @@ -47,7 +47,7 @@ public override void GetObjectData(SerializationInfo serializationInfo, Streamin NetworkError.ConnectionAborted => SR.networkerror_connectionaborted, NetworkError.ConnectionReset => SR.networkerror_connectionreset, NetworkError.OperationAborted => SR.networkerror_operationaborted, - _ => SR.networkerror_unknown + _ => SR.networkerror_other }; } } diff --git a/src/libraries/System.Net.Primitives/tests/FunctionalTests/NetworkExceptionTest.cs b/src/libraries/System.Net.Primitives/tests/FunctionalTests/NetworkExceptionTest.cs index a7f60c9de1624b..2f5e361d99f737 100644 --- a/src/libraries/System.Net.Primitives/tests/FunctionalTests/NetworkExceptionTest.cs +++ b/src/libraries/System.Net.Primitives/tests/FunctionalTests/NetworkExceptionTest.cs @@ -25,7 +25,7 @@ public static void Create_InnerExceptionAndMessage_Success() const string Message = "Hello"; Exception inner = new Exception(); - NetworkException e = new NetworkException(Message, NetworkError.Unknown, inner); + NetworkException e = new NetworkException(Message, NetworkError.Other, inner); Assert.Equal(inner, e.InnerException); Assert.Equal(Message, e.Message); From c5b5731fc22627a6f7db6739798079bf020b87bd Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 14 Aug 2020 17:07:46 +0200 Subject: [PATCH 3/4] update NetworkErrorHelper and NetworkStream --- src/libraries/Common/src/System/Net/NetworkErrorHelper.cs | 3 ++- .../System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/libraries/Common/src/System/Net/NetworkErrorHelper.cs b/src/libraries/Common/src/System/Net/NetworkErrorHelper.cs index 2e66b7f7a69ee9..0baceeea91650a 100644 --- a/src/libraries/Common/src/System/Net/NetworkErrorHelper.cs +++ b/src/libraries/Common/src/System/Net/NetworkErrorHelper.cs @@ -18,7 +18,8 @@ internal static NetworkException MapSocketException(SocketException socketExcept SocketError.OperationAborted => NetworkError.OperationAborted, SocketError.ConnectionAborted => NetworkError.ConnectionAborted, SocketError.ConnectionReset => NetworkError.ConnectionReset, - _ => NetworkError.Unknown + SocketError.TimedOut => NetworkError.TimedOut, + _ => NetworkError.Other }; return new NetworkException(error, socketException); diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs index e2a3ac6fff45d3..2eb6a180b7ac4f 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/NetworkStream.cs @@ -795,7 +795,7 @@ private void ThrowIfDisposed() private static NetworkException GetCustomNetworkException(string message, Exception? innerException = null) { - return new NetworkException(message, NetworkError.Unknown, innerException); + return new NetworkException(message, NetworkError.Other, innerException); } } } From 4db7628739cb80aae15cce6c94a950a95386ad57 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Fri, 14 Aug 2020 19:39:02 +0200 Subject: [PATCH 4/4] add assertion to ConnectAsync_TimedOut_ThrowsNetworkException --- .../Sockets/SocketsConnectionFactoryTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/libraries/System.Net.Connections/tests/System.Net.Connections.Tests/Sockets/SocketsConnectionFactoryTests.cs b/src/libraries/System.Net.Connections/tests/System.Net.Connections.Tests/Sockets/SocketsConnectionFactoryTests.cs index ce45bfb3e9ed52..9215042fe8e5df 100644 --- a/src/libraries/System.Net.Connections/tests/System.Net.Connections.Tests/Sockets/SocketsConnectionFactoryTests.cs +++ b/src/libraries/System.Net.Connections/tests/System.Net.Connections.Tests/Sockets/SocketsConnectionFactoryTests.cs @@ -134,8 +134,8 @@ public async Task ConnectAsync_TimedOut_ThrowsNetworkException() IPEndPoint doesNotExist = new IPEndPoint(IPAddress.Parse("1.2.3.4"), 23); - // SocketError.TimedOut currently maps to SocketError.Unknown, so no asserion - await Assert.ThrowsAsync(() => factory.ConnectAsync(doesNotExist).AsTask()); + NetworkException ex = await Assert.ThrowsAsync(() => factory.ConnectAsync(doesNotExist).AsTask()); + Assert.Equal(NetworkError.TimedOut, ex.NetworkError); } // On Windows, connection timeout takes 21 seconds. Abusing this behavior to test the cancellation logic