aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/WebUtil.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/WebUtil.cs')
-rw-r--r--OpenSim/Framework/WebUtil.cs236
1 files changed, 150 insertions, 86 deletions
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 768ff16..d7f6bc8 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -39,7 +39,9 @@ using System.Text;
39using System.Web; 39using System.Web;
40using System.Xml; 40using System.Xml;
41using System.Xml.Serialization; 41using System.Xml.Serialization;
42using System.Xml.Linq;
42using log4net; 43using log4net;
44using Nwc.XmlRpc;
43using OpenMetaverse.StructuredData; 45using OpenMetaverse.StructuredData;
44using XMLResponseHelper = OpenSim.Framework.SynchronousRestObjectRequester.XMLResponseHelper; 46using XMLResponseHelper = OpenSim.Framework.SynchronousRestObjectRequester.XMLResponseHelper;
45 47
@@ -127,41 +129,41 @@ namespace OpenSim.Framework
127 /// </summary> 129 /// </summary>
128 public static OSDMap PutToServiceCompressed(string url, OSDMap data, int timeout) 130 public static OSDMap PutToServiceCompressed(string url, OSDMap data, int timeout)
129 { 131 {
130 return ServiceOSDRequest(url,data, "PUT", timeout, true); 132 return ServiceOSDRequest(url,data, "PUT", timeout, true, false);
131 } 133 }
132 134
133 public static OSDMap PutToService(string url, OSDMap data, int timeout) 135 public static OSDMap PutToService(string url, OSDMap data, int timeout)
134 { 136 {
135 return ServiceOSDRequest(url,data, "PUT", timeout, false); 137 return ServiceOSDRequest(url,data, "PUT", timeout, false, false);
136 } 138 }
137 139
138 public static OSDMap PostToService(string url, OSDMap data, int timeout) 140 public static OSDMap PostToService(string url, OSDMap data, int timeout, bool rpc)
139 { 141 {
140 return ServiceOSDRequest(url, data, "POST", timeout, false); 142 return ServiceOSDRequest(url, data, "POST", timeout, false, rpc);
141 } 143 }
142 144
143 public static OSDMap PostToServiceCompressed(string url, OSDMap data, int timeout) 145 public static OSDMap PostToServiceCompressed(string url, OSDMap data, int timeout)
144 { 146 {
145 return ServiceOSDRequest(url, data, "POST", timeout, true); 147 return ServiceOSDRequest(url, data, "POST", timeout, true, false);
146 } 148 }
147 149
148 public static OSDMap GetFromService(string url, int timeout) 150 public static OSDMap GetFromService(string url, int timeout)
149 { 151 {
150 return ServiceOSDRequest(url, null, "GET", timeout, false); 152 return ServiceOSDRequest(url, null, "GET", timeout, false, false);
151 } 153 }
152 154
153 public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed) 155 public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout, bool compressed, bool rpc)
154 { 156 {
155 if (SerializeOSDRequestsPerEndpoint) 157 if (SerializeOSDRequestsPerEndpoint)
156 { 158 {
157 lock (EndPointLock(url)) 159 lock (EndPointLock(url))
158 { 160 {
159 return ServiceOSDRequestWorker(url, data, method, timeout, compressed); 161 return ServiceOSDRequestWorker(url, data, method, timeout, compressed, rpc);
160 } 162 }
161 } 163 }
162 else 164 else
163 { 165 {
164 return ServiceOSDRequestWorker(url, data, method, timeout, compressed); 166 return ServiceOSDRequestWorker(url, data, method, timeout, compressed, rpc);
165 } 167 }
166 } 168 }
167 169
@@ -191,9 +193,9 @@ namespace OpenSim.Framework
191 } 193 }
192 } 194 }
193 195
194 public static void LogOutgoingDetail(string output) 196 public static void LogOutgoingDetail(string type, int reqnum, string output)
195 { 197 {
196 LogOutgoingDetail("", output); 198 LogOutgoingDetail(string.Format("{0} {1}: ", type, reqnum), output);
197 } 199 }
198 200
199 public static void LogOutgoingDetail(string context, string output) 201 public static void LogOutgoingDetail(string context, string output)
@@ -207,24 +209,24 @@ namespace OpenSim.Framework
207 m_log.DebugFormat("[LOGHTTP]: {0}{1}", context, Util.BinaryToASCII(output)); 209 m_log.DebugFormat("[LOGHTTP]: {0}{1}", context, Util.BinaryToASCII(output));
208 } 210 }
209 211
210 public static void LogResponseDetail(Stream inputStream) 212 public static void LogResponseDetail(int reqnum, Stream inputStream)
211 { 213 {
212 LogOutgoingDetail("RESPONSE: ", inputStream); 214 LogOutgoingDetail(string.Format("RESPONSE {0}: ", reqnum), inputStream);
213 } 215 }
214 216
215 public static void LogResponseDetail(string input) 217 public static void LogResponseDetail(int? reqnum, string input)
216 { 218 {
217 LogOutgoingDetail("RESPONSE: ", input); 219 string context = (reqnum == null) ? "" : string.Format("RESPONSE {0}: ", reqnum.Value);
220 LogOutgoingDetail(context, input);
218 } 221 }
219 222
220 private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed) 223 private static OSDMap ServiceOSDRequestWorker(string url, OSDMap data, string method, int timeout, bool compressed, bool rpc)
221 { 224 {
222 int reqnum = RequestNumber++; 225 int reqnum = RequestNumber++;
223 226
224 if (DebugLevel >= 3) 227 if (DebugLevel >= 3)
225 m_log.DebugFormat( 228 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} JSON-RPC {1} to {2}",
226 "[LOGHTTP]: HTTP OUT {0} ServiceOSD {1} {2} (timeout {3}, compressed {4})", 229 reqnum, method, url);
227 reqnum, method, url, timeout, compressed);
228 230
229 string errorMessage = "unknown error"; 231 string errorMessage = "unknown error";
230 int tickstart = Util.EnvironmentTickCount(); 232 int tickstart = Util.EnvironmentTickCount();
@@ -247,11 +249,11 @@ namespace OpenSim.Framework
247 strBuffer = OSDParser.SerializeJsonString(data); 249 strBuffer = OSDParser.SerializeJsonString(data);
248 250
249 if (DebugLevel >= 5) 251 if (DebugLevel >= 5)
250 LogOutgoingDetail(strBuffer); 252 LogOutgoingDetail("SEND", reqnum, strBuffer);
251 253
252 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer); 254 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
253 255
254 request.ContentType = "application/json"; 256 request.ContentType = rpc ? "application/json-rpc" : "application/json";
255 257
256 if (compressed) 258 if (compressed)
257 { 259 {
@@ -291,9 +293,8 @@ namespace OpenSim.Framework
291 using (StreamReader reader = new StreamReader(responseStream)) 293 using (StreamReader reader = new StreamReader(responseStream))
292 { 294 {
293 string responseStr = reader.ReadToEnd(); 295 string responseStr = reader.ReadToEnd();
294 // m_log.DebugFormat("[LOGHTTP]: <{0}> response is <{1}>",reqnum,responseStr);
295 if (WebUtil.DebugLevel >= 5) 296 if (WebUtil.DebugLevel >= 5)
296 WebUtil.LogResponseDetail(responseStr); 297 WebUtil.LogResponseDetail(reqnum, responseStr);
297 return CanonicalizeResults(responseStr); 298 return CanonicalizeResults(responseStr);
298 } 299 }
299 } 300 }
@@ -316,24 +317,23 @@ namespace OpenSim.Framework
316 { 317 {
317 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 318 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
318 if (tickdiff > LongCallTime) 319 if (tickdiff > LongCallTime)
320 {
319 m_log.InfoFormat( 321 m_log.InfoFormat(
320 "[LOGHTTP]: Slow ServiceOSD request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 322 "[LOGHTTP]: Slow JSON-RPC request {0} {1} to {2} took {3}ms, {4}ms writing, {5}",
321 reqnum, 323 reqnum, method, url, tickdiff, tickdata,
322 method,
323 url,
324 tickdiff,
325 tickdata,
326 strBuffer != null 324 strBuffer != null
327 ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer) 325 ? (strBuffer.Length > MaxRequestDiagLength ? strBuffer.Remove(MaxRequestDiagLength) : strBuffer)
328 : ""); 326 : "");
327 }
329 else if (DebugLevel >= 4) 328 else if (DebugLevel >= 4)
330 m_log.DebugFormat( 329 {
331 "[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing", 330 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
332 reqnum, tickdiff, tickdata); 331 reqnum, tickdiff, tickdata);
332 }
333 } 333 }
334 334
335 m_log.DebugFormat( 335 m_log.DebugFormat(
336 "[LOGHTTP]: ServiceOSD request {0} {1} {2} FAILED: {3}", reqnum, url, method, errorMessage); 336 "[LOGHTTP]: JSON-RPC request {0} {1} to {2} FAILED: {3}", reqnum, method, url, errorMessage);
337 337
338 return ErrorResponseMap(errorMessage); 338 return ErrorResponseMap(errorMessage);
339 } 339 }
@@ -411,9 +411,8 @@ namespace OpenSim.Framework
411 string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown"; 411 string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown";
412 412
413 if (DebugLevel >= 3) 413 if (DebugLevel >= 3)
414 m_log.DebugFormat( 414 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} ServiceForm '{1}' to {2}",
415 "[LOGHTTP]: HTTP OUT {0} ServiceForm {1} {2} (timeout {3})", 415 reqnum, method, url);
416 reqnum, method, url, timeout);
417 416
418 string errorMessage = "unknown error"; 417 string errorMessage = "unknown error";
419 int tickstart = Util.EnvironmentTickCount(); 418 int tickstart = Util.EnvironmentTickCount();
@@ -435,7 +434,7 @@ namespace OpenSim.Framework
435 queryString = BuildQueryString(data); 434 queryString = BuildQueryString(data);
436 435
437 if (DebugLevel >= 5) 436 if (DebugLevel >= 5)
438 LogOutgoingDetail(queryString); 437 LogOutgoingDetail("SEND", reqnum, queryString);
439 438
440 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString); 439 byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString);
441 440
@@ -457,7 +456,7 @@ namespace OpenSim.Framework
457 { 456 {
458 string responseStr = reader.ReadToEnd(); 457 string responseStr = reader.ReadToEnd();
459 if (WebUtil.DebugLevel >= 5) 458 if (WebUtil.DebugLevel >= 5)
460 WebUtil.LogResponseDetail(responseStr); 459 WebUtil.LogResponseDetail(reqnum, responseStr);
461 OSD responseOSD = OSDParser.Deserialize(responseStr); 460 OSD responseOSD = OSDParser.Deserialize(responseStr);
462 461
463 if (responseOSD.Type == OSDType.Map) 462 if (responseOSD.Type == OSDType.Map)
@@ -483,23 +482,22 @@ namespace OpenSim.Framework
483 { 482 {
484 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 483 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
485 if (tickdiff > LongCallTime) 484 if (tickdiff > LongCallTime)
485 {
486 m_log.InfoFormat( 486 m_log.InfoFormat(
487 "[LOGHTTP]: Slow ServiceForm request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 487 "[LOGHTTP]: Slow ServiceForm request {0} '{1}' to {2} took {3}ms, {4}ms writing, {5}",
488 reqnum, 488 reqnum, method, url, tickdiff, tickdata,
489 method,
490 url,
491 tickdiff,
492 tickdata,
493 queryString != null 489 queryString != null
494 ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString 490 ? (queryString.Length > MaxRequestDiagLength) ? queryString.Remove(MaxRequestDiagLength) : queryString
495 : ""); 491 : "");
492 }
496 else if (DebugLevel >= 4) 493 else if (DebugLevel >= 4)
497 m_log.DebugFormat( 494 {
498 "[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing", 495 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
499 reqnum, tickdiff, tickdata); 496 reqnum, tickdiff, tickdata);
497 }
500 } 498 }
501 499
502 m_log.WarnFormat("[LOGHTTP]: ServiceForm request {0} {1} {2} failed: {2}", reqnum, method, url, errorMessage); 500 m_log.WarnFormat("[LOGHTTP]: ServiceForm request {0} '{1}' to {2} failed: {3}", reqnum, method, url, errorMessage);
503 501
504 return ErrorResponseMap(errorMessage); 502 return ErrorResponseMap(errorMessage);
505 } 503 }
@@ -779,8 +777,7 @@ namespace OpenSim.Framework
779 int reqnum = WebUtil.RequestNumber++; 777 int reqnum = WebUtil.RequestNumber++;
780 778
781 if (WebUtil.DebugLevel >= 3) 779 if (WebUtil.DebugLevel >= 3)
782 m_log.DebugFormat( 780 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} AsynchronousRequestObject {1} to {2}",
783 "[LOGHTTP]: HTTP OUT {0} AsynchronousRequestObject {1} {2}",
784 reqnum, verb, requestUrl); 781 reqnum, verb, requestUrl);
785 782
786 int tickstart = Util.EnvironmentTickCount(); 783 int tickstart = Util.EnvironmentTickCount();
@@ -822,7 +819,7 @@ namespace OpenSim.Framework
822 byte[] data = buffer.ToArray(); 819 byte[] data = buffer.ToArray();
823 820
824 if (WebUtil.DebugLevel >= 5) 821 if (WebUtil.DebugLevel >= 5)
825 WebUtil.LogOutgoingDetail(System.Text.Encoding.UTF8.GetString(data)); 822 WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data));
826 823
827 request.BeginGetRequestStream(delegate(IAsyncResult res) 824 request.BeginGetRequestStream(delegate(IAsyncResult res)
828 { 825 {
@@ -840,7 +837,8 @@ namespace OpenSim.Framework
840 { 837 {
841 using (Stream respStream = response.GetResponseStream()) 838 using (Stream respStream = response.GetResponseStream())
842 { 839 {
843 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(respStream, response.ContentLength); 840 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(
841 reqnum, respStream, response.ContentLength);
844 } 842 }
845 } 843 }
846 catch (System.InvalidOperationException) 844 catch (System.InvalidOperationException)
@@ -867,7 +865,8 @@ namespace OpenSim.Framework
867 { 865 {
868 using (Stream respStream = response.GetResponseStream()) 866 using (Stream respStream = response.GetResponseStream())
869 { 867 {
870 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(respStream, response.ContentLength); 868 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(
869 reqnum, respStream, response.ContentLength);
871 } 870 }
872 } 871 }
873 catch (System.InvalidOperationException) 872 catch (System.InvalidOperationException)
@@ -938,18 +937,13 @@ namespace OpenSim.Framework
938 } 937 }
939 938
940 m_log.InfoFormat( 939 m_log.InfoFormat(
941 "[LOGHTTP]: [ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 940 "[LOGHTTP]: Slow AsynchronousRequestObject request {0} {1} to {2} took {3}ms, {4}ms writing, {5}",
942 reqnum, 941 reqnum, verb, requestUrl, tickdiff, tickdata,
943 verb,
944 requestUrl,
945 tickdiff,
946 tickdata,
947 originalRequest); 942 originalRequest);
948 } 943 }
949 else if (WebUtil.DebugLevel >= 4) 944 else if (WebUtil.DebugLevel >= 4)
950 { 945 {
951 m_log.DebugFormat( 946 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
952 "[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
953 reqnum, tickdiff, tickdata); 947 reqnum, tickdiff, tickdata);
954 } 948 }
955 } 949 }
@@ -981,8 +975,7 @@ namespace OpenSim.Framework
981 int reqnum = WebUtil.RequestNumber++; 975 int reqnum = WebUtil.RequestNumber++;
982 976
983 if (WebUtil.DebugLevel >= 3) 977 if (WebUtil.DebugLevel >= 3)
984 m_log.DebugFormat( 978 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} SynchronousRestForms {1} to {2}",
985 "[LOGHTTP]: HTTP OUT {0} SynchronousRestForms {1} {2}",
986 reqnum, verb, requestUrl); 979 reqnum, verb, requestUrl);
987 980
988 int tickstart = Util.EnvironmentTickCount(); 981 int tickstart = Util.EnvironmentTickCount();
@@ -1012,7 +1005,7 @@ namespace OpenSim.Framework
1012 byte[] data = buffer.ToArray(); 1005 byte[] data = buffer.ToArray();
1013 1006
1014 if (WebUtil.DebugLevel >= 5) 1007 if (WebUtil.DebugLevel >= 5)
1015 WebUtil.LogOutgoingDetail(System.Text.Encoding.UTF8.GetString(data)); 1008 WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data));
1016 1009
1017 Stream requestStream = null; 1010 Stream requestStream = null;
1018 try 1011 try
@@ -1058,21 +1051,20 @@ namespace OpenSim.Framework
1058 1051
1059 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 1052 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
1060 if (tickdiff > WebUtil.LongCallTime) 1053 if (tickdiff > WebUtil.LongCallTime)
1054 {
1061 m_log.InfoFormat( 1055 m_log.InfoFormat(
1062 "[LOGHTTP]: [FORMS]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 1056 "[LOGHTTP]: Slow SynchronousRestForms request {0} {1} to {2} took {3}ms, {4}ms writing, {5}",
1063 reqnum, 1057 reqnum, verb, requestUrl, tickdiff, tickdata,
1064 verb,
1065 requestUrl,
1066 tickdiff,
1067 tickdata,
1068 obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj); 1058 obj.Length > WebUtil.MaxRequestDiagLength ? obj.Remove(WebUtil.MaxRequestDiagLength) : obj);
1059 }
1069 else if (WebUtil.DebugLevel >= 4) 1060 else if (WebUtil.DebugLevel >= 4)
1070 m_log.DebugFormat( 1061 {
1071 "[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing", 1062 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
1072 reqnum, tickdiff, tickdata); 1063 reqnum, tickdiff, tickdata);
1064 }
1073 1065
1074 if (WebUtil.DebugLevel >= 5) 1066 if (WebUtil.DebugLevel >= 5)
1075 WebUtil.LogResponseDetail(respstring); 1067 WebUtil.LogResponseDetail(reqnum, respstring);
1076 1068
1077 return respstring; 1069 return respstring;
1078 } 1070 }
@@ -1114,8 +1106,7 @@ namespace OpenSim.Framework
1114 int reqnum = WebUtil.RequestNumber++; 1106 int reqnum = WebUtil.RequestNumber++;
1115 1107
1116 if (WebUtil.DebugLevel >= 3) 1108 if (WebUtil.DebugLevel >= 3)
1117 m_log.DebugFormat( 1109 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} SynchronousRestObject {1} to {2}",
1118 "[LOGHTTP]: HTTP OUT {0} SynchronousRestObject {1} {2}",
1119 reqnum, verb, requestUrl); 1110 reqnum, verb, requestUrl);
1120 1111
1121 int tickstart = Util.EnvironmentTickCount(); 1112 int tickstart = Util.EnvironmentTickCount();
@@ -1155,7 +1146,7 @@ namespace OpenSim.Framework
1155 byte[] data = buffer.ToArray(); 1146 byte[] data = buffer.ToArray();
1156 1147
1157 if (WebUtil.DebugLevel >= 5) 1148 if (WebUtil.DebugLevel >= 5)
1158 WebUtil.LogOutgoingDetail(System.Text.Encoding.UTF8.GetString(data)); 1149 WebUtil.LogOutgoingDetail("SEND", reqnum, System.Text.Encoding.UTF8.GetString(data));
1159 1150
1160 try 1151 try
1161 { 1152 {
@@ -1185,7 +1176,8 @@ namespace OpenSim.Framework
1185 { 1176 {
1186 using (Stream respStream = resp.GetResponseStream()) 1177 using (Stream respStream = resp.GetResponseStream())
1187 { 1178 {
1188 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(respStream, resp.ContentLength); 1179 deserial = XMLResponseHelper.LogAndDeserialize<TRequest, TResponse>(
1180 reqnum, respStream, resp.ContentLength);
1189 } 1181 }
1190 } 1182 }
1191 else 1183 else
@@ -1236,18 +1228,13 @@ namespace OpenSim.Framework
1236 } 1228 }
1237 1229
1238 m_log.InfoFormat( 1230 m_log.InfoFormat(
1239 "[LOGHTTP]: [SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 1231 "[LOGHTTP]: Slow SynchronousRestObject request {0} {1} to {2} took {3}ms, {4}ms writing, {5}",
1240 reqnum, 1232 reqnum, verb, requestUrl, tickdiff, tickdata,
1241 verb,
1242 requestUrl,
1243 tickdiff,
1244 tickdata,
1245 originalRequest); 1233 originalRequest);
1246 } 1234 }
1247 else if (WebUtil.DebugLevel >= 4) 1235 else if (WebUtil.DebugLevel >= 4)
1248 { 1236 {
1249 m_log.DebugFormat( 1237 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
1250 "[LOGHTTP]: HTTP OUT {0} took {1}ms, {2}ms writing",
1251 reqnum, tickdiff, tickdata); 1238 reqnum, tickdiff, tickdata);
1252 } 1239 }
1253 } 1240 }
@@ -1263,7 +1250,7 @@ namespace OpenSim.Framework
1263 1250
1264 public static class XMLResponseHelper 1251 public static class XMLResponseHelper
1265 { 1252 {
1266 public static TResponse LogAndDeserialize<TRequest, TResponse>(Stream respStream, long contentLength) 1253 public static TResponse LogAndDeserialize<TRequest, TResponse>(int reqnum, Stream respStream, long contentLength)
1267 { 1254 {
1268 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); 1255 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
1269 1256
@@ -1272,7 +1259,7 @@ namespace OpenSim.Framework
1272 byte[] data = new byte[contentLength]; 1259 byte[] data = new byte[contentLength];
1273 Util.ReadStream(respStream, data); 1260 Util.ReadStream(respStream, data);
1274 1261
1275 WebUtil.LogResponseDetail(System.Text.Encoding.UTF8.GetString(data)); 1262 WebUtil.LogResponseDetail(reqnum, System.Text.Encoding.UTF8.GetString(data));
1276 1263
1277 using (MemoryStream temp = new MemoryStream(data)) 1264 using (MemoryStream temp = new MemoryStream(data))
1278 return (TResponse)deserializer.Deserialize(temp); 1265 return (TResponse)deserializer.Deserialize(temp);
@@ -1284,4 +1271,81 @@ namespace OpenSim.Framework
1284 } 1271 }
1285 } 1272 }
1286 } 1273 }
1274
1275
1276 public static class XMLRPCRequester
1277 {
1278 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
1279
1280 public static Hashtable SendRequest(Hashtable ReqParams, string method, string url)
1281 {
1282 int reqnum = WebUtil.RequestNumber++;
1283
1284 if (WebUtil.DebugLevel >= 3)
1285 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} XML-RPC '{1}' to {2}",
1286 reqnum, method, url);
1287
1288 int tickstart = Util.EnvironmentTickCount();
1289 string responseStr = null;
1290
1291 try
1292 {
1293 ArrayList SendParams = new ArrayList();
1294 SendParams.Add(ReqParams);
1295
1296 XmlRpcRequest Req = new XmlRpcRequest(method, SendParams);
1297
1298 if (WebUtil.DebugLevel >= 5)
1299 {
1300 string str = Req.ToString();
1301 str = XElement.Parse(str).ToString(SaveOptions.DisableFormatting);
1302 WebUtil.LogOutgoingDetail("SEND", reqnum, str);
1303 }
1304
1305 XmlRpcResponse Resp = Req.Send(url, 30000);
1306
1307 try
1308 {
1309 responseStr = Resp.ToString();
1310 responseStr = XElement.Parse(responseStr).ToString(SaveOptions.DisableFormatting);
1311
1312 if (WebUtil.DebugLevel >= 5)
1313 WebUtil.LogResponseDetail(reqnum, responseStr);
1314 }
1315 catch (Exception e)
1316 {
1317 m_log.Error("Error parsing XML-RPC response", e);
1318 }
1319
1320 if (Resp.IsFault)
1321 {
1322 m_log.DebugFormat(
1323 "[LOGHTTP]: XML-RPC request {0} '{1}' to {2} FAILED: FaultCode={3}, FaultMessage={4}",
1324 reqnum, method, url, Resp.FaultCode, Resp.FaultString);
1325 return null;
1326 }
1327
1328 Hashtable RespData = (Hashtable)Resp.Value;
1329 return RespData;
1330 }
1331 finally
1332 {
1333 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
1334 if (tickdiff > WebUtil.LongCallTime)
1335 {
1336 m_log.InfoFormat(
1337 "[LOGHTTP]: Slow XML-RPC request {0} '{1}' to {2} took {3}ms, {4}",
1338 reqnum, method, url, tickdiff,
1339 responseStr != null
1340 ? (responseStr.Length > WebUtil.MaxRequestDiagLength ? responseStr.Remove(WebUtil.MaxRequestDiagLength) : responseStr)
1341 : "");
1342 }
1343 else if (WebUtil.DebugLevel >= 4)
1344 {
1345 m_log.DebugFormat("[LOGHTTP]: HTTP OUT {0} took {1}ms", reqnum, tickdiff);
1346 }
1347 }
1348 }
1349
1350 }
1287} 1351}