From 9a5a811c7dacced01d6f91e4512af82ec1f0a48f Mon Sep 17 00:00:00 2001 From: UbitUmarov Date: Thu, 23 Apr 2020 22:32:18 +0100 Subject: [PATCH] extend Caps to use SimpleStreamHandler --- OpenSim/Capabilities/Caps.cs | 6 ++++ OpenSim/Capabilities/CapsHandlers.cs | 49 +++++++++++++++++++++++----- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/OpenSim/Capabilities/Caps.cs b/OpenSim/Capabilities/Caps.cs index 3d6c9b7ecd..b43c1f57a9 100644 --- a/OpenSim/Capabilities/Caps.cs +++ b/OpenSim/Capabilities/Caps.cs @@ -176,6 +176,12 @@ namespace OpenSim.Framework.Capabilities m_capsHandlers[capName] = handler; } + public void RegisterSimpleHandler(string capName, ISimpleStreamHandler handler, bool addToListener = true) + { + //m_log.DebugFormat("[CAPS]: Registering handler for \"{0}\": path {1}", capName, handler.Path); + m_capsHandlers.AddSimpleHandler(capName, handler, addToListener); + } + public void RegisterPollHandler(string capName, PollServiceEventArgs pollServiceHandler) { // m_log.DebugFormat( diff --git a/OpenSim/Capabilities/CapsHandlers.cs b/OpenSim/Capabilities/CapsHandlers.cs index 42c2dd88b4..ee6c568459 100644 --- a/OpenSim/Capabilities/CapsHandlers.cs +++ b/OpenSim/Capabilities/CapsHandlers.cs @@ -27,6 +27,7 @@ using System.Collections; using System.Collections.Generic; +using System.Collections.Concurrent; using OpenSim.Framework.Servers; using OpenSim.Framework.Servers.HttpServer; @@ -40,6 +41,7 @@ namespace OpenSim.Framework.Capabilities public class CapsHandlers { private Dictionary m_capsHandlers = new Dictionary(); + private ConcurrentDictionary m_capsSimpleHandlers = new ConcurrentDictionary(); private IHttpServer m_httpListener; private string m_httpListenerHostName; private uint m_httpListenerPort; @@ -73,18 +75,35 @@ namespace OpenSim.Framework.Capabilities { lock (m_capsHandlers) { - m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path); - m_httpListener.RemoveStreamHandler("PUT", m_capsHandlers[capsName].Path); - m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path); - m_httpListener.RemoveStreamHandler("DELETE", m_capsHandlers[capsName].Path); - m_capsHandlers.Remove(capsName); + if(m_capsHandlers.ContainsKey(capsName)) + { + m_httpListener.RemoveStreamHandler("POST", m_capsHandlers[capsName].Path); + m_httpListener.RemoveStreamHandler("PUT", m_capsHandlers[capsName].Path); + m_httpListener.RemoveStreamHandler("GET", m_capsHandlers[capsName].Path); + m_httpListener.RemoveStreamHandler("DELETE", m_capsHandlers[capsName].Path); + m_capsHandlers.Remove(capsName); + } } + if(m_capsSimpleHandlers.TryRemove(capsName, out ISimpleStreamHandler hdr)) + { + m_httpListener.RemoveSimpleStreamHandler(hdr.Path); + } + } + + public void AddSimpleHandler(string capName, ISimpleStreamHandler handler, bool addToListener = true) + { + if(ContainsCap(capName)) + Remove(capName); + if(m_capsSimpleHandlers.TryAdd(capName, handler) && addToListener) + m_httpListener.AddSimpleStreamHandler(handler); } public bool ContainsCap(string cap) { lock (m_capsHandlers) - return m_capsHandlers.ContainsKey(cap); + if (m_capsHandlers.ContainsKey(cap)) + return true; + return m_capsSimpleHandlers.ContainsKey(cap); } /// @@ -135,8 +154,9 @@ namespace OpenSim.Framework.Capabilities { lock (m_capsHandlers) { - string[] __keys = new string[m_capsHandlers.Keys.Count]; + string[] __keys = new string[m_capsHandlers.Keys.Count + m_capsSimpleHandlers.Keys.Count]; m_capsHandlers.Keys.CopyTo(__keys, 0); + m_capsSimpleHandlers.Keys.CopyTo(__keys, m_capsHandlers.Keys.Count); return __keys; } } @@ -150,6 +170,9 @@ namespace OpenSim.Framework.Capabilities public Hashtable GetCapsDetails(bool excludeSeed, List requestedCaps) { Hashtable caps = new Hashtable(); + if(requestedCaps == null) + return caps; + string protocol = "http://"; if (m_useSSL) @@ -164,11 +187,21 @@ namespace OpenSim.Framework.Capabilities if (excludeSeed && "SEED" == capsName) continue; - if (requestedCaps != null && !requestedCaps.Contains(capsName)) + if (!requestedCaps.Contains(capsName)) continue; caps[capsName] = baseUrl + m_capsHandlers[capsName].Path; } + foreach (string capsName in m_capsSimpleHandlers.Keys) + { + if (excludeSeed && "SEED" == capsName) + continue; + + if (!requestedCaps.Contains(capsName)) + continue; + + caps[capsName] = baseUrl + m_capsSimpleHandlers[capsName].Path; + } } return caps;