From 23a8895d293f33e8dfcc4aaf56c6fcb49106e979 Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Thu, 30 Jul 2009 18:16:00 +0000
Subject: * Fixed another potential httpserver leak.

---
 .../Framework/Servers/HttpServer/BaseHttpServer.cs |   7 ++++++-
 .../Framework/Servers/HttpServer/OSHttpResponse.cs |  19 +++++++++++++++++++
 OpenSim/Framework/Servers/Tests/OSHttpTests.cs     |   1 +
 .../Framework/EventQueue/EventQueueGetModule.cs    |   6 ++++--
 bin/HttpServer_OpenSim.dll                         | Bin 113664 -> 113664 bytes
 bin/HttpServer_OpenSim.pdb                         | Bin 304640 -> 304640 bytes
 6 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index d268457..fbd7166 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -1321,6 +1321,7 @@ namespace OpenSim.Framework.Servers.HttpServer
             string responseString = (string)responsedata["str_response_string"];
             string contentType = (string)responsedata["content_type"];
 
+
             if (responsedata.ContainsKey("error_status_text"))
             {
                 response.StatusDescription = (string)responsedata["error_status_text"];
@@ -1336,6 +1337,10 @@ namespace OpenSim.Framework.Servers.HttpServer
                 response.KeepAlive = keepalive;
 
             }
+
+            if (responsedata.ContainsKey("reusecontext"))
+                response.ReuseContext = (bool) responsedata["reusecontext"];
+
             //Even though only one other part of the entire code uses HTTPHandlers, we shouldn't expect this
             //and should check for NullReferenceExceptions
             
@@ -1391,7 +1396,7 @@ namespace OpenSim.Framework.Servers.HttpServer
                     response.OutputStream.Flush();
                     response.Send();
                     
-                    if (!response.KeepAlive)
+                    if (!response.KeepAlive && response.ReuseContext)
                         response.FreeContext();
                 }
                 catch (SocketException e)
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
index 6c90a92..7029289 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpResponse.cs
@@ -256,6 +256,25 @@ namespace OpenSim.Framework.Servers.HttpServer
             }
         }
 
+        public bool ReuseContext
+        {
+            get
+            {
+                if (_httpClientContext != null)
+                {
+                    return !_httpClientContext.EndWhenDone;
+                }
+                return true;
+            }
+            set
+            {
+                if (_httpClientContext != null)
+                {
+                    _httpClientContext.EndWhenDone = !value;
+                }
+            }
+        }
+
 
         protected IHttpResponse _httpResponse;
         private IHttpClientContext _httpClientContext;
diff --git a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
index a6a90dc..e62407a 100644
--- a/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
+++ b/OpenSim/Framework/Servers/Tests/OSHttpTests.cs
@@ -68,6 +68,7 @@ namespace OpenSim.Framework.Servers.Tests
             public void Send(byte[] buffer, int offset, int size) {}
             public void Respond(string httpVersion, HttpStatusCode statusCode, string reason, string body, string contentType) {}
             public void Close() { }
+            public bool EndWhenDone { get { return false;} set { return;}}
 
             public event EventHandler<DisconnectedEventArgs> Disconnected = delegate { };
             /// <summary>
diff --git a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
index c064df1..3f0570e 100644
--- a/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EventQueue/EventQueueGetModule.cs
@@ -375,7 +375,8 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue
             Hashtable responsedata = new Hashtable();
             responsedata["int_response_code"] = 200;
             responsedata["content_type"] = "application/xml";
-            responsedata["keepalive"] = true;
+            responsedata["keepalive"] = false;
+            responsedata["reusecontext"] = false;
             responsedata["str_response_string"] = OSDParser.SerializeLLSDXmlString(events);
             return responsedata;
             //m_log.DebugFormat("[EVENTQUEUE]: sending response for {0} in region {1}: {2}", agentID, m_scene.RegionInfo.RegionName, responsedata["str_response_string"]);
@@ -386,7 +387,8 @@ namespace OpenSim.Region.CoreModules.Framework.EventQueue
             Hashtable responsedata = new Hashtable();
             responsedata["int_response_code"] = 502;
             responsedata["content_type"] = "text/plain";
-            responsedata["keepalive"] = true;
+            responsedata["keepalive"] = false;
+            responsedata["reusecontext"] = false;
             responsedata["str_response_string"] = "Upstream error: ";
             responsedata["error_status_text"] = "Upstream error:";
             responsedata["http_protocol_version"] = "HTTP/1.0";
diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll
index 42b0d86..3933968 100644
Binary files a/bin/HttpServer_OpenSim.dll and b/bin/HttpServer_OpenSim.dll differ
diff --git a/bin/HttpServer_OpenSim.pdb b/bin/HttpServer_OpenSim.pdb
index 0c9e1f4..41a152a 100644
Binary files a/bin/HttpServer_OpenSim.pdb and b/bin/HttpServer_OpenSim.pdb differ
-- 
cgit v1.1