From 99ac770abbe3a95887c4b10c82f3985aa878eeef Mon Sep 17 00:00:00 2001
From: Oren Hurvitz
Date: Sun, 1 Jun 2014 17:39:11 +0300
Subject: Close streams immediately when we finish using them
---
OpenSim/Framework/Communications/RestClient.cs | 29 ++++++-
.../Framework/Servers/HttpServer/BaseHttpServer.cs | 94 ++++++++++++++--------
.../Servers/HttpServer/RestObjectPoster.cs | 28 ++++---
.../Servers/HttpServer/RestObjectPosterResponse.cs | 29 +++----
.../Servers/HttpServer/RestSessionService.cs | 61 +++++++-------
OpenSim/Framework/Util.cs | 53 +++---------
OpenSim/Framework/WebUtil.cs | 7 +-
7 files changed, 164 insertions(+), 137 deletions(-)
(limited to 'OpenSim/Framework')
diff --git a/OpenSim/Framework/Communications/RestClient.cs b/OpenSim/Framework/Communications/RestClient.cs
index e556181..fb79c59 100644
--- a/OpenSim/Framework/Communications/RestClient.cs
+++ b/OpenSim/Framework/Communications/RestClient.cs
@@ -56,7 +56,7 @@ namespace OpenSim.Framework.Communications
/// other threads to execute, while it waits for a response from the web-service. RestClient itself can be
/// invoked by the caller in either synchronous mode or asynchronous modes.
///
- public class RestClient
+ public class RestClient : IDisposable
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -148,6 +148,33 @@ namespace OpenSim.Framework.Communications
#endregion constructors
+
+ #region Dispose
+
+ private bool disposed = false;
+
+ public void Dispose()
+ {
+ Dispose(true);
+ GC.SuppressFinalize(this);
+ }
+
+ protected virtual void Dispose(bool disposing)
+ {
+ if (disposed)
+ return;
+
+ if (disposing)
+ {
+ _resource.Dispose();
+ }
+
+ disposed = true;
+ }
+
+ #endregion Dispose
+
+
///
/// Add a path element to the query, e.g. assets
///
diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index b92c25b..093855c 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -832,28 +832,40 @@ namespace OpenSim.Framework.Servers.HttpServer
return; // never log these; they're just binary data
Stream inputStream = Util.Copy(request.InputStream);
-
- if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
- inputStream = new GZipStream(inputStream, System.IO.Compression.CompressionMode.Decompress);
-
- using (StreamReader reader = new StreamReader(inputStream, Encoding.UTF8))
+ Stream innerStream = null;
+ try
{
- string output;
-
- if (DebugLevel == 5)
+ if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
{
- char[] chars = new char[WebUtil.MaxRequestDiagLength + 1]; // +1 so we know to add "..." only if needed
- int len = reader.Read(chars, 0, WebUtil.MaxRequestDiagLength + 1);
- output = new string(chars, 0, Math.Min(len, WebUtil.MaxRequestDiagLength));
- if (len > WebUtil.MaxRequestDiagLength)
- output += "...";
+ innerStream = inputStream;
+ inputStream = new GZipStream(innerStream, System.IO.Compression.CompressionMode.Decompress);
}
- else
+
+ using (StreamReader reader = new StreamReader(inputStream, Encoding.UTF8))
{
- output = reader.ReadToEnd();
- }
+ string output;
- m_log.DebugFormat("[LOGHTTP] {0}", Util.BinaryToASCII(output));
+ if (DebugLevel == 5)
+ {
+ char[] chars = new char[WebUtil.MaxRequestDiagLength + 1]; // +1 so we know to add "..." only if needed
+ int len = reader.Read(chars, 0, WebUtil.MaxRequestDiagLength + 1);
+ output = new string(chars, 0, Math.Min(len, WebUtil.MaxRequestDiagLength));
+ if (len > WebUtil.MaxRequestDiagLength)
+ output += "...";
+ }
+ else
+ {
+ output = reader.ReadToEnd();
+ }
+
+ m_log.DebugFormat("[LOGHTTP] {0}", Util.BinaryToASCII(output));
+ }
+ }
+ finally
+ {
+ if (innerStream != null)
+ innerStream.Dispose();
+ inputStream.Dispose();
}
}
@@ -981,19 +993,33 @@ namespace OpenSim.Framework.Servers.HttpServer
///
private byte[] HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response)
{
- Stream requestStream = request.InputStream;
+ String requestBody;
- if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
- requestStream = new GZipStream(requestStream, System.IO.Compression.CompressionMode.Decompress);
+ Stream requestStream = request.InputStream;
+ Stream innerStream = null;
+ try
+ {
+ if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip"))
+ {
+ innerStream = requestStream;
+ requestStream = new GZipStream(innerStream, System.IO.Compression.CompressionMode.Decompress);
+ }
- Encoding encoding = Encoding.UTF8;
- StreamReader reader = new StreamReader(requestStream, encoding);
+ using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8))
+ {
+ requestBody = reader.ReadToEnd();
+ }
+ }
+ finally
+ {
+ if (innerStream != null)
+ innerStream.Dispose();
+ requestStream.Dispose();
+ }
- string requestBody = reader.ReadToEnd();
- reader.Close();
- requestStream.Close();
//m_log.Debug(requestBody);
requestBody = requestBody.Replace("", "");
+
string responseString = String.Empty;
XmlRpcRequest xmlRprcRequest = null;
@@ -1089,18 +1115,16 @@ namespace OpenSim.Framework.Servers.HttpServer
response.ContentType = "text/xml";
using (MemoryStream outs = new MemoryStream())
+ using (XmlTextWriter writer = new XmlTextWriter(outs, Encoding.UTF8))
{
- using (XmlTextWriter writer = new XmlTextWriter(outs, Encoding.UTF8))
+ writer.Formatting = Formatting.None;
+ XmlRpcResponseSerializer.Singleton.Serialize(writer, xmlRpcResponse);
+ writer.Flush();
+ outs.Flush();
+ outs.Position = 0;
+ using (StreamReader sr = new StreamReader(outs))
{
- writer.Formatting = Formatting.None;
- XmlRpcResponseSerializer.Singleton.Serialize(writer, xmlRpcResponse);
- writer.Flush();
- outs.Flush();
- outs.Position = 0;
- using (StreamReader sr = new StreamReader(outs))
- {
- responseString = sr.ReadToEnd();
- }
+ responseString = sr.ReadToEnd();
}
}
}
diff --git a/OpenSim/Framework/Servers/HttpServer/RestObjectPoster.cs b/OpenSim/Framework/Servers/HttpServer/RestObjectPoster.cs
index 48ced19..afe052f 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestObjectPoster.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestObjectPoster.cs
@@ -52,23 +52,25 @@ namespace OpenSim.Framework.Servers.HttpServer
request.Method = verb;
request.ContentType = "text/xml";
- MemoryStream buffer = new MemoryStream();
+ using (MemoryStream buffer = new MemoryStream())
+ {
+ XmlWriterSettings settings = new XmlWriterSettings();
+ settings.Encoding = Encoding.UTF8;
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Encoding = Encoding.UTF8;
+ using (XmlWriter writer = XmlWriter.Create(buffer, settings))
+ {
+ XmlSerializer serializer = new XmlSerializer(type);
+ serializer.Serialize(writer, obj);
+ writer.Flush();
+ }
- using (XmlWriter writer = XmlWriter.Create(buffer, settings))
- {
- XmlSerializer serializer = new XmlSerializer(type);
- serializer.Serialize(writer, obj);
- writer.Flush();
- }
+ int length = (int)buffer.Length;
+ request.ContentLength = length;
- int length = (int) buffer.Length;
- request.ContentLength = length;
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer.ToArray(), 0, length);
+ }
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(buffer.ToArray(), 0, length);
// IAsyncResult result = request.BeginGetResponse(AsyncCallback, request);
request.BeginGetResponse(AsyncCallback, request);
}
diff --git a/OpenSim/Framework/Servers/HttpServer/RestObjectPosterResponse.cs b/OpenSim/Framework/Servers/HttpServer/RestObjectPosterResponse.cs
index 451745c..a911b9f 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestObjectPosterResponse.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestObjectPosterResponse.cs
@@ -60,24 +60,25 @@ namespace OpenSim.Framework.Servers.HttpServer
request.ContentType = "text/xml";
request.Timeout = 10000;
- MemoryStream buffer = new MemoryStream();
+ using (MemoryStream buffer = new MemoryStream())
+ {
+ XmlWriterSettings settings = new XmlWriterSettings();
+ settings.Encoding = Encoding.UTF8;
+
+ using (XmlWriter writer = XmlWriter.Create(buffer, settings))
+ {
+ XmlSerializer serializer = new XmlSerializer(type);
+ serializer.Serialize(writer, obj);
+ writer.Flush();
+ }
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Encoding = Encoding.UTF8;
+ int length = (int)buffer.Length;
+ request.ContentLength = length;
- using (XmlWriter writer = XmlWriter.Create(buffer, settings))
- {
- XmlSerializer serializer = new XmlSerializer(type);
- serializer.Serialize(writer, obj);
- writer.Flush();
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer.ToArray(), 0, length);
}
- int length = (int) buffer.Length;
- request.ContentLength = length;
-
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(buffer.ToArray(), 0, length);
- requestStream.Close();
// IAsyncResult result = request.BeginGetResponse(AsyncCallback, request);
request.BeginGetResponse(AsyncCallback, request);
}
diff --git a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
index 83c9848..ad69cd2 100644
--- a/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
+++ b/OpenSim/Framework/Servers/HttpServer/RestSessionService.cs
@@ -77,25 +77,24 @@ namespace OpenSim.Framework.Servers.HttpServer
request.ContentType = "text/xml";
request.Timeout = 20000;
- MemoryStream buffer = new MemoryStream();
-
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Encoding = Encoding.UTF8;
-
- using (XmlWriter writer = XmlWriter.Create(buffer, settings))
+ using (MemoryStream buffer = new MemoryStream())
{
- XmlSerializer serializer = new XmlSerializer(type);
- serializer.Serialize(writer, sobj);
- writer.Flush();
- }
+ XmlWriterSettings settings = new XmlWriterSettings();
+ settings.Encoding = Encoding.UTF8;
- int length = (int)buffer.Length;
- request.ContentLength = length;
+ using (XmlWriter writer = XmlWriter.Create(buffer, settings))
+ {
+ XmlSerializer serializer = new XmlSerializer(type);
+ serializer.Serialize(writer, sobj);
+ writer.Flush();
+ }
+
+ int length = (int)buffer.Length;
+ request.ContentLength = length;
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(buffer.ToArray(), 0, length);
- buffer.Close();
- requestStream.Close();
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer.ToArray(), 0, length);
+ }
TResponse deserial = default(TResponse);
using (WebResponse resp = request.GetResponse())
@@ -133,25 +132,25 @@ namespace OpenSim.Framework.Servers.HttpServer
request.ContentType = "text/xml";
request.Timeout = 10000;
- MemoryStream buffer = new MemoryStream();
+ using (MemoryStream buffer = new MemoryStream())
+ {
+ XmlWriterSettings settings = new XmlWriterSettings();
+ settings.Encoding = Encoding.UTF8;
+
+ using (XmlWriter writer = XmlWriter.Create(buffer, settings))
+ {
+ XmlSerializer serializer = new XmlSerializer(type);
+ serializer.Serialize(writer, sobj);
+ writer.Flush();
+ }
- XmlWriterSettings settings = new XmlWriterSettings();
- settings.Encoding = Encoding.UTF8;
+ int length = (int)buffer.Length;
+ request.ContentLength = length;
- using (XmlWriter writer = XmlWriter.Create(buffer, settings))
- {
- XmlSerializer serializer = new XmlSerializer(type);
- serializer.Serialize(writer, sobj);
- writer.Flush();
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer.ToArray(), 0, length);
}
- buffer.Close();
-
- int length = (int)buffer.Length;
- request.ContentLength = length;
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(buffer.ToArray(), 0, length);
- requestStream.Close();
// IAsyncResult result = request.BeginGetResponse(AsyncCallback, request);
request.BeginGetResponse(AsyncCallback, request);
}
diff --git a/OpenSim/Framework/Util.cs b/OpenSim/Framework/Util.cs
index 9d7de97..5c429ee 100644
--- a/OpenSim/Framework/Util.cs
+++ b/OpenSim/Framework/Util.cs
@@ -509,6 +509,19 @@ namespace OpenSim.Framework
return sb.ToString();
}
+ public static byte[] DocToBytes(XmlDocument doc)
+ {
+ using (MemoryStream ms = new MemoryStream())
+ using (XmlTextWriter xw = new XmlTextWriter(ms, null))
+ {
+ xw.Formatting = Formatting.Indented;
+ doc.WriteTo(xw);
+ xw.Flush();
+
+ return ms.ToArray();
+ }
+ }
+
///
/// Is the platform Windows?
///
@@ -1307,46 +1320,6 @@ namespace OpenSim.Framework
return ret;
}
- public static string Compress(string text)
- {
- byte[] buffer = Util.UTF8.GetBytes(text);
- MemoryStream memory = new MemoryStream();
- using (GZipStream compressor = new GZipStream(memory, CompressionMode.Compress, true))
- {
- compressor.Write(buffer, 0, buffer.Length);
- }
-
- memory.Position = 0;
-
- byte[] compressed = new byte[memory.Length];
- memory.Read(compressed, 0, compressed.Length);
-
- byte[] compressedBuffer = new byte[compressed.Length + 4];
- Buffer.BlockCopy(compressed, 0, compressedBuffer, 4, compressed.Length);
- Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, compressedBuffer, 0, 4);
- return Convert.ToBase64String(compressedBuffer);
- }
-
- public static string Decompress(string compressedText)
- {
- byte[] compressedBuffer = Convert.FromBase64String(compressedText);
- using (MemoryStream memory = new MemoryStream())
- {
- int msgLength = BitConverter.ToInt32(compressedBuffer, 0);
- memory.Write(compressedBuffer, 4, compressedBuffer.Length - 4);
-
- byte[] buffer = new byte[msgLength];
-
- memory.Position = 0;
- using (GZipStream decompressor = new GZipStream(memory, CompressionMode.Decompress))
- {
- decompressor.Read(buffer, 0, buffer.Length);
- }
-
- return Util.UTF8.GetString(buffer);
- }
- }
-
///
/// Copy data from one stream to another, leaving the read position of both streams at the beginning.
///
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index e614fd5..d683152 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -176,7 +176,8 @@ namespace OpenSim.Framework
public static void LogOutgoingDetail(string context, Stream outputStream)
{
- using (StreamReader reader = new StreamReader(Util.Copy(outputStream), Encoding.UTF8))
+ using (Stream stream = Util.Copy(outputStream))
+ using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string output;
@@ -262,12 +263,12 @@ namespace OpenSim.Framework
using (MemoryStream ms = new MemoryStream())
{
- using (GZipStream comp = new GZipStream(ms, CompressionMode.Compress))
+ using (GZipStream comp = new GZipStream(ms, CompressionMode.Compress, true))
{
comp.Write(buffer, 0, buffer.Length);
// We need to close the gzip stream before we write it anywhere
// because apparently something important related to gzip compression
- // gets written on the strteam upon Dispose()
+ // gets written on the stream upon Dispose()
}
byte[] buf = ms.ToArray();
request.ContentLength = buf.Length; //Count bytes to send
--
cgit v1.1