diff --git a/OpenSim/Framework/Servers/OSHttpHandler.cs b/OpenSim/Framework/Servers/OSHttpHandler.cs new file mode 100644 index 0000000000..c4ab81c26d --- /dev/null +++ b/OpenSim/Framework/Servers/OSHttpHandler.cs @@ -0,0 +1,102 @@ +/* + * 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 System; +using System.Collections.Generic; +using System.Text.RegularExpressions; + +namespace OpenSim.Framework.Servers +{ + /// + /// Any OSHttpHandler must return one of the following results: + /// + /// + /// result code + /// meaning + /// + /// + /// Pass + /// handler did not process the request + /// + /// + /// Handled + /// handler did process the request, OSHttpServer + /// can clean up and close the request + /// + /// + /// Detached + /// handler handles the request, OSHttpServer + /// can forget about the request and should not touch it as + /// the handler has taken control + /// + /// + /// + public enum OSHttpHandlerResult + { + Pass, + Handled, + Detached, + } + + public interface OSHttpHandler + { + /// + /// Regular expression used to match against path of incoming + /// HTTP request. If you want to match any string either use + /// '.*' or null. To match for the emtpy string use '^$' + /// + Regex Path + { + get; + } + + /// + /// Dictionary of (header name, regular expression) tuples, + /// allowing us to match on HTTP header fields. + /// + Dictionary Headers + { + get; + } + + /// + /// Dictionary of (header name, regular expression) tuples, + /// allowing us to match on HTTP header fields. + /// + /// + /// This feature is currently not implemented as it requires + /// (trivial) changes to HttpServer.HttpListener that have not + /// been implemented. + /// + Regex IPEndPointWhitelist + { + get; + } + + OSHttpHandlerResult Process(OSHttpRequest request); + } +} \ No newline at end of file diff --git a/OpenSim/Framework/Servers/OSHttpServer.cs b/OpenSim/Framework/Servers/OSHttpServer.cs index c0220624c1..169ce13868 100644 --- a/OpenSim/Framework/Servers/OSHttpServer.cs +++ b/OpenSim/Framework/Servers/OSHttpServer.cs @@ -40,39 +40,6 @@ using HttpListener = HttpServer.HttpListener; namespace OpenSim.Framework.Servers { - /// - /// Any OSHttpHandler must return one of the following results: - /// - /// - /// result code - /// meaning - /// - /// - /// Pass - /// handler did not process the request - /// - /// - /// Handled - /// handler did process the request, OSHttpServer - /// can clean up and close the request - /// - /// - /// Detached - /// handler handles the request, OSHttpServer - /// can forget about the request and should not touch it as - /// the handler has taken control - /// - /// - /// - public enum OSHttpHandlerResult - { - Pass, - Handled, - Detached, - } - - public delegate OSHttpHandlerResult OSHttpHandler(OSHttpRequest request); - /// /// OSHttpServer provides an HTTP server bound to a specific /// port. When instantiated with just address and port it uses @@ -81,7 +48,7 @@ namespace OpenSim.Framework.Servers /// public class OSHttpServer { - private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog _log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); // underlying HttpServer.HttpListener protected HttpListener _listener; @@ -116,6 +83,22 @@ namespace OpenSim.Framework.Servers get { return _pumps.Length; } } + /// + /// List of registered OSHttpHandlers for this OSHttpServer instance. + /// + protected List _httpHandlers = new List(); + public List OSHttpHandlers + { + get + { + lock (_httpHandlers) + { + return new List(_httpHandlers); + } + } + } + + /// /// Instantiate an HTTP server. /// @@ -182,9 +165,6 @@ namespace OpenSim.Framework.Servers } } - protected Dictionary Handler2Path = new Dictionary(); - protected Dictionary> Handler2Headers = - new Dictionary>(); /// /// Add an HTTP request handler. @@ -193,13 +173,17 @@ namespace OpenSim.Framework.Servers /// regex object for path matching /// dictionary containing header names /// and regular expressions to match against header values - public void AddHandler(OSHttpHandler handler, Regex path, Dictionary headers) + public void AddHandler(OSHttpHandler handler) { - lock (Handler2Headers) + lock (_httpHandlers) { - + if (_httpHandlers.Contains(handler)) + { + _log.DebugFormat("[OSHttpServer] attempt to add already existing handler ignored"); + return; + } + _httpHandlers.Add(handler); } } - } }