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 ++++-- 4 files changed, 30 insertions(+), 3 deletions(-) (limited to 'OpenSim') 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 Disconnected = delegate { }; /// 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"; -- cgit v1.1