From 0518b397a33ec16c1e3d6f203b82c86b89b80e75 Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Mon, 27 Apr 2020 15:46:31 +0100 Subject: [PATCH] add SimpleOSDMapHandler, for caps that have just one httpmethod and body should be decoded as OSDMap, so we don't right the same things all pver --- .../HttpServer/Interfaces/IStreamHandler.cs | 2 + .../HttpServer/SimpleBaseRequestHandler.cs | 1 + .../Servers/HttpServer/SimpleOSDMapHandler.cs | 131 ++++++++++++++++++ .../Linden/Caps/BunchOfCaps/BunchOfCaps.cs | 44 +----- 4 files changed, 140 insertions(+), 38 deletions(-) create mode 100644 OpenSim/Framework/Servers/HttpServer/SimpleOSDMapHandler.cs diff --git a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs index 86894713cc..67903555bd 100644 --- a/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/Interfaces/IStreamHandler.cs @@ -27,6 +27,7 @@ using System.Collections; using System.IO; +using OpenMetaverse.StructuredData; namespace OpenSim.Framework.Servers.HttpServer { @@ -102,4 +103,5 @@ namespace OpenSim.Framework.Servers.HttpServer } public delegate void SimpleStreamMethod(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse); + public delegate void SimpleOSDMapMethod(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap args); } \ No newline at end of file diff --git a/OpenSim/Framework/Servers/HttpServer/SimpleBaseRequestHandler.cs b/OpenSim/Framework/Servers/HttpServer/SimpleBaseRequestHandler.cs index 91f2b7ce35..577361a857 100644 --- a/OpenSim/Framework/Servers/HttpServer/SimpleBaseRequestHandler.cs +++ b/OpenSim/Framework/Servers/HttpServer/SimpleBaseRequestHandler.cs @@ -48,6 +48,7 @@ namespace OpenSim.Framework.Servers.HttpServer Name = null; m_path = path; } + protected SimpleBaseRequestHandler(string path, string name) { Name = name; diff --git a/OpenSim/Framework/Servers/HttpServer/SimpleOSDMapHandler.cs b/OpenSim/Framework/Servers/HttpServer/SimpleOSDMapHandler.cs new file mode 100644 index 0000000000..48b53f22c1 --- /dev/null +++ b/OpenSim/Framework/Servers/HttpServer/SimpleOSDMapHandler.cs @@ -0,0 +1,131 @@ +/* + * 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.Net; +using OpenSim.Framework.ServiceAuth; +using OpenMetaverse.StructuredData; + +namespace OpenSim.Framework.Servers.HttpServer +{ + /// + /// simple OSD streamed request handler. + /// for well defined simple uri paths, single http method and a OSDMap encoded body + /// + /// + /// Inheriting classes should override ProcessRequest() rather than Handle() + /// + public class SimpleOSDMapHandler : SimpleBaseRequestHandler, ISimpleStreamHandler + { + protected string m_httMethod; + protected IServiceAuth m_Auth; + protected SimpleOSDMapMethod m_processRequest; + + public SimpleOSDMapHandler(string httpmethod, string path) : base(path) + { + m_httMethod = httpmethod.ToUpper(); + } + public SimpleOSDMapHandler(string httpmethod, string path, string name) : base(path, name) + { + m_httMethod = httpmethod.ToUpper(); + } + public SimpleOSDMapHandler(string httpmethod, string path, SimpleOSDMapMethod processRequest) : base(path) + { + m_httMethod = httpmethod.ToUpper(); + m_processRequest = processRequest; + } + public SimpleOSDMapHandler(string httpmethod, string path, SimpleOSDMapMethod processRequest, string name) : base(path, name) + { + m_httMethod = httpmethod.ToUpper(); + m_processRequest = processRequest; + } + + public SimpleOSDMapHandler(string httpmethod, string path, IServiceAuth auth) : base(path) + { + m_httMethod = httpmethod.ToUpper(); + m_Auth = auth; + } + + public SimpleOSDMapHandler(string httpmethod, string path, IServiceAuth auth, SimpleOSDMapMethod processRequest) + : base(path) + { + m_httMethod = httpmethod.ToUpper(); + m_Auth = auth; + m_processRequest = processRequest; + } + + public SimpleOSDMapHandler(string httpmethod, string path, IServiceAuth auth, SimpleOSDMapMethod processRequest, string name) + : base(path, name) + { + m_httMethod = httpmethod.ToUpper(); + m_Auth = auth; + m_processRequest = processRequest; + } + + public virtual void Handle(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + RequestsReceived++; + if(httpRequest.HttpMethod != m_httMethod) + { + httpResponse.StatusCode = (int)HttpStatusCode.NotFound; + return; + } + OSDMap args; + try + { + args = (OSDMap)OSDParser.Deserialize(httpRequest.InputStream); + } + catch + { + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } + if (args == null) + { + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } + + if (m_Auth != null) + { + if (!m_Auth.Authenticate(httpRequest.Headers, httpResponse.AddHeader, out HttpStatusCode statusCode)) + { + httpResponse.StatusCode = (int)statusCode; + return; + } + } + if(m_processRequest != null) + m_processRequest(httpRequest, httpResponse, args); + else + ProcessRequest(httpRequest, httpResponse, args); + RequestsHandled++; + } + + protected virtual void ProcessRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap args) + { + } + } +} \ No newline at end of file diff --git a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs index 009d4fd2f0..03521a065e 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/BunchOfCaps/BunchOfCaps.cs @@ -266,13 +266,13 @@ namespace OpenSim.Region.ClientStack.Linden // GetMapLayer); m_HostCapsObj.RegisterSimpleHandler("GetObjectPhysicsData", - new SimpleStreamHandler(GetNewCapPath(), GetObjectPhysicsData)); + new SimpleOSDMapHandler("POST", GetNewCapPath(), GetObjectPhysicsData)); m_HostCapsObj.RegisterSimpleHandler("GetObjectCost", - new SimpleStreamHandler(GetNewCapPath(), GetObjectCost)); + new SimpleOSDMapHandler("POST", GetNewCapPath(), GetObjectCost)); m_HostCapsObj.RegisterSimpleHandler("ResourceCostSelected", - new SimpleStreamHandler(GetNewCapPath(), ResourceCostSelected)); + new SimpleOSDMapHandler("POST", GetNewCapPath(), ResourceCostSelected)); IRequestHandler req = new RestStreamHandler( "POST", GetNewCapPath(), ScriptTaskInventory, "UpdateScript", null); @@ -1599,18 +1599,11 @@ namespace OpenSim.Region.ClientStack.Linden return ""; } - public void GetObjectPhysicsData(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + public void GetObjectPhysicsData(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap req) { - if(httpRequest.HttpMethod != "POST") - { - httpResponse.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - OSDMap req; OSDArray object_ids; try { - req = (OSDMap)OSDParser.DeserializeLLSDXml(httpRequest.InputStream); object_ids = (OSDArray)req["object_ids"]; } catch @@ -1651,19 +1644,11 @@ namespace OpenSim.Region.ClientStack.Linden httpResponse.StatusCode = (int)HttpStatusCode.OK; } - public void GetObjectCost(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + public void GetObjectCost(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, OSDMap req) { - if (httpRequest.HttpMethod != "POST") - { - httpResponse.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - - OSDMap req; OSDArray object_ids; try { - req = (OSDMap)OSDParser.DeserializeLLSDXml(httpRequest.InputStream); object_ids = (OSDArray)req["object_ids"]; } catch @@ -1726,25 +1711,8 @@ namespace OpenSim.Region.ClientStack.Linden httpResponse.StatusCode = (int)HttpStatusCode.OK; } - public void ResourceCostSelected(IOSHttpRequest httpRequest,IOSHttpResponse httpResponse) + public void ResourceCostSelected(IOSHttpRequest httpRequest,IOSHttpResponse httpResponse, OSDMap req) { - if (httpRequest.HttpMethod != "POST") - { - httpResponse.StatusCode = (int)HttpStatusCode.NotFound; - return; - } - - OSDMap req; - try - { - req = (OSDMap)OSDParser.DeserializeLLSDXml(httpRequest.InputStream); - } - catch - { - httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; - return; - } - float phys=0; float stream=0; float simul=0;