File xsp-lingering-fixes.patch of Package xsp
diff --git a/src/Mono.WebServer/LingeringNetworkStream.cs b/src/Mono.WebServer/LingeringNetworkStream.cs
index e4f4b38..379bcf5 100644
--- a/src/Mono.WebServer/LingeringNetworkStream.cs
+++ b/src/Mono.WebServer/LingeringNetworkStream.cs
@@ -28,16 +28,26 @@
using System;
using System.Net.Sockets;
+using Mono.WebServer.Log;
namespace Mono.WebServer
{
public class LingeringNetworkStream : NetworkStream
{
- const int USECONDS_TO_LINGER = 2000000;
- const int MAX_USECONDS_TO_LINGER = 30000000;
+ static readonly int USECONDS_TO_LINGER = 2000000;
+ static readonly long MAX_USECONDS_TO_LINGER = 30000000;
// We dont actually use the data from this buffer. So we cache it...
static byte [] buffer;
+ static LingeringNetworkStream()
+ {
+ var wait = Environment.GetEnvironmentVariable("XSP_LINGER_WAIT");
+ var maxwait = Environment.GetEnvironmentVariable("XSP_LINGER_WAIT_MAX");
+
+ USECONDS_TO_LINGER = string.IsNullOrWhiteSpace(wait) ? 2000000 : Convert.ToInt32(wait);
+ MAX_USECONDS_TO_LINGER = string.IsNullOrWhiteSpace(maxwait) ? 30000000 : Convert.ToInt64(maxwait);
+ }
+
public LingeringNetworkStream (Socket sock, bool owns) : base (sock, owns)
{
EnableLingering = true;
@@ -50,7 +60,7 @@ namespace Mono.WebServer
void LingeringClose ()
{
- int waited = 0;
+ long waited = 0;
if (!Connected)
return;
@@ -61,8 +71,9 @@ namespace Mono.WebServer
while (waited < MAX_USECONDS_TO_LINGER) {
int nread = 0;
try {
- if (!Socket.Poll (USECONDS_TO_LINGER, SelectMode.SelectRead))
- break;
+ if (!Socket.Poll (USECONDS_TO_LINGER, SelectMode.SelectRead)) {
+ continue;
+ }
if (buffer == null)
buffer = new byte [512];
@@ -73,10 +84,15 @@ namespace Mono.WebServer
if (nread == 0)
break;
- waited += (int) (DateTime.UtcNow - start).TotalMilliseconds * 1000;
+ waited = (long) (DateTime.UtcNow - start).TotalMilliseconds * 1000;
}
- } catch {
- // ignore - we don't care, we're closing anyway
+
+ if (waited >= MAX_USECONDS_TO_LINGER) {
+ Logger.Write(LogLevel.Warning, "LongeringClose: TimedOut while waiting for socket data from: {0}", Socket?.RemoteEndPoint);
+ }
+ }
+ catch (Exception ex) {
+ Logger.Write(LogLevel.Warning, "LongeringClose: Exception thrown while waiting for socket data from: {0}\n{1}", Socket?.RemoteEndPoint, ex.ToString());
}
}