From bd2180d9af21dd54d4199a9381afa3e43e913823 Mon Sep 17 00:00:00 2001 From: Justin Clarke Casey Date: Thu, 19 Mar 2009 18:11:44 +0000 Subject: * refactor: Create IHttpServer interface instead of accessing BaseHttpServer via CommunicationsManager directly --- .../Framework/Communications/Capabilities/Caps.cs | 17 +-- .../Communications/Capabilities/CapsHandlers.cs | 5 +- .../Communications/CommunicationsManager.cs | 12 +- OpenSim/Framework/Servers/BaseHttpServer.cs | 55 +-------- .../Framework/Servers/Interfaces/IHttpServer.cs | 127 +++++++++++++++++++++ 5 files changed, 149 insertions(+), 67 deletions(-) create mode 100644 OpenSim/Framework/Servers/Interfaces/IHttpServer.cs (limited to 'OpenSim/Framework') diff --git a/OpenSim/Framework/Communications/Capabilities/Caps.cs b/OpenSim/Framework/Communications/Capabilities/Caps.cs index 4ab304f..fde44be 100644 --- a/OpenSim/Framework/Communications/Capabilities/Caps.cs +++ b/OpenSim/Framework/Communications/Capabilities/Caps.cs @@ -33,6 +33,7 @@ using System.Reflection; using log4net; using OpenMetaverse; using OpenSim.Framework.Servers; +using OpenSim.Framework.Servers.Interfaces; // using OpenSim.Region.Framework.Interfaces; @@ -95,7 +96,7 @@ namespace OpenSim.Framework.Communications.Capabilities // private static readonly string m_remoteParcelRequestPath = "0009/";// This is in the LandManagementModule. //private string eventQueue = "0100/"; - private BaseHttpServer m_httpListener; + private IHttpServer m_httpListener; private UUID m_agentID; private IAssetCache m_assetCache; private int m_eventQueueCount = 1; @@ -120,7 +121,7 @@ namespace OpenSim.Framework.Communications.Capabilities public FetchInventoryDescendentsCAPS CAPSFetchInventoryDescendents = null; public GetClientDelegate GetClient = null; - public Caps(IAssetCache assetCache, BaseHttpServer httpServer, string httpListen, uint httpPort, string capsPath, + public Caps(IAssetCache assetCache, IHttpServer httpServer, string httpListen, uint httpPort, string capsPath, UUID agent, bool dumpAssetsToFile, string regionName) { m_assetCache = assetCache; @@ -808,7 +809,7 @@ namespace OpenSim.Framework.Communications.Capabilities private UUID newAssetID; private UUID inventoryItemID; private UUID parentFolder; - private BaseHttpServer httpListener; + private IHttpServer httpListener; private bool m_dumpAssetsToFile; private string m_assetName = String.Empty; private string m_assetDes = String.Empty; @@ -818,7 +819,7 @@ namespace OpenSim.Framework.Communications.Capabilities public AssetUploader(string assetName, string description, UUID assetID, UUID inventoryItem, UUID parentFolderID, string invType, string assetType, string path, - BaseHttpServer httpServer, bool dumpAssetsToFile) + IHttpServer httpServer, bool dumpAssetsToFile) { m_assetName = assetName; m_assetDes = description; @@ -907,10 +908,10 @@ namespace OpenSim.Framework.Communications.Capabilities private string uploaderPath = String.Empty; private UUID inventoryItemID; - private BaseHttpServer httpListener; + private IHttpServer httpListener; private bool m_dumpAssetToFile; - public ItemUpdater(UUID inventoryItem, string path, BaseHttpServer httpServer, bool dumpAssetToFile) + public ItemUpdater(UUID inventoryItem, string path, IHttpServer httpServer, bool dumpAssetToFile) { m_dumpAssetToFile = dumpAssetToFile; @@ -991,11 +992,11 @@ namespace OpenSim.Framework.Communications.Capabilities private UUID inventoryItemID; private UUID primID; private bool isScriptRunning; - private BaseHttpServer httpListener; + private IHttpServer httpListener; private bool m_dumpAssetToFile; public TaskInventoryScriptUpdater(UUID inventoryItemID, UUID primID, int isScriptRunning, - string path, BaseHttpServer httpServer, bool dumpAssetToFile) + string path, IHttpServer httpServer, bool dumpAssetToFile) { m_dumpAssetToFile = dumpAssetToFile; diff --git a/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs b/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs index ed31c45..b47d014 100644 --- a/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs +++ b/OpenSim/Framework/Communications/Capabilities/CapsHandlers.cs @@ -28,6 +28,7 @@ using System.Collections; using System.Collections.Generic; using OpenSim.Framework.Servers; +using OpenSim.Framework.Servers.Interfaces; namespace OpenSim.Framework.Communications.Capabilities { @@ -39,7 +40,7 @@ namespace OpenSim.Framework.Communications.Capabilities public class CapsHandlers { private Dictionary m_capsHandlers = new Dictionary(); - private BaseHttpServer m_httpListener; + private IHttpServer m_httpListener; private string m_httpListenerHostName; private uint m_httpListenerPort; private bool m_useSSL = false; @@ -67,7 +68,7 @@ namespace OpenSim.Framework.Communications.Capabilities /// host name of the HTTP /// server /// HTTP port - public CapsHandlers(BaseHttpServer httpListener, string httpListenerHostname, uint httpListenerPort, bool https) + public CapsHandlers(IHttpServer httpListener, string httpListenerHostname, uint httpListenerPort, bool https) { m_httpListener = httpListener; m_httpListenerHostName = httpListenerHostname; diff --git a/OpenSim/Framework/Communications/CommunicationsManager.cs b/OpenSim/Framework/Communications/CommunicationsManager.cs index 3363c24..b4078fd 100644 --- a/OpenSim/Framework/Communications/CommunicationsManager.cs +++ b/OpenSim/Framework/Communications/CommunicationsManager.cs @@ -29,7 +29,7 @@ using System; using System.Collections.Generic; using OpenMetaverse; using OpenSim.Framework.Communications.Cache; -using OpenSim.Framework.Servers; +using OpenSim.Framework.Servers.Interfaces; namespace OpenSim.Framework.Communications { @@ -106,12 +106,14 @@ namespace OpenSim.Framework.Communications } protected IUserAdminService m_userAdminService; - public BaseHttpServer HttpServer + /// + /// OpenSimulator's built in HTTP server + /// + public IHttpServer HttpServer { get { return m_httpServer; } } - protected BaseHttpServer m_httpServer; - + protected IHttpServer m_httpServer; /// /// Constructor @@ -120,7 +122,7 @@ namespace OpenSim.Framework.Communications /// /// /// - public CommunicationsManager(NetworkServersInfo serversInfo, BaseHttpServer httpServer, IAssetCache assetCache, + public CommunicationsManager(NetworkServersInfo serversInfo, IHttpServer httpServer, IAssetCache assetCache, bool dumpAssetsToFile, LibraryRootFolder libraryRootFolder) { m_networkServersInfo = serversInfo; diff --git a/OpenSim/Framework/Servers/BaseHttpServer.cs b/OpenSim/Framework/Servers/BaseHttpServer.cs index 1b34209..28fb9df 100644 --- a/OpenSim/Framework/Servers/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/BaseHttpServer.cs @@ -41,10 +41,11 @@ using Nwc.XmlRpc; using OpenMetaverse.StructuredData; using CoolHTTPListener = HttpServer.HttpListener; using HttpListener=System.Net.HttpListener; +using OpenSim.Framework.Servers.Interfaces; namespace OpenSim.Framework.Servers { - public class BaseHttpServer + public class BaseHttpServer : IHttpServer { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private HttpServerLogWriter httpserverlog = new HttpServerLogWriter(); @@ -148,11 +149,6 @@ namespace OpenSim.Framework.Servers return true; } - /// - /// Gets the XML RPC handler for given method name - /// - /// Name of the method - /// Returns null if not found public XmlRpcMethod GetXmlRPCHandler(string method) { lock (m_rpcHandlers) @@ -168,32 +164,6 @@ namespace OpenSim.Framework.Servers } } - /// - /// Add a handler for an HTTP request - /// - /// - /// This handler can actually be invoked either as - /// - /// http://:/?method= - /// - /// or - /// - /// http://: - /// - /// if the method name starts with a slash. For example, AddHTTPHandler("/object/", ...) on a standalone region - /// server will register a handler that can be invoked with either - /// - /// http://localhost:9000/?method=/object/ - /// - /// or - /// - /// http://localhost:9000/object/ - /// - /// - /// - /// - /// true if the handler was successfully registered, false if a handler with the same name already existed. - /// public bool AddHTTPHandler(string methodName, GenericHTTPMethod handler) { //m_log.DebugFormat("[BASE HTTP SERVER]: Registering {0}", methodName); @@ -229,12 +199,6 @@ namespace OpenSim.Framework.Servers return false; } - /// - /// Adds a LLSD handler, yay. - /// - /// /resource/ path - /// handle the LLSD response - /// public bool AddLLSDHandler(string path, LLSDMethod handler) { lock (m_llsdHandlers) @@ -1313,7 +1277,6 @@ namespace OpenSim.Framework.Servers response.ContentLength64 = buffer.Length; response.ContentEncoding = Encoding.UTF8; - try { response.OutputStream.Write(buffer, 0, buffer.Length); @@ -1334,8 +1297,7 @@ namespace OpenSim.Framework.Servers // This has to be here to prevent a Linux/Mono crash m_log.WarnFormat("[BASE HTTP SERVER] XmlRpcRequest issue {0}.\nNOTE: this may be spurious on Linux.", e); } - } - + } } public void SendHTML404(OSHttpResponse response, string host) @@ -1513,11 +1475,6 @@ namespace OpenSim.Framework.Servers lock (m_streamHandlers) m_streamHandlers.Remove(handlerKey); } - /// - /// Remove an HTTP handler - /// - /// - /// public void RemoveHTTPHandler(string httpMethod, string path) { lock (m_HTTPHandlers) @@ -1532,12 +1489,6 @@ namespace OpenSim.Framework.Servers } } - /// - /// Remove the agent IF it is registered. Intercept the possible exception. - /// - /// - /// - /// public bool RemoveAgentHandler(string agent, IHttpAgentHandler handler) { try diff --git a/OpenSim/Framework/Servers/Interfaces/IHttpServer.cs b/OpenSim/Framework/Servers/Interfaces/IHttpServer.cs new file mode 100644 index 0000000..ea2c8f1 --- /dev/null +++ b/OpenSim/Framework/Servers/Interfaces/IHttpServer.cs @@ -0,0 +1,127 @@ +/* + * 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 OpenSim 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 Nwc.XmlRpc; +using OpenSim.Framework.Servers; + +namespace OpenSim.Framework.Servers.Interfaces +{ + /// + /// Interface to OpenSimulator's built in HTTP server. Use this to register handlers (http, llsd, xmlrpc, etc.) + /// for given URLs. + /// + public interface IHttpServer + { + uint SSLPort { get; } + string SSLCommonName { get; } + + uint Port { get; } + bool UseSSL { get; } + + // Note that the agent string is provided simply to differentiate + // the handlers - it is NOT required to be an actual agent header + // value. + bool AddAgentHandler(string agent, IHttpAgentHandler handler); + + /// + /// Add a handler for an HTTP request + /// + /// + /// This handler can actually be invoked either as + /// + /// http://:/?method= + /// + /// or + /// + /// http://: + /// + /// if the method name starts with a slash. For example, AddHTTPHandler("/object/", ...) on a standalone region + /// server will register a handler that can be invoked with either + /// + /// http://localhost:9000/?method=/object/ + /// + /// or + /// + /// http://localhost:9000/object/ + /// + /// + /// + /// + /// true if the handler was successfully registered, false if a handler with the same name already existed. + /// + bool AddHTTPHandler(string methodName, GenericHTTPMethod handler); + + /// + /// Adds a LLSD handler, yay. + /// + /// /resource/ path + /// handle the LLSD response + /// + bool AddLLSDHandler(string path, LLSDMethod handler); + + /// + /// Add a stream handler to the http server. If the handler already exists, then nothing happens. + /// + /// + void AddStreamHandler(IRequestHandler handler); + + bool AddXmlRPCHandler(string method, XmlRpcMethod handler); + bool AddXmlRPCHandler(string method, XmlRpcMethod handler, bool keepAlive); + + /// + /// Gets the XML RPC handler for given method name + /// + /// Name of the method + /// Returns null if not found + XmlRpcMethod GetXmlRPCHandler(string method); + + bool SetDefaultLLSDHandler(DefaultLLSDMethod handler); + + /// + /// Remove the agent if it is registered. + /// + /// + /// + /// + bool RemoveAgentHandler(string agent, IHttpAgentHandler handler); + + /// + /// Remove an HTTP handler + /// + /// + /// + void RemoveHTTPHandler(string httpMethod, string path); + + bool RemoveLLSDHandler(string path, LLSDMethod handler); + + void RemoveStreamHandler(string httpMethod, string path); + + string GetHTTP404(string host); + + string GetHTTP500(); + } +} \ No newline at end of file -- cgit v1.1