From 0ba13b9b008f7a40d54b47bff0d9383b5399c14f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Fri, 30 Nov 2018 12:28:37 +0000 Subject: [PATCH] recover GetMesh2 cap --- .../Handlers/GetMesh/GetMeshHandler.cs | 205 +++++++----------- .../ClientStack/Linden/Caps/GetMeshModule.cs | 68 +++--- bin/OpenSimDefaults.ini | 1 + 3 files changed, 115 insertions(+), 159 deletions(-) diff --git a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshHandler.cs b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshHandler.cs index 506f9d22c8..ed42efe710 100644 --- a/OpenSim/Capabilities/Handlers/GetMesh/GetMeshHandler.cs +++ b/OpenSim/Capabilities/Handlers/GetMesh/GetMeshHandler.cs @@ -41,9 +41,6 @@ using OpenSim.Framework.Servers.HttpServer; using OpenSim.Services.Interfaces; using Caps = OpenSim.Framework.Capabilities.Caps; - - - namespace OpenSim.Capabilities.Handlers { public class GetMeshHandler @@ -61,145 +58,99 @@ namespace OpenSim.Capabilities.Handlers } public Hashtable Handle(Hashtable request) { - Hashtable ret = new Hashtable(); - ret["int_response_code"] = (int)System.Net.HttpStatusCode.NotFound; - ret["content_type"] = "text/plain"; - ret["int_bytes"] = 0; - string MeshStr = (string)request["mesh_id"]; - - - //m_log.DebugFormat("[GETMESH]: called {0}", MeshStr); - - if (m_assetService == null) - { - m_log.Error("[GETMESH]: Cannot fetch mesh " + MeshStr + " without an asset service"); - ret["keepalive"] = false; - return ret; - } - - UUID meshID; - if (!String.IsNullOrEmpty(MeshStr) && UUID.TryParse(MeshStr, out meshID)) - { - // m_log.DebugFormat("[GETMESH]: Received request for mesh id {0}", meshID); - - - ret = ProcessGetMesh(request, UUID.Zero, null); - - - } - else - { - m_log.Warn("[GETMESH]: Failed to parse a mesh_id from GetMesh request: " + (string)request["uri"]); - } - - - return ret; + return ProcessGetMesh(request, UUID.Zero, null); ; } + public Hashtable ProcessGetMesh(Hashtable request, UUID AgentId, Caps cap) { Hashtable responsedata = new Hashtable(); - responsedata["int_response_code"] = 400; //501; //410; //404; + if (m_assetService == null) + { + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.ServiceUnavailable; + responsedata["str_response_string"] = "The asset service is unavailable"; + responsedata["keepalive"] = false; + return responsedata; + } + + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.BadRequest; responsedata["content_type"] = "text/plain"; responsedata["int_bytes"] = 0; string meshStr = string.Empty; - if (request.ContainsKey("mesh_id")) meshStr = request["mesh_id"].ToString(); + if (String.IsNullOrEmpty(meshStr)) + return responsedata; + UUID meshID = UUID.Zero; - if (!String.IsNullOrEmpty(meshStr) && UUID.TryParse(meshStr, out meshID)) + if(!UUID.TryParse(meshStr, out meshID)) + return responsedata; + + AssetBase mesh = m_assetService.Get(meshID.ToString()); + if(mesh == null) { - if (m_assetService == null) - { - responsedata["int_response_code"] = 404; //501; //410; //404; - responsedata["keepalive"] = false; - responsedata["str_response_string"] = "The asset service is unavailable. So is your mesh."; - return responsedata; - } - - AssetBase mesh = m_assetService.Get(meshID.ToString()); - - if (mesh != null) - { - if (mesh.Type == (SByte)AssetType.Mesh) - { - Hashtable headers = new Hashtable(); - responsedata["headers"] = headers; - - string range = String.Empty; - - if (((Hashtable)request["headers"])["range"] != null) - range = (string)((Hashtable)request["headers"])["range"]; - - else if (((Hashtable)request["headers"])["Range"] != null) - range = (string)((Hashtable)request["headers"])["Range"]; - - if (!String.IsNullOrEmpty(range)) // Mesh Asset LOD // Physics - { - // Range request - int start, end; - if (TryParseRange(range, out start, out end)) - { - // Before clamping start make sure we can satisfy it in order to avoid - // sending back the last byte instead of an error status - if (start >= mesh.Data.Length) - { - responsedata["int_response_code"] = 404; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["str_response_string"] = "This range doesnt exist."; - return responsedata; - } - else - { - end = Utils.Clamp(end, 0, mesh.Data.Length - 1); - start = Utils.Clamp(start, 0, end); - int len = end - start + 1; - - //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID); - responsedata["int_response_code"] = - (int)System.Net.HttpStatusCode.PartialContent; - headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end, mesh.Data.Length); - - byte[] d = new byte[len]; - Array.Copy(mesh.Data, start, d, 0, len); - responsedata["bin_response_data"] = d; - responsedata["int_bytes"] = len; - } - } - else - { - m_log.Warn("[GETMESH]: Failed to parse a range from GetMesh request, sending full asset: " + (string)request["uri"]); - responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data); - responsedata["content_type"] = "application/vnd.ll.mesh"; - responsedata["int_response_code"] = 200; - } - } - else - { - responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data); - responsedata["content_type"] = "application/vnd.ll.mesh"; - responsedata["int_response_code"] = 200; - } - } - // Optionally add additional mesh types here - else - { - responsedata["int_response_code"] = 404; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["str_response_string"] = "Unfortunately, this asset isn't a mesh."; - return responsedata; - } - } - else - { - responsedata["int_response_code"] = 404; //501; //410; //404; - responsedata["content_type"] = "text/plain"; - responsedata["str_response_string"] = "Your Mesh wasn't found. Sorry!"; - return responsedata; - } + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.NotFound; + responsedata["str_response_string"] = "Mesh not found."; + return responsedata; } + if (mesh.Type != (SByte)AssetType.Mesh) + { + responsedata["str_response_string"] = "Asset isn't a mesh."; + return responsedata; + } + + Hashtable headers = new Hashtable(); + responsedata["headers"] = headers; + + string range = String.Empty; + + if (((Hashtable)request["headers"])["range"] != null) + range = (string)((Hashtable)request["headers"])["range"]; + else if (((Hashtable)request["headers"])["Range"] != null) + range = (string)((Hashtable)request["headers"])["Range"]; + + if (String.IsNullOrEmpty(range)) + { + // full mesh + responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data); + responsedata["content_type"] = "application/vnd.ll.mesh"; + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.OK; + return responsedata; + } + + // range request + int start, end; + if (TryParseRange(range, out start, out end)) + { + // Before clamping start make sure we can satisfy it in order to avoid + // sending back the last byte instead of an error status + if (start >= mesh.Data.Length) + { + responsedata["str_response_string"] = "This range doesnt exist."; + return responsedata; + } + + end = Utils.Clamp(end, 0, mesh.Data.Length - 1); + start = Utils.Clamp(start, 0, end); + int len = end - start + 1; + + //m_log.Debug("Serving " + start + " to " + end + " of " + texture.Data.Length + " bytes for texture " + texture.ID); + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.PartialContent; + headers["Content-Range"] = String.Format("bytes {0}-{1}/{2}", start, end, mesh.Data.Length); + + byte[] d = new byte[len]; + Array.Copy(mesh.Data, start, d, 0, len); + responsedata["bin_response_data"] = d; + responsedata["int_bytes"] = len; + return responsedata; + } + + m_log.Warn("[GETMESH]: Failed to parse a range from GetMesh request, sending full asset: " + (string)request["uri"]); + responsedata["str_response_string"] = Convert.ToBase64String(mesh.Data); + responsedata["content_type"] = "application/vnd.ll.mesh"; + responsedata["int_response_code"] = (int)System.Net.HttpStatusCode.OK; return responsedata; } diff --git a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs index 754ec8b136..b866e49824 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/GetMeshModule.cs @@ -56,10 +56,7 @@ namespace OpenSim.Region.ClientStack.Linden private Scene m_scene; private bool m_Enabled = true; private string m_URL; - private string m_URL2; - private string m_RedirectURL = null; - private string m_RedirectURL2 = null; class APollRequest { @@ -81,12 +78,11 @@ namespace OpenSim.Region.ClientStack.Linden private IAssetService m_assetService = null; private Dictionary m_capsDict = new Dictionary(); + private Dictionary m_capsDict2 = new Dictionary(); private static Thread[] m_workerThreads = null; private static int m_NumberScenes = 0; private static BlockingCollection m_queue = new BlockingCollection(); - private Dictionary m_pollservices = new Dictionary(); - #region Region Module interfaceBase Members public Type ReplaceableInterface @@ -103,19 +99,12 @@ namespace OpenSim.Region.ClientStack.Linden m_URL = config.GetString("Cap_GetMesh", string.Empty); // Cap doesn't exist if (m_URL != string.Empty) - { m_Enabled = true; - m_RedirectURL = config.GetString("GetMeshRedirectURL"); - } m_URL2 = config.GetString("Cap_GetMesh2", string.Empty); // Cap doesn't exist if (m_URL2 != string.Empty) - { m_Enabled = true; - - m_RedirectURL2 = config.GetString("GetMesh2RedirectURL"); - } } public void AddRegion(Scene pScene) @@ -146,6 +135,12 @@ namespace OpenSim.Region.ClientStack.Linden { m_assetService = m_scene.RequestModuleInterface(); // We'll reuse the same handler for all requests. + if(m_assetService == null) + { + m_Enabled = false; + return; + } + m_getMeshHandler = new GetMeshHandler(m_assetService); } @@ -355,49 +350,58 @@ namespace OpenSim.Region.ClientStack.Linden public void RegisterCaps(UUID agentID, Caps caps) { -// UUID capID = UUID.Random(); + string hostName = m_scene.RegionInfo.ExternalHostName; + uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port; + string protocol = "http"; + if (MainServer.Instance.UseSSL) + { + hostName = MainServer.Instance.SSLCommonName; + port = MainServer.Instance.SSLPort; + protocol = "https"; + } + if (m_URL == "localhost") { string capUrl = "/CAPS/" + UUID.Random() + "/"; // Register this as a poll service PollServiceMeshEventArgs args = new PollServiceMeshEventArgs(capUrl, agentID, m_scene); - args.Type = PollServiceEventArgs.EventType.Mesh; MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); - string hostName = m_scene.RegionInfo.ExternalHostName; - uint port = (MainServer.Instance == null) ? 0 : MainServer.Instance.Port; - string protocol = "http"; - - if (MainServer.Instance.UseSSL) - { - hostName = MainServer.Instance.SSLCommonName; - port = MainServer.Instance.SSLPort; - protocol = "https"; - } caps.RegisterHandler("GetMesh", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); - m_pollservices[agentID] = args; m_capsDict[agentID] = capUrl; } - else - { + else if (m_URL != string.Empty) caps.RegisterHandler("GetMesh", m_URL); + + if (m_URL2 == "localhost") + { + string capUrl = "/CAPS/" + UUID.Random() + "/"; + + // Register this as a poll service + PollServiceMeshEventArgs args = new PollServiceMeshEventArgs(capUrl, agentID, m_scene); + args.Type = PollServiceEventArgs.EventType.Mesh; + MainServer.Instance.AddPollServiceHTTPHandler(capUrl, args); + caps.RegisterHandler("GetMesh2", String.Format("{0}://{1}:{2}{3}", protocol, hostName, port, capUrl)); + m_capsDict2[agentID] = capUrl; } + else if(m_URL2 != string.Empty) + caps.RegisterHandler("GetMesh2", m_URL2); } private void DeregisterCaps(UUID agentID, Caps caps) { string capUrl; - PollServiceMeshEventArgs args; if (m_capsDict.TryGetValue(agentID, out capUrl)) { - MainServer.Instance.RemoveHTTPHandler("", capUrl); - m_capsDict.Remove(agentID); + MainServer.Instance.RemovePollServiceHTTPHandler("", capUrl); + m_capsDict.Remove(agentID); } - if (m_pollservices.TryGetValue(agentID, out args)) + if (m_capsDict2.TryGetValue(agentID, out capUrl)) { - m_pollservices.Remove(agentID); + MainServer.Instance.RemovePollServiceHTTPHandler("", capUrl); + m_capsDict2.Remove(agentID); } } } diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini index da934c1bfd..60db143827 100644 --- a/bin/OpenSimDefaults.ini +++ b/bin/OpenSimDefaults.ini @@ -791,6 +791,7 @@ Cap_GetDisplayNames = "localhost" Cap_GetTexture = "localhost" Cap_GetMesh = "localhost" + Cap_GetMesh2 = "localhost" Cap_GetObjectCost = "" Cap_GetObjectPhysicsData = "" Cap_GroupProposalBallot = ""