refactor: More consistently use using construct within WebUtil to match other existing code there.

0.8.0.3
Justin Clark-Casey (justincc) 2014-02-27 22:52:43 +00:00
parent 1f4f09ad69
commit 5fafea6631
1 changed files with 236 additions and 243 deletions

View File

@ -794,172 +794,166 @@ namespace OpenSim.Framework
if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections) if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections)
ht.ServicePoint.ConnectionLimit = maxConnections; ht.ServicePoint.ConnectionLimit = maxConnections;
WebResponse response = null;
TResponse deserial = default(TResponse); TResponse deserial = default(TResponse);
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
request.Method = verb; request.Method = verb;
MemoryStream buffer = null; MemoryStream buffer = null;
if (verb == "POST") try
{ {
request.ContentType = "text/xml"; if (verb == "POST")
buffer = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
{ {
XmlSerializer serializer = new XmlSerializer(type); request.ContentType = "text/xml";
serializer.Serialize(writer, obj);
writer.Flush();
}
int length = (int)buffer.Length; buffer = new MemoryStream();
request.ContentLength = length;
if (WebUtil.DebugLevel >= 5) XmlWriterSettings settings = new XmlWriterSettings();
WebUtil.LogOutgoingDetail(buffer); settings.Encoding = Encoding.UTF8;
request.BeginGetRequestStream(delegate(IAsyncResult res) using (XmlWriter writer = XmlWriter.Create(buffer, settings))
{
Stream requestStream = request.EndGetRequestStream(res);
requestStream.Write(buffer.ToArray(), 0, length);
requestStream.Close();
// capture how much time was spent writing
tickdata = Util.EnvironmentTickCountSubtract(tickstart);
request.BeginGetResponse(delegate(IAsyncResult ar)
{ {
response = request.EndGetResponse(ar); XmlSerializer serializer = new XmlSerializer(type);
Stream respStream = null; serializer.Serialize(writer, obj);
try writer.Flush();
{
respStream = response.GetResponseStream();
deserial = (TResponse)deserializer.Deserialize(
respStream);
}
catch (System.InvalidOperationException)
{
}
finally
{
// Let's not close this
//buffer.Close();
respStream.Close();
response.Close();
}
action(deserial);
}, null);
}, null);
}
else
{
request.BeginGetResponse(delegate(IAsyncResult res2)
{
try
{
// If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
// documented in MSDN
response = request.EndGetResponse(res2);
Stream respStream = null;
try
{
respStream = response.GetResponseStream();
deserial = (TResponse)deserializer.Deserialize(respStream);
}
catch (System.InvalidOperationException)
{
}
finally
{
respStream.Close();
response.Close();
}
} }
catch (WebException e)
int length = (int)buffer.Length;
request.ContentLength = length;
if (WebUtil.DebugLevel >= 5)
WebUtil.LogOutgoingDetail(buffer);
request.BeginGetRequestStream(delegate(IAsyncResult res)
{ {
if (e.Status == WebExceptionStatus.ProtocolError) using (Stream requestStream = request.EndGetRequestStream(res))
requestStream.Write(buffer.ToArray(), 0, length);
// capture how much time was spent writing
tickdata = Util.EnvironmentTickCountSubtract(tickstart);
request.BeginGetResponse(delegate(IAsyncResult ar)
{ {
if (e.Response is HttpWebResponse) using (WebResponse response = request.EndGetResponse(ar))
{ {
using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response) try
{ {
if (httpResponse.StatusCode != HttpStatusCode.NotFound) using (Stream respStream = response.GetResponseStream())
{ deserial = (TResponse)deserializer.Deserialize(respStream);
// We don't appear to be handling any other status codes, so log these feailures to that }
// people don't spend unnecessary hours hunting phantom bugs. catch (System.InvalidOperationException)
m_log.DebugFormat( {
"[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", }
verb, requestUrl, httpResponse.StatusCode); }
}
action(deserial);
}, null);
}, null);
}
else
{
request.BeginGetResponse(delegate(IAsyncResult res2)
{
try
{
// If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
// documented in MSDN
using (WebResponse response = request.EndGetResponse(res2))
{
try
{
using (Stream respStream = response.GetResponseStream())
deserial = (TResponse)deserializer.Deserialize(respStream);
}
catch (System.InvalidOperationException)
{
} }
} }
} }
else catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
if (e.Response is HttpWebResponse)
{
using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response)
{
if (httpResponse.StatusCode != HttpStatusCode.NotFound)
{
// We don't appear to be handling any other status codes, so log these feailures to that
// people don't spend unnecessary hours hunting phantom bugs.
m_log.DebugFormat(
"[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}",
verb, requestUrl, httpResponse.StatusCode);
}
}
}
}
else
{
m_log.ErrorFormat(
"[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}",
verb, requestUrl, e.Status, e.Message);
}
}
catch (Exception e)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}",
verb, requestUrl, e.Status, e.Message); verb, requestUrl, e.Message, e.StackTrace);
} }
}
catch (Exception e) // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
{
m_log.ErrorFormat(
"[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}",
verb, requestUrl, e.Message, e.StackTrace);
}
// m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
try try
{ {
action(deserial); action(deserial);
} }
catch (Exception e) catch (Exception e)
{ {
m_log.ErrorFormat( m_log.ErrorFormat(
"[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}", "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}",
verb, requestUrl, e.Message, e.StackTrace); verb, requestUrl, e.Message, e.StackTrace);
} }
}, null); }, null);
}
int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
if (tickdiff > WebUtil.LongCallTime)
{
string originalRequest = null;
if (buffer != null)
{
originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
} }
m_log.InfoFormat( int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
"[ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", if (tickdiff > WebUtil.LongCallTime)
reqnum, {
verb, string originalRequest = null;
requestUrl,
tickdiff, if (buffer != null)
tickdata, {
originalRequest); originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
}
m_log.InfoFormat(
"[ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
reqnum,
verb,
requestUrl,
tickdiff,
tickdata,
originalRequest);
}
else if (WebUtil.DebugLevel >= 4)
{
m_log.DebugFormat(
"[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing",
reqnum, tickdiff, tickdata);
}
} }
else if (WebUtil.DebugLevel >= 4) finally
{ {
m_log.DebugFormat( if (buffer != null)
"[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", buffer.Dispose();
reqnum, tickdiff, tickdata);
} }
} }
} }
@ -1056,11 +1050,6 @@ namespace OpenSim.Framework
"[FORMS]: Exception occured on receiving {0} {1}: {2}{3}", "[FORMS]: Exception occured on receiving {0} {1}: {2}{3}",
verb, requestUrl, e.Message, e.StackTrace); verb, requestUrl, e.Message, e.StackTrace);
} }
finally
{
if (respStream != null)
respStream.Close();
}
} }
} }
} }
@ -1145,128 +1134,132 @@ namespace OpenSim.Framework
request.Method = verb; request.Method = verb;
MemoryStream buffer = null; MemoryStream buffer = null;
if ((verb == "POST") || (verb == "PUT")) try
{ {
request.ContentType = "text/xml"; if ((verb == "POST") || (verb == "PUT"))
buffer = new MemoryStream();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
using (XmlWriter writer = XmlWriter.Create(buffer, settings))
{ {
XmlSerializer serializer = new XmlSerializer(type); request.ContentType = "text/xml";
serializer.Serialize(writer, obj);
writer.Flush(); 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();
}
int length = (int)buffer.Length;
request.ContentLength = length;
if (WebUtil.DebugLevel >= 5)
WebUtil.LogOutgoingDetail(buffer);
try
{
using (Stream requestStream = request.GetRequestStream())
requestStream.Write(buffer.ToArray(), 0, length);
}
catch (Exception e)
{
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}",
verb, requestUrl, e.Message, e.StackTrace);
return deserial;
}
finally
{
// capture how much time was spent writing
tickdata = Util.EnvironmentTickCountSubtract(tickstart);
}
} }
int length = (int)buffer.Length;
request.ContentLength = length;
if (WebUtil.DebugLevel >= 5)
WebUtil.LogOutgoingDetail(buffer);
Stream requestStream = null;
try try
{ {
requestStream = request.GetRequestStream(); using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
requestStream.Write(buffer.ToArray(), 0, length); {
if (resp.ContentLength != 0)
{
using (Stream respStream = resp.GetResponseStream())
{
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
deserial = (TResponse)deserializer.Deserialize(respStream);
}
}
else
{
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}",
verb, requestUrl);
}
}
}
catch (WebException e)
{
using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
{
if (hwr != null && hwr.StatusCode == HttpStatusCode.NotFound)
return deserial;
else
m_log.ErrorFormat(
"[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}",
verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace);
}
}
catch (System.InvalidOperationException)
{
// This is what happens when there is invalid XML
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}",
verb, requestUrl, typeof(TResponse).ToString());
} }
catch (Exception e) catch (Exception e)
{ {
m_log.DebugFormat( m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}", "[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}",
verb, requestUrl, e.Message, e.StackTrace); verb, requestUrl, e.Message, e.StackTrace);
return deserial;
} }
finally
{
if (requestStream != null)
requestStream.Dispose();
// capture how much time was spent writing int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
tickdata = Util.EnvironmentTickCountSubtract(tickstart); if (tickdiff > WebUtil.LongCallTime)
}
}
try
{
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
{ {
if (resp.ContentLength != 0) string originalRequest = null;
if (buffer != null)
{ {
using (Stream respStream = resp.GetResponseStream()) originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
{
XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
deserial = (TResponse)deserializer.Deserialize(respStream); originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
}
}
else
{
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}",
verb, requestUrl);
} }
m_log.InfoFormat(
"[SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
reqnum,
verb,
requestUrl,
tickdiff,
tickdata,
originalRequest);
} }
} else if (WebUtil.DebugLevel >= 4)
catch (WebException e)
{
using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
{ {
if (hwr != null && hwr.StatusCode == HttpStatusCode.NotFound) m_log.DebugFormat(
return deserial; "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing",
else reqnum, tickdiff, tickdata);
m_log.ErrorFormat(
"[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}",
verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace);
} }
} }
catch (System.InvalidOperationException) finally
{ {
// This is what happens when there is invalid XML
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}",
verb, requestUrl, typeof(TResponse).ToString());
}
catch (Exception e)
{
m_log.DebugFormat(
"[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}",
verb, requestUrl, e.Message, e.StackTrace);
}
int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
if (tickdiff > WebUtil.LongCallTime)
{
string originalRequest = null;
if (buffer != null) if (buffer != null)
{ buffer.Dispose();
originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
}
m_log.InfoFormat(
"[SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
reqnum,
verb,
requestUrl,
tickdiff,
tickdata,
originalRequest);
}
else if (WebUtil.DebugLevel >= 4)
{
m_log.DebugFormat(
"[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing",
reqnum, tickdiff, tickdata);
} }
return deserial; return deserial;
} }
} }
} }