diff --git a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs index ff66fb3e2d..3d73752a28 100644 --- a/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs +++ b/OpenSim/Region/OptionalModules/Materials/MaterialsModule.cs @@ -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)