status: work in progress, non-functional

having OSHttpHandler as a delegate was not too hot, i'm
refactoring it into an interface.
0.6.0-stable
Dr Scofield 2008-06-27 09:29:41 +00:00
parent 3697e0898c
commit 63a1a2739a
2 changed files with 127 additions and 41 deletions

View File

@ -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
{
/// <sumary>
/// Any OSHttpHandler must return one of the following results:
/// <list type = "table">
/// <listheader>
/// <term>result code</term>
/// <description>meaning</description>
/// </listheader>
/// <item>
/// <term>Pass</term>
/// <description>handler did not process the request</request>
/// </item>
/// <item>
/// <term>Handled</term>
/// <description>handler did process the request, OSHttpServer
/// can clean up and close the request</request>
/// </item>
/// <item>
/// <term>Detached</term>
/// <description>handler handles the request, OSHttpServer
/// can forget about the request and should not touch it as
/// the handler has taken control</request>
/// </item>
/// </list>
/// </summary>
public enum OSHttpHandlerResult
{
Pass,
Handled,
Detached,
}
public interface OSHttpHandler
{
/// <summary>
/// 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 '^$'
/// </summary>
Regex Path
{
get;
}
/// <summary>
/// Dictionary of (header name, regular expression) tuples,
/// allowing us to match on HTTP header fields.
/// </summary>
Dictionary<string, Regex> Headers
{
get;
}
/// <summary>
/// Dictionary of (header name, regular expression) tuples,
/// allowing us to match on HTTP header fields.
/// </summary>
/// <remarks>
/// This feature is currently not implemented as it requires
/// (trivial) changes to HttpServer.HttpListener that have not
/// been implemented.
/// </remarks>
Regex IPEndPointWhitelist
{
get;
}
OSHttpHandlerResult Process(OSHttpRequest request);
}
}

View File

@ -40,39 +40,6 @@ using HttpListener = HttpServer.HttpListener;
namespace OpenSim.Framework.Servers
{
/// <sumary>
/// Any OSHttpHandler must return one of the following results:
/// <list type = "table">
/// <listheader>
/// <term>result code</term>
/// <description>meaning</description>
/// </listheader>
/// <item>
/// <term>Pass</term>
/// <description>handler did not process the request</request>
/// </item>
/// <item>
/// <term>Handled</term>
/// <description>handler did process the request, OSHttpServer
/// can clean up and close the request</request>
/// </item>
/// <item>
/// <term>Detached</term>
/// <description>handler handles the request, OSHttpServer
/// can forget about the request and should not touch it as
/// the handler has taken control</request>
/// </item>
/// </list>
/// </summary>
public enum OSHttpHandlerResult
{
Pass,
Handled,
Detached,
}
public delegate OSHttpHandlerResult OSHttpHandler(OSHttpRequest request);
/// <summary>
/// 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
/// </summary>
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; }
}
/// <summary>
/// List of registered OSHttpHandlers for this OSHttpServer instance.
/// </summary>
protected List<OSHttpHandler> _httpHandlers = new List<OSHttpHandler>();
public List<OSHttpHandler> OSHttpHandlers
{
get
{
lock (_httpHandlers)
{
return new List<OSHttpHandler>(_httpHandlers);
}
}
}
/// <summary>
/// Instantiate an HTTP server.
/// </summary>
@ -182,9 +165,6 @@ namespace OpenSim.Framework.Servers
}
}
protected Dictionary<OSHttpHandler, Regex> Handler2Path = new Dictionary<OSHttpHandler, Regex>();
protected Dictionary<OSHttpHandler, Dictionary<string, Regex>> Handler2Headers =
new Dictionary<OSHttpHandler, Dictionary<string, Regex>>();
/// <summary>
/// Add an HTTP request handler.
@ -193,13 +173,17 @@ namespace OpenSim.Framework.Servers
/// <param name="path">regex object for path matching</parm>
/// <param name="headers">dictionary containing header names
/// and regular expressions to match against header values</param>
public void AddHandler(OSHttpHandler handler, Regex path, Dictionary<string, Regex> 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);
}
}
}
}