Handle EPIPE like ECONNRESET on Linux (#2112)

This commit is contained in:
Stephen Halter 2017-10-13 15:07:21 -07:00 committed by GitHub
parent 9dfffd14bb
commit 733ac1efab
3 changed files with 20 additions and 2 deletions

View File

@ -162,7 +162,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
handle.Libuv.Check(status, out var uvError); handle.Libuv.Check(status, out var uvError);
// Log connection resets at a lower (Debug) level. // Log connection resets at a lower (Debug) level.
if (status == LibuvConstants.ECONNRESET) if (LibuvConstants.IsConnectionReset(status))
{ {
Log.ConnectionReset(ConnectionId); Log.ConnectionReset(ConnectionId);
error = new ConnectionResetException(uvError.Message, uvError); error = new ConnectionResetException(uvError.Message, uvError);

View File

@ -1,6 +1,7 @@
// Copyright (c) .NET Foundation. All rights reserved. // Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
@ -13,6 +14,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
public static readonly int? ECONNRESET = GetECONNRESET(); public static readonly int? ECONNRESET = GetECONNRESET();
public static readonly int? EADDRINUSE = GetEADDRINUSE(); public static readonly int? EADDRINUSE = GetEADDRINUSE();
public static readonly int? ENOTSUP = GetENOTSUP(); public static readonly int? ENOTSUP = GetENOTSUP();
public static readonly int? EPIPE = GetEPIPE();
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool IsConnectionReset(int errno)
{
return errno == ECONNRESET || errno == EPIPE;
}
private static int? GetECONNRESET() private static int? GetECONNRESET()
{ {
@ -31,6 +39,16 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
return null; return null;
} }
private static int? GetEPIPE()
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
return -32;
}
return null;
}
private static int? GetEADDRINUSE() private static int? GetEADDRINUSE()
{ {
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))

View File

@ -118,7 +118,7 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Libuv.Internal
else else
{ {
// Log connection resets at a lower (Debug) level. // Log connection resets at a lower (Debug) level.
if (status == LibuvConstants.ECONNRESET) if (LibuvConstants.IsConnectionReset(status))
{ {
_log.ConnectionReset(_connectionId); _log.ConnectionReset(_connectionId);
} }