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());
 			}
 		}
 
openSUSE Build Service is sponsored by