From b2e6ec9e12ad07eb08496ebe8ca0476b793017d5 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Sun, 17 Jan 2010 18:04:55 -0800
Subject: Agent gets there through the Gatekeeper, but still a few quirks to
fix.
---
OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs | 79 ++++++++++++++
.../Hypergrid/GatekeeperServerConnector.cs | 74 ++-----------
.../Server/Handlers/Hypergrid/HypergridHandlers.cs | 115 +++++++++++++++++++++
.../Server/Handlers/Hypergrid/ObjectHandlers.cs | 68 ++++++++++++
.../Server/Handlers/Simulation/AgentHandlers.cs | 32 ++++--
.../Server/Handlers/Simulation/ObjectHandlers.cs | 12 ++-
6 files changed, 305 insertions(+), 75 deletions(-)
create mode 100644 OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
create mode 100644 OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs
create mode 100644 OpenSim/Server/Handlers/Hypergrid/ObjectHandlers.cs
(limited to 'OpenSim/Server')
diff --git a/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
new file mode 100644
index 0000000..a56363c
--- /dev/null
+++ b/OpenSim/Server/Handlers/Hypergrid/AgentHandlers.cs
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using System.Net;
+using System.Text;
+
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Simulation;
+using Utils = OpenSim.Server.Handlers.Simulation.Utils;
+
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using Nini.Config;
+using log4net;
+
+
+namespace OpenSim.Server.Handlers.Hypergrid
+{
+ public class AgentHandler : OpenSim.Server.Handlers.Simulation.AgentHandler
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private IGatekeeperService m_GatekeeperService;
+
+ public AgentHandler(IGatekeeperService gatekeeper)
+ {
+ m_GatekeeperService = gatekeeper;
+ }
+
+ protected override bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason)
+ {
+ return m_GatekeeperService.LoginAgent(aCircuit, destination, out reason);
+ }
+
+ protected override bool UpdateAgent(GridRegion destination, AgentData agent)
+ {
+ return m_GatekeeperService.UpdateAgent(destination, agent);
+ }
+
+ protected override void ReleaseAgent(UUID regionID, UUID id)
+ {
+ m_GatekeeperService.ReleaseAgent(regionID, id);
+ }
+
+ }
+
+}
diff --git a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
index f72b36c..27b793d 100644
--- a/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
+++ b/OpenSim/Server/Handlers/Hypergrid/GatekeeperServerConnector.cs
@@ -26,21 +26,16 @@
*/
using System;
-using System.Collections;
using System.Collections.Generic;
using System.Reflection;
-using System.Net;
using Nini.Config;
using OpenSim.Framework;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Server.Handlers.Base;
-using GridRegion = OpenSim.Services.Interfaces.GridRegion;
-using OpenMetaverse;
using log4net;
-using Nwc.XmlRpc;
namespace OpenSim.Server.Handlers.Hypergrid
{
@@ -65,8 +60,13 @@ namespace OpenSim.Server.Handlers.Hypergrid
if (m_GatekeeperService == null)
throw new Exception("Gatekeeper server connector cannot proceed because of missing service");
- server.AddXmlRPCHandler("link_region", LinkRegionRequest, false);
- server.AddXmlRPCHandler("get_region", GetRegion, false);
+ HypergridHandlers hghandlers = new HypergridHandlers(m_GatekeeperService);
+ server.AddXmlRPCHandler("link_region", hghandlers.LinkRegionRequest, false);
+ server.AddXmlRPCHandler("get_region", hghandlers.GetRegion, false);
+
+ server.AddHTTPHandler("/foreignagent/", new AgentHandler(m_GatekeeperService).Handler);
+ server.AddHTTPHandler("/foreignobject/", new ObjectHandler(m_GatekeeperService).Handler);
+
}
public GatekeeperServiceInConnector(IConfigSource config, IHttpServer server)
@@ -74,65 +74,5 @@ namespace OpenSim.Server.Handlers.Hypergrid
{
}
- ///
- /// Someone wants to link to us
- ///
- ///
- ///
- public XmlRpcResponse LinkRegionRequest(XmlRpcRequest request, IPEndPoint remoteClient)
- {
- Hashtable requestData = (Hashtable)request.Params[0];
- //string host = (string)requestData["host"];
- //string portstr = (string)requestData["port"];
- string name = (string)requestData["region_name"];
-
- UUID regionID = UUID.Zero;
- string imageURL = string.Empty;
- ulong regionHandle = 0;
- string reason = string.Empty;
-
- bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out imageURL, out reason);
-
- Hashtable hash = new Hashtable();
- hash["result"] = success.ToString();
- hash["uuid"] = regionID.ToString();
- hash["handle"] = regionHandle.ToString();
- hash["region_image"] = imageURL;
-
- XmlRpcResponse response = new XmlRpcResponse();
- response.Value = hash;
- return response;
- }
-
- public XmlRpcResponse GetRegion(XmlRpcRequest request, IPEndPoint remoteClient)
- {
- Hashtable requestData = (Hashtable)request.Params[0];
- //string host = (string)requestData["host"];
- //string portstr = (string)requestData["port"];
- string regionID_str = (string)requestData["region_uuid"];
- UUID regionID = UUID.Zero;
- UUID.TryParse(regionID_str, out regionID);
-
- GridRegion regInfo = m_GatekeeperService.GetHyperlinkRegion(regionID);
-
- Hashtable hash = new Hashtable();
- if (regInfo == null)
- hash["result"] = "false";
- else
- {
- hash["result"] = "true";
- hash["uuid"] = regInfo.RegionID.ToString();
- hash["x"] = regInfo.RegionLocX.ToString();
- hash["y"] = regInfo.RegionLocY.ToString();
- hash["region_name"] = regInfo.RegionName;
- hash["hostname"] = regInfo.ExternalHostName;
- hash["http_port"] = regInfo.HttpPort.ToString();
- hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
- }
- XmlRpcResponse response = new XmlRpcResponse();
- response.Value = hash;
- return response;
-
- }
}
}
diff --git a/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs
new file mode 100644
index 0000000..baafd7d
--- /dev/null
+++ b/OpenSim/Server/Handlers/Hypergrid/HypergridHandlers.cs
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Net;
+using System.Reflection;
+
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+
+using log4net;
+using Nwc.XmlRpc;
+using OpenMetaverse;
+
+namespace OpenSim.Server.Handlers.Hypergrid
+{
+ public class HypergridHandlers
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+
+ private IGatekeeperService m_GatekeeperService;
+
+ public HypergridHandlers(IGatekeeperService gatekeeper)
+ {
+ m_GatekeeperService = gatekeeper;
+ }
+
+ ///
+ /// Someone wants to link to us
+ ///
+ ///
+ ///
+ public XmlRpcResponse LinkRegionRequest(XmlRpcRequest request, IPEndPoint remoteClient)
+ {
+ Hashtable requestData = (Hashtable)request.Params[0];
+ //string host = (string)requestData["host"];
+ //string portstr = (string)requestData["port"];
+ string name = (string)requestData["region_name"];
+
+ UUID regionID = UUID.Zero;
+ string imageURL = string.Empty;
+ ulong regionHandle = 0;
+ string reason = string.Empty;
+
+ bool success = m_GatekeeperService.LinkRegion(name, out regionID, out regionHandle, out imageURL, out reason);
+
+ Hashtable hash = new Hashtable();
+ hash["result"] = success.ToString();
+ hash["uuid"] = regionID.ToString();
+ hash["handle"] = regionHandle.ToString();
+ hash["region_image"] = imageURL;
+
+ XmlRpcResponse response = new XmlRpcResponse();
+ response.Value = hash;
+ return response;
+ }
+
+ public XmlRpcResponse GetRegion(XmlRpcRequest request, IPEndPoint remoteClient)
+ {
+ Hashtable requestData = (Hashtable)request.Params[0];
+ //string host = (string)requestData["host"];
+ //string portstr = (string)requestData["port"];
+ string regionID_str = (string)requestData["region_uuid"];
+ UUID regionID = UUID.Zero;
+ UUID.TryParse(regionID_str, out regionID);
+
+ GridRegion regInfo = m_GatekeeperService.GetHyperlinkRegion(regionID);
+
+ Hashtable hash = new Hashtable();
+ if (regInfo == null)
+ hash["result"] = "false";
+ else
+ {
+ hash["result"] = "true";
+ hash["uuid"] = regInfo.RegionID.ToString();
+ hash["x"] = regInfo.RegionLocX.ToString();
+ hash["y"] = regInfo.RegionLocY.ToString();
+ hash["region_name"] = regInfo.RegionName;
+ hash["hostname"] = regInfo.ExternalHostName;
+ hash["http_port"] = regInfo.HttpPort.ToString();
+ hash["internal_port"] = regInfo.InternalEndPoint.Port.ToString();
+ }
+ XmlRpcResponse response = new XmlRpcResponse();
+ response.Value = hash;
+ return response;
+
+ }
+
+ }
+}
diff --git a/OpenSim/Server/Handlers/Hypergrid/ObjectHandlers.cs b/OpenSim/Server/Handlers/Hypergrid/ObjectHandlers.cs
new file mode 100644
index 0000000..20eb375
--- /dev/null
+++ b/OpenSim/Server/Handlers/Hypergrid/ObjectHandlers.cs
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of the OpenSimulator Project nor the
+ * names of its contributors may be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using System.Collections;
+using System.IO;
+using System.Reflection;
+using System.Net;
+using System.Text;
+
+using OpenSim.Server.Base;
+using OpenSim.Server.Handlers.Base;
+using OpenSim.Services.Interfaces;
+using GridRegion = OpenSim.Services.Interfaces.GridRegion;
+using OpenSim.Framework;
+using OpenSim.Framework.Servers.HttpServer;
+using OpenSim.Server.Handlers.Simulation;
+using Utils = OpenSim.Server.Handlers.Simulation.Utils;
+
+using OpenMetaverse;
+using OpenMetaverse.StructuredData;
+using Nini.Config;
+using log4net;
+
+
+namespace OpenSim.Server.Handlers.Hypergrid
+{
+ public class ObjectHandler : OpenSim.Server.Handlers.Simulation.ObjectHandler
+ {
+ private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private IGatekeeperService m_GatekeeperService;
+
+ public ObjectHandler(IGatekeeperService gatekeeper)
+ {
+ m_GatekeeperService = gatekeeper;
+ }
+
+ protected override bool CreateObject(GridRegion destination, ISceneObject sog)
+ {
+ return m_GatekeeperService.LoginAttachment(destination, sog);
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
index 0c098d9..ab3250d 100644
--- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs
@@ -52,6 +52,8 @@ namespace OpenSim.Server.Handlers.Simulation
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private ISimulationService m_SimulationService;
+ public AgentHandler() { }
+
public AgentHandler(ISimulationService sim)
{
m_SimulationService = sim;
@@ -117,7 +119,7 @@ namespace OpenSim.Server.Handlers.Simulation
}
- protected virtual void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
+ protected void DoAgentPost(Hashtable request, Hashtable responsedata, UUID id)
{
OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null)
@@ -171,7 +173,8 @@ namespace OpenSim.Server.Handlers.Simulation
// This is the meaning of POST agent
//m_regionClient.AdjustUserInformation(aCircuit);
- bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
+ //bool result = m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
+ bool result = CreateAgent(destination, aCircuit, teleportFlags, out reason);
resp["reason"] = OSD.FromString(reason);
resp["success"] = OSD.FromBoolean(result);
@@ -181,7 +184,13 @@ namespace OpenSim.Server.Handlers.Simulation
responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp);
}
- protected virtual void DoAgentPut(Hashtable request, Hashtable responsedata)
+ // subclasses can override this
+ protected virtual bool CreateAgent(GridRegion destination, AgentCircuitData aCircuit, uint teleportFlags, out string reason)
+ {
+ return m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
+ }
+
+ protected void DoAgentPut(Hashtable request, Hashtable responsedata)
{
OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null)
@@ -237,7 +246,7 @@ namespace OpenSim.Server.Handlers.Simulation
//agent.Dump();
// This is one of the meanings of PUT agent
- result = m_SimulationService.UpdateAgent(destination, agent);
+ result = UpdateAgent(destination, agent);
}
else if ("AgentPosition".Equals(messageType))
@@ -263,6 +272,12 @@ namespace OpenSim.Server.Handlers.Simulation
//responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead
}
+ // subclasses cab override this
+ protected virtual bool UpdateAgent(GridRegion destination, AgentData agent)
+ {
+ return m_SimulationService.UpdateAgent(destination, agent);
+ }
+
protected virtual void DoAgentGet(Hashtable request, Hashtable responsedata, UUID id, UUID regionID)
{
GridRegion destination = new GridRegion();
@@ -305,7 +320,7 @@ namespace OpenSim.Server.Handlers.Simulation
}
}
- protected virtual void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID)
+ protected void DoAgentDelete(Hashtable request, Hashtable responsedata, UUID id, string action, UUID regionID)
{
m_log.Debug(" >>> DoDelete action:" + action + "; RegionID:" + regionID);
@@ -313,7 +328,7 @@ namespace OpenSim.Server.Handlers.Simulation
destination.RegionID = regionID;
if (action.Equals("release"))
- m_SimulationService.ReleaseAgent(regionID, id, "");
+ ReleaseAgent(regionID, id);
else
m_SimulationService.CloseAgent(destination, id);
@@ -322,6 +337,11 @@ namespace OpenSim.Server.Handlers.Simulation
m_log.Debug("[AGENT HANDLER]: Agent Released/Deleted.");
}
+
+ protected virtual void ReleaseAgent(UUID regionID, UUID id)
+ {
+ m_SimulationService.ReleaseAgent(regionID, id, "");
+ }
}
}
diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
index b6eabe3..33e5aa6 100644
--- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
+++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs
@@ -52,6 +52,8 @@ namespace OpenSim.Server.Handlers.Simulation
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private ISimulationService m_SimulationService;
+ public ObjectHandler() { }
+
public ObjectHandler(ISimulationService sim)
{
m_SimulationService = sim;
@@ -110,7 +112,7 @@ namespace OpenSim.Server.Handlers.Simulation
}
- protected virtual void DoObjectPost(Hashtable request, Hashtable responsedata, UUID regionID)
+ protected void DoObjectPost(Hashtable request, Hashtable responsedata, UUID regionID)
{
OSDMap args = Utils.GetOSDMap((string)request["body"]);
if (args == null)
@@ -181,7 +183,7 @@ namespace OpenSim.Server.Handlers.Simulation
try
{
// This is the meaning of POST object
- result = m_SimulationService.CreateObject(destination, sog, false);
+ result = CreateObject(destination, sog);
}
catch (Exception e)
{
@@ -192,6 +194,12 @@ namespace OpenSim.Server.Handlers.Simulation
responsedata["str_response_string"] = result.ToString();
}
+ // subclasses can override this
+ protected virtual bool CreateObject(GridRegion destination, ISceneObject sog)
+ {
+ return m_SimulationService.CreateObject(destination, sog, false);
+ }
+
protected virtual void DoObjectPut(Hashtable request, Hashtable responsedata, UUID regionID)
{
OSDMap args = Utils.GetOSDMap((string)request["body"]);
--
cgit v1.1