diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
index 3343f608a5..86ad7aa693 100644
--- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
+++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs
@@ -346,9 +346,15 @@ namespace OpenSim.Framework.Servers.HttpServer
///
public virtual void HandleRequest(OSHttpRequest request, OSHttpResponse response)
{
+ string reqnum = "unknown";
+ int tickstart = Environment.TickCount;
+
try
{
- //m_log.Debug("[BASE HTTP SERVER]: Handling request to " + request.RawUrl);
+ // OpenSim.Framework.WebUtil.OSHeaderRequestID
+ if (request.Headers["opensim-request-id"] != null)
+ reqnum = String.Format("{0}:{1}",request.RemoteIPEndPoint,request.Headers["opensim-request-id"]);
+ // m_log.DebugFormat("[BASE HTTP SERVER]: <{0}> handle request for {1}",reqnum,request.RawUrl);
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US", true);
@@ -576,6 +582,14 @@ namespace OpenSim.Framework.Servers.HttpServer
m_log.ErrorFormat("[BASE HTTP SERVER]: HandleRequest() threw {0}", e);
SendHTML500(response);
}
+ finally
+ {
+ // Every month or so this will wrap and give bad numbers, not really a problem
+ // since its just for reporting, 200ms limit can be adjusted
+ int tickdiff = Environment.TickCount - tickstart;
+ if (tickdiff > 200)
+ m_log.InfoFormat("[BASE HTTP SERVER]: slow request <{0}> for {1} took {2} ms",reqnum,request.RawUrl,tickdiff);
+ }
}
private bool TryGetStreamHandler(string handlerKey, out IRequestHandler streamHandler)
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs
index 1c856af89e..d88d09517f 100644
--- a/OpenSim/Framework/WebUtil.cs
+++ b/OpenSim/Framework/WebUtil.cs
@@ -50,6 +50,16 @@ namespace OpenSim.Framework
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
+ private static int m_requestNumber = 0;
+
+ // this is the header field used to communicate the local request id
+ // used for performance and debugging
+ public const string OSHeaderRequestID = "opensim-request-id";
+
+ // number of milliseconds a call can take before it is considered
+ // a "long" call for warning & debugging purposes
+ public const int LongCallTime = 200;
+
///
/// Send LLSD to an HTTP client in application/llsd+json form
///
@@ -122,27 +132,187 @@ namespace OpenSim.Framework
return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } };
}
+ ///
+ /// PUT JSON-encoded data to a web service that returns LLSD or
+ /// JSON data
+ ///
+ public static OSDMap PutToService(string url, OSDMap data)
+ {
+ return ServiceOSDRequest(url,data,"PUT",10000);
+ }
+
+ public static OSDMap PostToService(string url, OSDMap data)
+ {
+ return ServiceOSDRequest(url,data,"POST",10000);
+ }
+
+ public static OSDMap GetFromService(string url)
+ {
+ return ServiceOSDRequest(url,null,"GET",10000);
+ }
+
+ public static OSDMap ServiceOSDRequest(string url, OSDMap data, string method, int timeout)
+ {
+ int reqnum = m_requestNumber++;
+ // m_log.DebugFormat("[WEB UTIL]: <{0}> start osd request for {1}, method {2}",reqnum,url,method);
+
+ string errorMessage = "unknown error";
+ int tickstart = Util.EnvironmentTickCount();
+ int tickdata = 0;
+
+ try
+ {
+ HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
+ request.Method = method;
+ request.Timeout = timeout;
+ request.KeepAlive = false;
+ request.MaximumAutomaticRedirections = 10;
+ request.ReadWriteTimeout = timeout / 4;
+ request.Headers[OSHeaderRequestID] = reqnum.ToString();
+
+ // If there is some input, write it into the request
+ if (data != null)
+ {
+ string strBuffer = OSDParser.SerializeJsonString(data);
+ byte[] buffer = System.Text.Encoding.UTF8.GetBytes(strBuffer);
+
+ request.ContentType = "application/json";
+ request.ContentLength = buffer.Length; //Count bytes to send
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer, 0, buffer.Length); //Send it
+ }
+
+ // capture how much time was spent writing, this may seem silly
+ // but with the number concurrent requests, this often blocks
+ tickdata = Util.EnvironmentTickCountSubtract(tickstart);
+
+ using (WebResponse response = request.GetResponse())
+ {
+ using (Stream responseStream = response.GetResponseStream())
+ {
+ string responseStr = null;
+ responseStr = responseStream.GetStreamString();
+ // m_log.DebugFormat("[WEB UTIL]: <{0}> response is <{1}>",reqnum,responseStr);
+ return CanonicalizeResults(responseStr);
+ }
+ }
+ }
+ catch (WebException we)
+ {
+ errorMessage = we.Message;
+ if (we.Status == WebExceptionStatus.ProtocolError)
+ {
+ HttpWebResponse webResponse = (HttpWebResponse)we.Response;
+ errorMessage = String.Format("[{0}] {1}",webResponse.StatusCode,webResponse.StatusDescription);
+ }
+ }
+ catch (Exception ex)
+ {
+ errorMessage = ex.Message;
+ }
+ finally
+ {
+ // This just dumps a warning for any operation that takes more than 100 ms
+ int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
+ if (tickdiff > LongCallTime)
+ m_log.InfoFormat("[WEB UTIL]: osd request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing",
+ reqnum,url,method,tickdiff,tickdata);
+ }
+
+ m_log.WarnFormat("[WEB UTIL] <{0}> osd request failed: {1}",reqnum,errorMessage);
+ return ErrorResponseMap(errorMessage);
+ }
+
+ ///
+ /// Since there are no consistencies in the way web requests are
+ /// formed, we need to do a little guessing about the result format.
+ /// Keys:
+ /// Success|success == the success fail of the request
+ /// _RawResult == the raw string that came back
+ /// _Result == the OSD unpacked string
+ ///
+ private static OSDMap CanonicalizeResults(string response)
+ {
+ OSDMap result = new OSDMap();
+
+ // Default values
+ result["Success"] = OSD.FromBoolean(true);
+ result["success"] = OSD.FromBoolean(true);
+ result["_RawResult"] = OSD.FromString(response);
+ result["_Result"] = new OSDMap();
+
+ if (response.Equals("true",System.StringComparison.OrdinalIgnoreCase))
+ return result;
+
+ if (response.Equals("false",System.StringComparison.OrdinalIgnoreCase))
+ {
+ result["Success"] = OSD.FromBoolean(false);
+ result["success"] = OSD.FromBoolean(false);
+ return result;
+ }
+
+ try
+ {
+ OSD responseOSD = OSDParser.Deserialize(response);
+ if (responseOSD.Type == OSDType.Map)
+ {
+ result["_Result"] = (OSDMap)responseOSD;
+ return result;
+ }
+ }
+ catch (Exception e)
+ {
+ // don't need to treat this as an error... we're just guessing anyway
+ m_log.DebugFormat("[WEB UTIL] couldn't decode <{0}>: {1}",response,e.Message);
+ }
+
+ return result;
+ }
+
///
/// POST URL-encoded form data to a web service that returns LLSD or
/// JSON data
///
public static OSDMap PostToService(string url, NameValueCollection data)
{
- string errorMessage;
+ return ServiceFormRequest(url,data,10000);
+ }
+
+ public static OSDMap ServiceFormRequest(string url, NameValueCollection data, int timeout)
+ {
+ int reqnum = m_requestNumber++;
+ string method = (data != null && data["RequestMethod"] != null) ? data["RequestMethod"] : "unknown";
+ // m_log.DebugFormat("[WEB UTIL]: <{0}> start form request for {1}, method {2}",reqnum,url,method);
+
+ string errorMessage = "unknown error";
+ int tickstart = Util.EnvironmentTickCount();
+ int tickdata = 0;
try
{
- string queryString = BuildQueryString(data);
- byte[] requestData = System.Text.Encoding.UTF8.GetBytes(queryString);
-
+
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
- request.ContentLength = requestData.Length;
- request.ContentType = "application/x-www-form-urlencoded";
+ request.Timeout = timeout;
+ request.KeepAlive = false;
+ request.MaximumAutomaticRedirections = 10;
+ request.ReadWriteTimeout = timeout / 4;
+ request.Headers[OSHeaderRequestID] = reqnum.ToString();
+
+ if (data != null)
+ {
+ string queryString = BuildQueryString(data);
+ byte[] buffer = System.Text.Encoding.UTF8.GetBytes(queryString);
+
+ request.ContentLength = buffer.Length;
+ request.ContentType = "application/x-www-form-urlencoded";
+ using (Stream requestStream = request.GetRequestStream())
+ requestStream.Write(buffer, 0, buffer.Length);
+ }
- Stream requestStream = request.GetRequestStream();
- requestStream.Write(requestData, 0, requestData.Length);
- requestStream.Close();
+ // capture how much time was spent writing, this may seem silly
+ // but with the number concurrent requests, this often blocks
+ tickdata = Util.EnvironmentTickCountSubtract(tickstart);
using (WebResponse response = request.GetResponse())
{
@@ -150,34 +320,50 @@ namespace OpenSim.Framework
{
string responseStr = null;
- try
- {
- responseStr = responseStream.GetStreamString();
- OSD responseOSD = OSDParser.Deserialize(responseStr);
- if (responseOSD.Type == OSDType.Map)
- return (OSDMap)responseOSD;
- else
- errorMessage = "Response format was invalid.";
- }
- catch (Exception ex)
- {
- if (!String.IsNullOrEmpty(responseStr))
- errorMessage = "Failed to parse the response:\n" + responseStr;
- else
- errorMessage = "Failed to retrieve the response: " + ex.Message;
- }
+ responseStr = responseStream.GetStreamString();
+ OSD responseOSD = OSDParser.Deserialize(responseStr);
+ if (responseOSD.Type == OSDType.Map)
+ return (OSDMap)responseOSD;
}
}
}
+ catch (WebException we)
+ {
+ errorMessage = we.Message;
+ if (we.Status == WebExceptionStatus.ProtocolError)
+ {
+ HttpWebResponse webResponse = (HttpWebResponse)we.Response;
+ errorMessage = String.Format("[{0}] {1}",webResponse.StatusCode,webResponse.StatusDescription);
+ }
+ }
catch (Exception ex)
{
- m_log.Warn("POST to URL " + url + " failed: " + ex);
errorMessage = ex.Message;
}
+ finally
+ {
+ int tickdiff = Util.EnvironmentTickCountSubtract(tickstart);
+ if (tickdiff > LongCallTime)
+ m_log.InfoFormat("[WEB UTIL]: form request <{0}> (URI:{1}, METHOD:{2}) took {3}ms overall, {4}ms writing",
+ reqnum,url,method,tickdiff,tickdata);
+ }
- return new OSDMap { { "Message", OSD.FromString("Service request failed. " + errorMessage) } };
+ m_log.WarnFormat("[WEB UTIL]: <{0}> form request failed: {1}",reqnum,errorMessage);
+ return ErrorResponseMap(errorMessage);
}
+ ///
+ /// Create a response map for an error, trying to keep
+ /// the result formats consistent
+ ///
+ private static OSDMap ErrorResponseMap(string msg)
+ {
+ OSDMap result = new OSDMap();
+ result["Success"] = "False";
+ result["Message"] = OSD.FromString("Service request failed: " + msg);
+ return result;
+ }
+
#region Uri
///
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 7396c2daae..69854497c2 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -648,7 +648,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IClientAPI client;
if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView))
{
- m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
+ //m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
return;
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 208c2a657a..b8ad3ca3ea 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2858,7 +2858,8 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
avatar.ControllingClient.SendAvatarDataImmediate(this);
- Animator.SendAnimPackToClient(avatar.ControllingClient);
+ if (Animator != null)
+ Animator.SendAnimPackToClient(avatar.ControllingClient);
}
///
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 4aab87fb3c..a8dec63def 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -123,8 +123,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
m_log.InfoFormat("[GROUPS]: Initializing {0}", this.Name);
m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true);
- m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
-
+ m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", false);
}
}
diff --git a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
index a1d9167c5a..1aa3282dac 100644
--- a/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Hypergrid/GatekeeperServiceConnector.cs
@@ -283,46 +283,52 @@ namespace OpenSim.Services.Connectors.Hypergrid
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string myipaddress, out string reason)
{
- HttpWebRequest AgentCreateRequest = null;
+ // m_log.DebugFormat("[GATEKEEPER SERVICE CONNECTOR]: CreateAgent start");
+
myipaddress = String.Empty;
reason = String.Empty;
- if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
+ if (destination == null)
{
- string response = GetResponse(AgentCreateRequest, out reason);
- bool success = true;
- UnpackResponse(response, out success, out reason, out myipaddress);
- return success;
+ m_log.Debug("[GATEKEEPER SERVICE CONNECTOR]: Given destination is null");
+ return false;
+ }
+
+ string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
+
+ try
+ {
+ OSDMap args = aCircuit.PackAgentCircuitData();
+
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+ args["teleport_flags"] = OSD.FromString(flags.ToString());
+
+ OSDMap result = WebUtil.PostToService(uri,args);
+ if (result["Success"].AsBoolean())
+ {
+ OSDMap unpacked = (OSDMap)result["_Result"];
+
+ if (unpacked != null)
+ {
+ reason = unpacked["reason"].AsString();
+ myipaddress = unpacked["your_ip"].AsString();
+ return unpacked["success"].AsBoolean();
+ }
+ }
+
+ reason = result["Message"] != null ? result["Message"].AsString() : "error";
+ return false;
+ }
+ catch (Exception e)
+ {
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
+ reason = e.Message;
}
return false;
}
-
- protected void UnpackResponse(string response, out bool result, out string reason, out string ipaddress)
- {
- result = true;
- reason = string.Empty;
- ipaddress = string.Empty;
-
- if (!String.IsNullOrEmpty(response))
- {
- try
- {
- // we assume we got an OSDMap back
- OSDMap r = Util.GetOSDMap(response);
- result = r["success"].AsBoolean();
- reason = r["reason"].AsString();
- ipaddress = r["your_ip"].AsString();
- }
- catch (NullReferenceException e)
- {
- m_log.InfoFormat("[GATEKEEPER SERVICE CONNECTOR]: exception on UnpackResponse of DoCreateChildAgentCall {0}", e.Message);
- reason = "Internal error";
- result = false;
- }
- }
- }
-
-
}
}
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
index 65a02df390..810399c3ee 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianAvatarServiceConnector.cs
@@ -159,9 +159,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
return false;
}
-// DEBUG ON
- m_log.WarnFormat("[SIMIAN AVATAR CONNECTOR] save appearance for {0}",userID);
-// DEBUG OFF
+ // m_log.DebugFormat("[SIMIAN AVATAR CONNECTOR] save appearance for {0}",userID);
NameValueCollection requestArgs = new NameValueCollection
{
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
index 5584c62365..daf94fe144 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianGridServiceConnector.cs
@@ -307,7 +307,7 @@ namespace OpenSim.Services.Connectors.SimianGrid
{ "Enabled", "1" }
};
- m_log.WarnFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString());
+ //m_log.DebugFormat("[SIMIAN GRID CONNECTOR] request regions by range {0} to {1}",minPosition.ToString(),maxPosition.ToString());
OSDMap response = WebUtil.PostToService(m_ServerURI, requestArgs);
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
index b877ca5981..fbfc2dda15 100644
--- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
+++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs
@@ -75,473 +75,191 @@ namespace OpenSim.Services.Connectors.Simulation
return "agent/";
}
+ ///
+ ///
+ ///
public bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason)
{
- HttpWebRequest AgentCreateRequest = null;
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateAgent start");
+
reason = String.Empty;
-
- if (SendRequest(destination, aCircuit, flags, out reason, out AgentCreateRequest))
- {
- string response = GetResponse(AgentCreateRequest, out reason);
- bool success = true;
- UnpackResponse(response, out success, out reason);
- return success;
- }
-
- return false;
- }
-
-
- protected bool SendRequest(GridRegion destination, AgentCircuitData aCircuit, uint flags, out string reason, out HttpWebRequest AgentCreateRequest)
- {
- reason = String.Empty;
- AgentCreateRequest = null;
-
if (destination == null)
{
- reason = "Destination is null";
m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Given destination is null");
return false;
}
string uri = destination.ServerURI + AgentPath() + aCircuit.AgentID + "/";
-
- AgentCreateRequest = (HttpWebRequest)WebRequest.Create(uri);
- AgentCreateRequest.Method = "POST";
- AgentCreateRequest.ContentType = "application/json";
- AgentCreateRequest.Timeout = 10000;
- //AgentCreateRequest.KeepAlive = false;
- //AgentCreateRequest.Headers.Add("Authorization", authKey);
-
- // Fill it in
- OSDMap args = PackCreateAgentArguments(aCircuit, destination, flags);
- if (args == null)
- return false;
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
- try
- {
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
-
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildCreate: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
-
- Stream os = null;
- try
- { // send the Post
- AgentCreateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = AgentCreateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateAgent request to remote sim {0}, region {1}, x={2} y={3}",
- uri, destination.RegionName, destination.RegionLocX, destination.RegionLocY);
- }
- //catch (WebException ex)
- catch
- {
- //m_log.ErrorFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on ChildAgentUpdate {0}", ex.Message);
- reason = "cannot contact remote region";
- return false;
- }
- finally
- {
- if (os != null)
- os.Close();
- }
-
- return true;
- }
-
- protected string GetResponse(HttpWebRequest AgentCreateRequest, out string reason)
- {
- // Let's wait for the response
- //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
- reason = string.Empty;
-
- WebResponse webResponse = null;
- StreamReader sr = null;
- string response = string.Empty;
- try
- {
- webResponse = AgentCreateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on DoCreateChildAgentCall post");
- }
- else
- {
-
- sr = new StreamReader(webResponse.GetResponseStream());
- response = sr.ReadToEnd().Trim();
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", response);
- }
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", ex.Message);
- reason = "Destination did not reply";
- return string.Empty;
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- return response;
- }
-
- protected void UnpackResponse(string response, out bool result, out string reason)
- {
- result = true;
- reason = string.Empty;
- if (!String.IsNullOrEmpty(response))
- {
- try
- {
- // we assume we got an OSDMap back
- OSDMap r = Util.GetOSDMap(response);
- result = r["success"].AsBoolean();
- reason = r["reason"].AsString();
- }
- catch (NullReferenceException e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of DoCreateChildAgentCall {0}", e.Message);
-
- // check for old style response
- if (response.ToLower().StartsWith("true"))
- result = true;
-
- result = false;
- }
- }
- }
-
- protected virtual OSDMap PackCreateAgentArguments(AgentCircuitData aCircuit, GridRegion destination, uint flags)
- {
- OSDMap args = null;
- try
- {
- args = aCircuit.PackAgentCircuitData();
- }
- catch (Exception e)
- {
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackAgentCircuitData failed with exception: " + e.Message);
- return null;
- }
- // Add the input arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
- args["teleport_flags"] = OSD.FromString(flags.ToString());
+ try
+ {
+ OSDMap args = aCircuit.PackAgentCircuitData();
- return args;
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+ args["teleport_flags"] = OSD.FromString(flags.ToString());
+
+ OSDMap result = WebUtil.PostToService(uri,args);
+ if (result["Success"].AsBoolean())
+ return true;
+
+ reason = result["Message"] != null ? result["Message"].AsString() : "error";
+ return false;
+ }
+ catch (Exception e)
+ {
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: CreateAgent failed with exception: " + e.ToString());
+ reason = e.Message;
+ }
+
+ return false;
}
+ ///
+ /// Send complete data about an agent in this region to a neighbor
+ ///
public bool UpdateAgent(GridRegion destination, AgentData data)
{
return UpdateAgent(destination, (IAgentData)data);
}
+ ///
+ /// Send updated position information about an agent in this region to a neighbor
+ /// This operation may be called very frequently if an avatar is moving about in
+ /// the region.
+ ///
public bool UpdateAgent(GridRegion destination, AgentPosition data)
{
+ // we need a better throttle for these
+ // return false;
+
return UpdateAgent(destination, (IAgentData)data);
}
+ ///
+ /// This is the worker function to send AgentData to a neighbor region
+ ///
private bool UpdateAgent(GridRegion destination, IAgentData cAgentData)
{
- // Eventually, we want to use a caps url instead of the agentID
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: UpdateAgent start");
+ // Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + cAgentData.AgentID + "/";
- HttpWebRequest ChildUpdateRequest = (HttpWebRequest)WebRequest.Create(uri);
- ChildUpdateRequest.Method = "PUT";
- ChildUpdateRequest.ContentType = "application/json";
- ChildUpdateRequest.Timeout = 30000;
- //ChildUpdateRequest.KeepAlive = false;
-
- // Fill it in
- OSDMap args = null;
try
{
- args = cAgentData.Pack();
+ OSDMap args = cAgentData.Pack();
+
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+
+ OSDMap result = WebUtil.PutToService(uri,args);
+ return result["Success"].AsBoolean();
}
catch (Exception e)
{
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: PackUpdateMessage failed with exception: " + e.Message);
- }
- // Add the input arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
- try
- {
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
-
- }
- catch (Exception e)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of ChildUpdate: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
}
- Stream os = null;
- try
- { // send the Post
- ChildUpdateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = ChildUpdateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted AgentUpdate request to remote sim {0}", uri);
- }
- catch (WebException ex)
- //catch
- {
- // m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on AgentUpdate {0}", ex.Message);
-
- return false;
- }
- finally
- {
- if (os != null)
- os.Close();
- }
-
- // Let's wait for the response
- //m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after ChildAgentUpdate");
-
- WebResponse webResponse = null;
- StreamReader sr = null;
- try
- {
- webResponse = ChildUpdateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ChilAgentUpdate post");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ChilAgentUpdate from {0}: {1}", uri, ex.Message);
- // ignore, really
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- return true;
+ return false;
}
+ ///
+ /// Not sure what sequence causes this function to be invoked. The only calling
+ /// path is through the GET method
+ ///
public bool RetrieveAgent(GridRegion destination, UUID id, out IAgentData agent)
{
- IPEndPoint ext = destination.ExternalEndPoint;
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: RetrieveAgent start");
+
agent = null;
- if (ext == null) return false;
+
// Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
- request.Method = "GET";
- request.Timeout = 10000;
- //request.Headers.Add("authorization", ""); // coming soon
-
- HttpWebResponse webResponse = null;
- string reply = string.Empty;
- StreamReader sr = null;
try
{
- webResponse = (HttpWebResponse)request.GetResponse();
- if (webResponse == null)
+ OSDMap result = WebUtil.GetFromService(uri);
+ if (result["Success"].AsBoolean())
{
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent get ");
+ // OSDMap args = Util.GetOSDMap(result["_RawResult"].AsString());
+ OSDMap args = (OSDMap)result["_Result"];
+ if (args != null)
+ {
+ agent = new CompleteAgentData();
+ agent.Unpack(args);
+ return true;
+ }
}
-
- sr = new StreamReader(webResponse.GetResponseStream());
- reply = sr.ReadToEnd().Trim();
-
-
}
- catch (WebException ex)
+ catch (Exception e)
{
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent get {0}", ex.Message);
- // ignore, really
- return false;
- }
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- if (webResponse.StatusCode == HttpStatusCode.OK)
- {
- // we know it's jason
- OSDMap args = Util.GetOSDMap(reply);
- if (args == null)
- {
- return false;
- }
-
- agent = new CompleteAgentData();
- agent.Unpack(args);
- return true;
+ m_log.Warn("[REMOTE SIMULATION CONNECTOR]: UpdateAgent failed with exception: " + e.ToString());
}
return false;
}
+ ///
+ ///
public bool QueryAccess(GridRegion destination, UUID id)
{
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: QueryAccess start");
+
IPEndPoint ext = destination.ExternalEndPoint;
if (ext == null) return false;
+
// Eventually, we want to use a caps url instead of the agentID
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
- request.Method = "QUERYACCESS";
- request.Timeout = 10000;
- //request.Headers.Add("authorization", ""); // coming soon
-
- HttpWebResponse webResponse = null;
- string reply = string.Empty;
- StreamReader sr = null;
try
{
- webResponse = (HttpWebResponse)request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent query ");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- reply = sr.ReadToEnd().Trim();
-
-
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"QUERYACCESS",10000);
+ return result["Success"].AsBoolean();
}
- catch (WebException ex)
+ catch (Exception e)
{
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent query {0}", ex.Message);
- // ignore, really
- return false;
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] QueryAcess failed with exception; {0}",e.ToString());
}
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
- if (webResponse.StatusCode == HttpStatusCode.OK)
- {
- try
- {
- bool result;
-
- result = bool.Parse(reply);
-
- return result;
- }
- catch
- {
- return false;
- }
- }
-
+
return false;
}
+ ///
+ ///
public bool ReleaseAgent(UUID origin, UUID id, string uri)
{
- WebRequest request = WebRequest.Create(uri);
- request.Method = "DELETE";
- request.Timeout = 10000;
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: ReleaseAgent start");
- StreamReader sr = null;
try
{
- WebResponse webResponse = request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on ReleaseAgent");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
}
- catch (WebException ex)
+ catch (Exception e)
{
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of ReleaseAgent {0}", ex.Message);
- return false;
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] ReleaseAgent failed with exception; {0}",e.ToString());
}
- finally
- {
- if (sr != null)
- sr.Close();
- }
-
+
return true;
}
private bool CloseAgent(GridRegion destination, UUID id, bool ChildOnly)
{
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CloseAgent start");
+
string uri = destination.ServerURI + AgentPath() + id + "/" + destination.RegionID.ToString() + "/";
- WebRequest request = WebRequest.Create(uri);
- request.Method = "DELETE";
- if (ChildOnly)
- request.Method += "CHILD";
- request.Timeout = 10000;
-
- StreamReader sr = null;
try
{
- WebResponse webResponse = request.GetResponse();
- if (webResponse == null)
- {
- m_log.Debug("[REMOTE SIMULATION CONNECTOR]: Null reply on agent delete ");
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- sr.Close();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: ChilAgentUpdate reply was {0} ", reply);
-
+ OSDMap result = WebUtil.ServiceOSDRequest(uri,null,"DELETE",10000);
}
- catch (WebException ex)
+ catch (Exception e)
{
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of agent delete from {0}: {1}", destination.RegionName, ex.Message);
- return false;
- }
- finally
- {
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CloseAgent failed with exception; {0}",e.ToString());
}
return true;
@@ -566,99 +284,46 @@ namespace OpenSim.Services.Connectors.Simulation
return "object/";
}
+ ///
+ ///
+ ///
public bool CreateObject(GridRegion destination, ISceneObject sog, bool isLocalCall)
{
- IPEndPoint ext = destination.ExternalEndPoint;
- if (ext == null) return false;
- string uri
- = destination.ServerURI + ObjectPath() + sog.UUID + "/";
- //m_log.Debug(" >>> DoCreateObjectCall <<< " + uri);
+ // m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: CreateObject start");
- WebRequest ObjectCreateRequest = WebRequest.Create(uri);
- ObjectCreateRequest.Method = "POST";
- ObjectCreateRequest.ContentType = "application/json";
- ObjectCreateRequest.Timeout = 10000;
+ string uri = destination.ServerURI + ObjectPath() + sog.UUID + "/";
- OSDMap args = new OSDMap(2);
- args["sog"] = OSD.FromString(sog.ToXml2());
- args["extra"] = OSD.FromString(sog.ExtraToXmlString());
- args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
- string state = sog.GetStateSnapshot();
- if (state.Length > 0)
- args["state"] = OSD.FromString(state);
- // Add the input general arguments
- args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
- args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
- args["destination_name"] = OSD.FromString(destination.RegionName);
- args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
-
- string strBuffer = "";
- byte[] buffer = new byte[1];
try
{
- strBuffer = OSDParser.SerializeJsonString(args);
- Encoding str = Util.UTF8;
- buffer = str.GetBytes(strBuffer);
+ OSDMap args = new OSDMap(2);
+ args["sog"] = OSD.FromString(sog.ToXml2());
+ args["extra"] = OSD.FromString(sog.ExtraToXmlString());
+ args["modified"] = OSD.FromBoolean(sog.HasGroupChanged);
+
+ string state = sog.GetStateSnapshot();
+ if (state.Length > 0)
+ args["state"] = OSD.FromString(state);
+
+ // Add the input general arguments
+ args["destination_x"] = OSD.FromString(destination.RegionLocX.ToString());
+ args["destination_y"] = OSD.FromString(destination.RegionLocY.ToString());
+ args["destination_name"] = OSD.FromString(destination.RegionName);
+ args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
+
+ OSDMap result = WebUtil.PostToService(uri,args);
}
catch (Exception e)
{
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Exception thrown on serialization of CreateObject: {0}", e.Message);
- // ignore. buffer will be empty, caller should check.
- }
-
- Stream os = null;
- try
- { // send the Post
- ObjectCreateRequest.ContentLength = buffer.Length; //Count bytes to send
- os = ObjectCreateRequest.GetRequestStream();
- os.Write(buffer, 0, strBuffer.Length); //Send it
- m_log.DebugFormat("[REMOTE SIMULATION CONNECTOR]: Posted CreateObject request to remote sim {0}", uri);
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: Bad send on CreateObject {0}", ex.Message);
- return false;
- }
- finally
- {
- if (os != null)
- os.Close();
- }
-
- // Let's wait for the response
- //m_log.Info("[REMOTE SIMULATION CONNECTOR]: Waiting for a reply after DoCreateChildAgentCall");
-
- StreamReader sr = null;
- try
- {
- WebResponse webResponse = ObjectCreateRequest.GetResponse();
- if (webResponse == null)
- {
- m_log.Warn("[REMOTE SIMULATION CONNECTOR]: Null reply on CreateObject post");
- return false;
- }
-
- sr = new StreamReader(webResponse.GetResponseStream());
- //reply = sr.ReadToEnd().Trim();
- sr.ReadToEnd().Trim();
- //m_log.InfoFormat("[REMOTE SIMULATION CONNECTOR]: DoCreateChildAgentCall reply was {0} ", reply);
-
- }
- catch (WebException ex)
- {
- m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR]: exception on reply of CreateObject {0}", ex.Message);
- return false;
- }
- finally
- {
- if (sr != null)
- sr.Close();
+ m_log.WarnFormat("[REMOTE SIMULATION CONNECTOR] CreateObject failed with exception; {0}",e.ToString());
}
return true;
}
+ ///
+ ///
+ ///
public bool CreateObject(GridRegion destination, UUID userID, UUID itemID)
{
// TODO, not that urgent