aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework')
-rw-r--r--OpenSim/Framework/WebUtil.cs443
1 files changed, 218 insertions, 225 deletions
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 07c9e3f..6b39345 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -794,172 +794,166 @@ namespace OpenSim.Framework
794 if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections) 794 if (maxConnections > 0 && ht.ServicePoint.ConnectionLimit < maxConnections)
795 ht.ServicePoint.ConnectionLimit = maxConnections; 795 ht.ServicePoint.ConnectionLimit = maxConnections;
796 796
797 WebResponse response = null;
798 TResponse deserial = default(TResponse); 797 TResponse deserial = default(TResponse);
799 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); 798 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
800 799
801 request.Method = verb; 800 request.Method = verb;
801
802 MemoryStream buffer = null; 802 MemoryStream buffer = null;
803 803
804 if (verb == "POST") 804 try
805 { 805 {
806 request.ContentType = "text/xml"; 806 if (verb == "POST")
807
808 buffer = new MemoryStream();
809
810 XmlWriterSettings settings = new XmlWriterSettings();
811 settings.Encoding = Encoding.UTF8;
812
813 using (XmlWriter writer = XmlWriter.Create(buffer, settings))
814 { 807 {
815 XmlSerializer serializer = new XmlSerializer(type); 808 request.ContentType = "text/xml";
816 serializer.Serialize(writer, obj);
817 writer.Flush();
818 }
819 809
820 int length = (int)buffer.Length; 810 buffer = new MemoryStream();
821 request.ContentLength = length;
822 811
823 if (WebUtil.DebugLevel >= 5) 812 XmlWriterSettings settings = new XmlWriterSettings();
824 WebUtil.LogOutgoingDetail(buffer); 813 settings.Encoding = Encoding.UTF8;
825 814
826 request.BeginGetRequestStream(delegate(IAsyncResult res) 815 using (XmlWriter writer = XmlWriter.Create(buffer, settings))
827 { 816 {
828 Stream requestStream = request.EndGetRequestStream(res); 817 XmlSerializer serializer = new XmlSerializer(type);
818 serializer.Serialize(writer, obj);
819 writer.Flush();
820 }
829 821
830 requestStream.Write(buffer.ToArray(), 0, length); 822 int length = (int)buffer.Length;
831 requestStream.Close(); 823 request.ContentLength = length;
832 824
833 // capture how much time was spent writing 825 if (WebUtil.DebugLevel >= 5)
834 tickdata = Util.EnvironmentTickCountSubtract(tickstart); 826 WebUtil.LogOutgoingDetail(buffer);
835 827
836 request.BeginGetResponse(delegate(IAsyncResult ar) 828 request.BeginGetRequestStream(delegate(IAsyncResult res)
837 { 829 {
838 response = request.EndGetResponse(ar); 830 using (Stream requestStream = request.EndGetRequestStream(res))
839 Stream respStream = null; 831 requestStream.Write(buffer.ToArray(), 0, length);
840 try 832
841 { 833 // capture how much time was spent writing
842 respStream = response.GetResponseStream(); 834 tickdata = Util.EnvironmentTickCountSubtract(tickstart);
843 deserial = (TResponse)deserializer.Deserialize( 835
844 respStream); 836 request.BeginGetResponse(delegate(IAsyncResult ar)
845 }
846 catch (System.InvalidOperationException)
847 {
848 }
849 finally
850 { 837 {
851 // Let's not close this 838 using (WebResponse response = request.EndGetResponse(ar))
852 //buffer.Close(); 839 {
853 respStream.Close(); 840 try
854 response.Close(); 841 {
855 } 842 using (Stream respStream = response.GetResponseStream())
843 deserial = (TResponse)deserializer.Deserialize(respStream);
844 }
845 catch (System.InvalidOperationException)
846 {
847 }
848 }
856 849
857 action(deserial); 850 action(deserial);
858 851
852 }, null);
859 }, null); 853 }, null);
860 }, null); 854 }
861 } 855 else
862 else
863 {
864 request.BeginGetResponse(delegate(IAsyncResult res2)
865 { 856 {
866 try 857 request.BeginGetResponse(delegate(IAsyncResult res2)
867 { 858 {
868 // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
869 // documented in MSDN
870 response = request.EndGetResponse(res2);
871
872 Stream respStream = null;
873 try 859 try
874 { 860 {
875 respStream = response.GetResponseStream(); 861 // If the server returns a 404, this appears to trigger a System.Net.WebException even though that isn't
876 deserial = (TResponse)deserializer.Deserialize(respStream); 862 // documented in MSDN
877 } 863 using (WebResponse response = request.EndGetResponse(res2))
878 catch (System.InvalidOperationException) 864 {
879 { 865 try
880 } 866 {
881 finally 867 using (Stream respStream = response.GetResponseStream())
882 { 868 deserial = (TResponse)deserializer.Deserialize(respStream);
883 respStream.Close(); 869 }
884 response.Close(); 870 catch (System.InvalidOperationException)
871 {
872 }
873 }
885 } 874 }
886 } 875 catch (WebException e)
887 catch (WebException e)
888 {
889 if (e.Status == WebExceptionStatus.ProtocolError)
890 { 876 {
891 if (e.Response is HttpWebResponse) 877 if (e.Status == WebExceptionStatus.ProtocolError)
892 { 878 {
893 using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response) 879 if (e.Response is HttpWebResponse)
894 { 880 {
895 if (httpResponse.StatusCode != HttpStatusCode.NotFound) 881 using (HttpWebResponse httpResponse = (HttpWebResponse)e.Response)
896 { 882 {
897 // We don't appear to be handling any other status codes, so log these feailures to that 883 if (httpResponse.StatusCode != HttpStatusCode.NotFound)
898 // people don't spend unnecessary hours hunting phantom bugs. 884 {
899 m_log.DebugFormat( 885 // We don't appear to be handling any other status codes, so log these feailures to that
900 "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}", 886 // people don't spend unnecessary hours hunting phantom bugs.
901 verb, requestUrl, httpResponse.StatusCode); 887 m_log.DebugFormat(
888 "[ASYNC REQUEST]: Request {0} {1} failed with unexpected status code {2}",
889 verb, requestUrl, httpResponse.StatusCode);
890 }
902 } 891 }
903 } 892 }
904 } 893 }
894 else
895 {
896 m_log.ErrorFormat(
897 "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}",
898 verb, requestUrl, e.Status, e.Message);
899 }
905 } 900 }
906 else 901 catch (Exception e)
907 { 902 {
908 m_log.ErrorFormat( 903 m_log.ErrorFormat(
909 "[ASYNC REQUEST]: Request {0} {1} failed with status {2} and message {3}", 904 "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}",
910 verb, requestUrl, e.Status, e.Message); 905 verb, requestUrl, e.Message, e.StackTrace);
911 } 906 }
912 } 907
913 catch (Exception e) 908 // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
914 {
915 m_log.ErrorFormat(
916 "[ASYNC REQUEST]: Request {0} {1} failed with exception {2}{3}",
917 verb, requestUrl, e.Message, e.StackTrace);
918 }
919
920 // m_log.DebugFormat("[ASYNC REQUEST]: Received {0}", deserial.ToString());
921 909
922 try 910 try
923 { 911 {
924 action(deserial); 912 action(deserial);
925 } 913 }
926 catch (Exception e) 914 catch (Exception e)
915 {
916 m_log.ErrorFormat(
917 "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}",
918 verb, requestUrl, e.Message, e.StackTrace);
919 }
920
921 }, null);
922 }
923
924 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
925 if (tickdiff > WebUtil.LongCallTime)
926 {
927 string originalRequest = null;
928
929 if (buffer != null)
927 { 930 {
928 m_log.ErrorFormat( 931 originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
929 "[ASYNC REQUEST]: Request {0} {1} callback failed with exception {2}{3}",
930 verb, requestUrl, e.Message, e.StackTrace);
931 }
932
933 }, null);
934 }
935 932
936 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart); 933 if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
937 if (tickdiff > WebUtil.LongCallTime) 934 originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
938 { 935 }
939 string originalRequest = null;
940 936
941 if (buffer != null) 937 m_log.InfoFormat(
938 "[ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
939 reqnum,
940 verb,
941 requestUrl,
942 tickdiff,
943 tickdata,
944 originalRequest);
945 }
946 else if (WebUtil.DebugLevel >= 4)
942 { 947 {
943 originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); 948 m_log.DebugFormat(
944 949 "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing",
945 if (originalRequest.Length > WebUtil.MaxRequestDiagLength) 950 reqnum, tickdiff, tickdata);
946 originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
947 } 951 }
948
949 m_log.InfoFormat(
950 "[ASYNC REQUEST]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
951 reqnum,
952 verb,
953 requestUrl,
954 tickdiff,
955 tickdata,
956 originalRequest);
957 } 952 }
958 else if (WebUtil.DebugLevel >= 4) 953 finally
959 { 954 {
960 m_log.DebugFormat( 955 if (buffer != null)
961 "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", 956 buffer.Dispose();
962 reqnum, tickdiff, tickdata);
963 } 957 }
964 } 958 }
965 } 959 }
@@ -1056,11 +1050,6 @@ namespace OpenSim.Framework
1056 "[FORMS]: Exception occured on receiving {0} {1}: {2}{3}", 1050 "[FORMS]: Exception occured on receiving {0} {1}: {2}{3}",
1057 verb, requestUrl, e.Message, e.StackTrace); 1051 verb, requestUrl, e.Message, e.StackTrace);
1058 } 1052 }
1059 finally
1060 {
1061 if (respStream != null)
1062 respStream.Close();
1063 }
1064 } 1053 }
1065 } 1054 }
1066 } 1055 }
@@ -1145,128 +1134,132 @@ namespace OpenSim.Framework
1145 request.Method = verb; 1134 request.Method = verb;
1146 MemoryStream buffer = null; 1135 MemoryStream buffer = null;
1147 1136
1148 if ((verb == "POST") || (verb == "PUT")) 1137 try
1149 { 1138 {
1150 request.ContentType = "text/xml"; 1139 if ((verb == "POST") || (verb == "PUT"))
1140 {
1141 request.ContentType = "text/xml";
1151 1142
1152 buffer = new MemoryStream(); 1143 buffer = new MemoryStream();
1153 1144
1154 XmlWriterSettings settings = new XmlWriterSettings(); 1145 XmlWriterSettings settings = new XmlWriterSettings();
1155 settings.Encoding = Encoding.UTF8; 1146 settings.Encoding = Encoding.UTF8;
1156 1147
1157 using (XmlWriter writer = XmlWriter.Create(buffer, settings)) 1148 using (XmlWriter writer = XmlWriter.Create(buffer, settings))
1158 { 1149 {
1159 XmlSerializer serializer = new XmlSerializer(type); 1150 XmlSerializer serializer = new XmlSerializer(type);
1160 serializer.Serialize(writer, obj); 1151 serializer.Serialize(writer, obj);
1161 writer.Flush(); 1152 writer.Flush();
1162 } 1153 }
1163
1164 int length = (int)buffer.Length;
1165 request.ContentLength = length;
1166 1154
1167 if (WebUtil.DebugLevel >= 5) 1155 int length = (int)buffer.Length;
1168 WebUtil.LogOutgoingDetail(buffer); 1156 request.ContentLength = length;
1169 1157
1170 Stream requestStream = null; 1158 if (WebUtil.DebugLevel >= 5)
1171 try 1159 WebUtil.LogOutgoingDetail(buffer);
1172 {
1173 requestStream = request.GetRequestStream();
1174 requestStream.Write(buffer.ToArray(), 0, length);
1175 }
1176 catch (Exception e)
1177 {
1178 m_log.DebugFormat(
1179 "[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}",
1180 verb, requestUrl, e.Message, e.StackTrace);
1181 1160
1182 return deserial; 1161 try
1183 } 1162 {
1184 finally 1163 using (Stream requestStream = request.GetRequestStream())
1185 { 1164 requestStream.Write(buffer.ToArray(), 0, length);
1186 if (requestStream != null) 1165 }
1187 requestStream.Dispose(); 1166 catch (Exception e)
1167 {
1168 m_log.DebugFormat(
1169 "[SynchronousRestObjectRequester]: Exception in making request {0} {1}: {2}{3}",
1170 verb, requestUrl, e.Message, e.StackTrace);
1188 1171
1189 // capture how much time was spent writing 1172 return deserial;
1190 tickdata = Util.EnvironmentTickCountSubtract(tickstart); 1173 }
1174 finally
1175 {
1176 // capture how much time was spent writing
1177 tickdata = Util.EnvironmentTickCountSubtract(tickstart);
1178 }
1191 } 1179 }
1192 }
1193 1180
1194 try 1181 try
1195 {
1196 using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
1197 { 1182 {
1198 if (resp.ContentLength != 0) 1183 using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse())
1199 { 1184 {
1200 using (Stream respStream = resp.GetResponseStream()) 1185 if (resp.ContentLength != 0)
1186 {
1187 using (Stream respStream = resp.GetResponseStream())
1188 {
1189 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse));
1190 deserial = (TResponse)deserializer.Deserialize(respStream);
1191 }
1192 }
1193 else
1201 { 1194 {
1202 XmlSerializer deserializer = new XmlSerializer(typeof(TResponse)); 1195 m_log.DebugFormat(
1203 deserial = (TResponse)deserializer.Deserialize(respStream); 1196 "[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}",
1197 verb, requestUrl);
1204 } 1198 }
1205 } 1199 }
1206 else 1200 }
1201 catch (WebException e)
1202 {
1203 using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
1207 { 1204 {
1208 m_log.DebugFormat( 1205 if (hwr != null && hwr.StatusCode == HttpStatusCode.NotFound)
1209 "[SynchronousRestObjectRequester]: Oops! no content found in response stream from {0} {1}", 1206 return deserial;
1210 verb, requestUrl); 1207 else
1208 m_log.ErrorFormat(
1209 "[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}",
1210 verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace);
1211 } 1211 }
1212 } 1212 }
1213 } 1213 catch (System.InvalidOperationException)
1214 catch (WebException e)
1215 {
1216 using (HttpWebResponse hwr = (HttpWebResponse)e.Response)
1217 { 1214 {
1218 if (hwr != null && hwr.StatusCode == HttpStatusCode.NotFound) 1215 // This is what happens when there is invalid XML
1219 return deserial; 1216 m_log.DebugFormat(
1220 else 1217 "[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}",
1221 m_log.ErrorFormat( 1218 verb, requestUrl, typeof(TResponse).ToString());
1222 "[SynchronousRestObjectRequester]: WebException for {0} {1} {2}: {3} {4}", 1219 }
1223 verb, requestUrl, typeof(TResponse).ToString(), e.Message, e.StackTrace); 1220 catch (Exception e)
1221 {
1222 m_log.DebugFormat(
1223 "[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}",
1224 verb, requestUrl, e.Message, e.StackTrace);
1224 } 1225 }
1225 }
1226 catch (System.InvalidOperationException)
1227 {
1228 // This is what happens when there is invalid XML
1229 m_log.DebugFormat(
1230 "[SynchronousRestObjectRequester]: Invalid XML from {0} {1} {2}",
1231 verb, requestUrl, typeof(TResponse).ToString());
1232 }
1233 catch (Exception e)
1234 {
1235 m_log.DebugFormat(
1236 "[SynchronousRestObjectRequester]: Exception on response from {0} {1}: {2}{3}",
1237 verb, requestUrl, e.Message, e.StackTrace);
1238 }
1239
1240 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
1241 if (tickdiff > WebUtil.LongCallTime)
1242 {
1243 string originalRequest = null;
1244 1226
1245 if (buffer != null) 1227 int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
1228 if (tickdiff > WebUtil.LongCallTime)
1246 { 1229 {
1247 originalRequest = Encoding.UTF8.GetString(buffer.ToArray()); 1230 string originalRequest = null;
1248 1231
1249 if (originalRequest.Length > WebUtil.MaxRequestDiagLength) 1232 if (buffer != null)
1250 originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength); 1233 {
1251 } 1234 originalRequest = Encoding.UTF8.GetString(buffer.ToArray());
1252 1235
1253 m_log.InfoFormat( 1236 if (originalRequest.Length > WebUtil.MaxRequestDiagLength)
1254 "[SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}", 1237 originalRequest = originalRequest.Remove(WebUtil.MaxRequestDiagLength);
1255 reqnum, 1238 }
1256 verb, 1239
1257 requestUrl, 1240 m_log.InfoFormat(
1258 tickdiff, 1241 "[SynchronousRestObjectRequester]: Slow request {0} {1} {2} took {3}ms, {4}ms writing, {5}",
1259 tickdata, 1242 reqnum,
1260 originalRequest); 1243 verb,
1244 requestUrl,
1245 tickdiff,
1246 tickdata,
1247 originalRequest);
1248 }
1249 else if (WebUtil.DebugLevel >= 4)
1250 {
1251 m_log.DebugFormat(
1252 "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing",
1253 reqnum, tickdiff, tickdata);
1254 }
1261 } 1255 }
1262 else if (WebUtil.DebugLevel >= 4) 1256 finally
1263 { 1257 {
1264 m_log.DebugFormat( 1258 if (buffer != null)
1265 "[WEB UTIL]: HTTP OUT {0} took {1}ms, {2}ms writing", 1259 buffer.Dispose();
1266 reqnum, tickdiff, tickdata);
1267 } 1260 }
1268 1261
1269 return deserial; 1262 return deserial;
1270 } 1263 }
1271 } 1264 }
1272} 1265} \ No newline at end of file