move a materials cap to simpleStreamHandler

master
UbitUmarov 2020-04-24 17:50:13 +01:00
parent 84cd4b4808
commit 07caee4956
1 changed files with 62 additions and 44 deletions

View File

@ -28,8 +28,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Reflection;
using System.Security.Cryptography; // for computing md5 hash
using System.Text;
using log4net;
using Mono.Addins;
using Nini.Config;
@ -38,7 +39,6 @@ using OpenMetaverse;
using OpenMetaverse.StructuredData;
using OpenSim.Framework;
using OpenSim.Framework.Servers;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
@ -225,35 +225,33 @@ namespace OpenSim.Region.OptionalModules.Materials
}
}
private void OnRegisterCaps(OpenMetaverse.UUID agentID, OpenSim.Framework.Capabilities.Caps caps)
private void OnRegisterCaps(UUID agentID, OpenSim.Framework.Capabilities.Caps caps)
{
string capsBase = "/CAPS/" + caps.CapsObjectPath + "/";
caps.RegisterSimpleHandler("RenderMaterials",
new SimpleStreamHandler("/" + UUID.Random(),
(httpRequest, httpResponse)
=> preprocess(httpRequest, httpResponse,agentID)
));
}
IRequestHandler renderMaterialsPostHandler
= new RestStreamHandler("POST", capsBase,
(request, path, param, httpRequest, httpResponse)
=> RenderMaterialsPostCap(request, agentID),
"RenderMaterials", null);
caps.RegisterHandler("RenderMaterials", renderMaterialsPostHandler);
// OpenSimulator CAPs infrastructure seems to be somewhat hostile towards any CAP that requires both GET
// and POST handlers, (at least at the time this was originally written), so we first set up a POST
// handler normally and then add a GET handler via MainServer
IRequestHandler renderMaterialsGetHandler
= new RestStreamHandler("GET", capsBase,
(request, path, param, httpRequest, httpResponse)
=> RenderMaterialsGetCap(request),
"RenderMaterials", null);
MainServer.Instance.AddStreamHandler(renderMaterialsGetHandler);
// materials viewer seems to use either POST or PUT, so assign POST handler for PUT as well
IRequestHandler renderMaterialsPutHandler
= new RestStreamHandler("PUT", capsBase,
(request, path, param, httpRequest, httpResponse)
=> RenderMaterialsPutCap(request, agentID),
"RenderMaterials", null);
MainServer.Instance.AddStreamHandler(renderMaterialsPutHandler);
private void preprocess(IOSHttpRequest request, IOSHttpResponse response, UUID agentID)
{
switch(request.HttpMethod)
{
case "GET":
RenderMaterialsGetCap(request, response);
break;
case "PUT":
RenderMaterialsPutCap(request, response, agentID);
break;
case "POST":
RenderMaterialsPostCap(request, response, agentID);
break;
default:
response.StatusCode = (int)HttpStatusCode.NotFound;
return;
}
response.StatusCode = (int)HttpStatusCode.OK;
}
private void OnSimulatorFeaturesRequest(UUID agentID, ref OSDMap features)
@ -479,10 +477,18 @@ namespace OpenSim.Region.OptionalModules.Materials
}
}
public string RenderMaterialsPostCap(string request, UUID agentID)
public void RenderMaterialsPostCap(IOSHttpRequest request, IOSHttpResponse response, UUID agentID)
{
OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
OSDMap resp = new OSDMap();
OSDMap req;
try
{
req = (OSDMap)OSDParser.DeserializeLLSDXml(request.InputStream);
}
catch
{
response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
OSDArray respArr = new OSDArray();
OSD tmpOSD;
@ -536,26 +542,34 @@ namespace OpenSim.Region.OptionalModules.Materials
catch (Exception e)
{
m_log.Warn("[Materials]: exception decoding zipped CAP payload ", e);
//return "";
response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
}
OSDMap resp = new OSDMap();
resp["Zipped"] = ZCompressOSD(respArr, false);
string response = OSDParser.SerializeLLSDXmlString(resp);
response.RawBuffer = Encoding.UTF8.GetBytes(OSDParser.SerializeLLSDXmlString(resp));
//m_log.Debug("[Materials]: cap request: " + request);
//m_log.Debug("[Materials]: cap request (zipped portion): " + ZippedOsdBytesToString(req["Zipped"].AsBinary()));
//m_log.Debug("[Materials]: cap response: " + response);
return response;
}
public string RenderMaterialsPutCap(string request, UUID agentID)
public void RenderMaterialsPutCap(IOSHttpRequest request, IOSHttpResponse response, UUID agentID)
{
OSDMap req = (OSDMap)OSDParser.DeserializeLLSDXml(request);
OSDMap resp = new OSDMap();
OSDMap req;
try
{
req = (OSDMap)OSDParser.DeserializeLLSDXml(request.InputStream);
}
catch
{
response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
OSDMap materialsFromViewer = null;
OSDArray respArr = new OSDArray();
OSD tmpOSD;
@ -707,6 +721,8 @@ namespace OpenSim.Region.OptionalModules.Materials
catch (Exception e)
{
m_log.Warn("[Materials]: exception processing received material ", e);
response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
}
}
@ -714,17 +730,19 @@ namespace OpenSim.Region.OptionalModules.Materials
catch (Exception e)
{
m_log.Warn("[Materials]: exception decoding zipped CAP payload ", e);
//return "";
response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
}
OSDMap resp = new OSDMap();
resp["Zipped"] = ZCompressOSD(respArr, false);
string response = OSDParser.SerializeLLSDXmlString(resp);
response.RawBuffer = Encoding.UTF8.GetBytes(OSDParser.SerializeLLSDXmlString(resp));
//m_log.Debug("[Materials]: cap request: " + request);
//m_log.Debug("[Materials]: cap request (zipped portion): " + ZippedOsdBytesToString(req["Zipped"].AsBinary()));
//m_log.Debug("[Materials]: cap response: " + response);
return response;
}
private AssetBase MakeAsset(FaceMaterial fm, bool local)
@ -740,7 +758,7 @@ namespace OpenSim.Region.OptionalModules.Materials
return asset;
}
public string RenderMaterialsGetCap(string request)
public void RenderMaterialsGetCap(IOSHttpRequest request, IOSHttpResponse response)
{
OSDMap resp = new OSDMap();
OSDArray allOsd = new OSDArray();
@ -762,7 +780,7 @@ namespace OpenSim.Region.OptionalModules.Materials
*/
resp["Zipped"] = ZCompressOSD(allOsd, false);
return OSDParser.SerializeLLSDXmlString(resp);
response.RawBuffer = Encoding.UTF8.GetBytes(OSDParser.SerializeLLSDXmlString(resp));
}
private static string ZippedOsdBytesToString(byte[] bytes)