fixes handler scoring method. XmlRpc code path now fully working with

HttpServer. :-)
0.6.0-stable
Dr Scofield 2008-07-15 13:06:30 +00:00
parent 788c3c497b
commit 8b933e53c0
2 changed files with 61 additions and 7 deletions

View File

@ -25,9 +25,12 @@
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
// #define DEBUGGING
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Specialized; using System.Collections.Specialized;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Net; using System.Net;
using System.Reflection; using System.Reflection;
@ -36,6 +39,7 @@ using System.Threading;
using log4net; using log4net;
using HttpServer; using HttpServer;
namespace OpenSim.Framework.Servers namespace OpenSim.Framework.Servers
{ {
/// <summary> /// <summary>
@ -57,12 +61,16 @@ namespace OpenSim.Framework.Servers
public string EngineID public string EngineID
{ {
get { return String.Format("{0}-{1}", _server.EngineID, _id); } get { return String.Format("{0} pump {1}", _server.EngineID, _id); }
} }
public OSHttpRequestPump() public OSHttpRequestPump(OSHttpServer server, OSHttpRequestQueue queue, int id)
{ {
_server = server;
_queue = queue;
_id = id;
_engine = new Thread(new ThreadStart(Engine)); _engine = new Thread(new ThreadStart(Engine));
_engine.Name = EngineID; _engine.Name = EngineID;
_engine.IsBackground = true; _engine.IsBackground = true;
@ -77,9 +85,7 @@ namespace OpenSim.Framework.Servers
OSHttpRequestPump[] pumps = new OSHttpRequestPump[poolSize]; OSHttpRequestPump[] pumps = new OSHttpRequestPump[poolSize];
for (int i = 0; i < pumps.Length; i++) for (int i = 0; i < pumps.Length; i++)
{ {
pumps[i]._server = server; pumps[i] = new OSHttpRequestPump(server, queue, i);
pumps[i]._queue = queue;
pumps[i]._id = i;
} }
return pumps; return pumps;
@ -166,12 +172,15 @@ namespace OpenSim.Framework.Servers
{ {
Dictionary<OSHttpHandler, int> scoredHandlers = new Dictionary<OSHttpHandler, int>(); Dictionary<OSHttpHandler, int> scoredHandlers = new Dictionary<OSHttpHandler, int>();
_log.DebugFormat("[{0}] MatchHandlers for {1}", EngineID, req);
foreach (OSHttpHandler h in handlers) foreach (OSHttpHandler h in handlers)
{ {
Regex pathRegex = h.Path; Regex pathRegex = h.Path;
Dictionary<string, Regex> headerRegexs = h.Headers; Dictionary<string, Regex> headerRegexs = h.Headers;
Regex endPointsRegex = h.IPEndPointWhitelist; Regex endPointsRegex = h.IPEndPointWhitelist;
// initial anchor
scoredHandlers[h] = 0;
// first, check whether IPEndPointWhitelist applies // first, check whether IPEndPointWhitelist applies
// and, if it does, whether client is on that white // and, if it does, whether client is on that white
@ -218,6 +227,9 @@ namespace OpenSim.Framework.Servers
{ {
// no: remove the handler if it was added // no: remove the handler if it was added
// earlier and on to the next one // earlier and on to the next one
_LogDumpOSHttpHandler(String.Format("[{0}] dropping handler for {1}: null {2} header field",
EngineID, req, tag), h);
scoredHandlers.Remove(h); scoredHandlers.Remove(h);
break; break;
} }
@ -228,6 +240,8 @@ namespace OpenSim.Framework.Servers
if (!hm.Success) { if (!hm.Success) {
// no: remove the handler if it was added // no: remove the handler if it was added
// earlier and on to the next one // earlier and on to the next one
_LogDumpOSHttpHandler(String.Format("[{0}] dropping handler for {1}: {2} header field content \"{3}\" does not match regex {4}",
EngineID, req, tag, headers[tag], headerRegexs[tag].ToString()), h);
scoredHandlers.Remove(h); scoredHandlers.Remove(h);
break; break;
} }
@ -238,11 +252,14 @@ namespace OpenSim.Framework.Servers
if ((null != h.ContentTypeChecker) && !h.ContentTypeChecker(req)) if ((null != h.ContentTypeChecker) && !h.ContentTypeChecker(req))
{ {
scoredHandlers.Remove(h); scoredHandlers.Remove(h);
_LogDumpOSHttpHandler(String.Format("[{0}] dropping handler for {1}: content checker returned false",
EngineID, req), h);
break; break;
} }
// ok: header matches // ok: header matches
headersMatch++; headersMatch++;
_LogDumpOSHttpHandler(String.Format("[{0}] MatchHandlers: found handler for {1}", EngineID, req), h);
continue; continue;
} }
// check whether h got kicked out // check whether h got kicked out
@ -251,15 +268,49 @@ namespace OpenSim.Framework.Servers
scoredHandlers[h] += headersMatch; scoredHandlers[h] += headersMatch;
} }
} }
foreach (OSHttpHandler hh in scoredHandlers.Keys)
{
_LogDumpOSHttpHandler("scoredHandlers:", hh);
}
List<OSHttpHandler> matchingHandlers = new List<OSHttpHandler>(scoredHandlers.Keys); List<OSHttpHandler> matchingHandlers = new List<OSHttpHandler>(scoredHandlers.Keys);
_LogDumpOSHttpHandlerList("before sort: ", matchingHandlers);
matchingHandlers.Sort(delegate(OSHttpHandler x, OSHttpHandler y) matchingHandlers.Sort(delegate(OSHttpHandler x, OSHttpHandler y)
{ {
return scoredHandlers[x] - scoredHandlers[y]; return scoredHandlers[x] - scoredHandlers[y];
}); });
_LogDumpOSHttpHandlerList("after sort: ", matchingHandlers);
return matchingHandlers; return matchingHandlers;
} }
[ConditionalAttribute("DEBUGGING")]
private void _LogDumpOSHttpHandler(string msg, OSHttpHandler h)
{
_log.Debug(msg);
StringWriter sw = new StringWriter();
sw.WriteLine("{0}", h.ToString());
sw.WriteLine(" path regex {0}", null == h.Path ? "null": h.Path.ToString());
foreach (string tag in h.Headers.Keys)
{
sw.WriteLine(" header[{0}] {1}", tag, h.Headers[tag].ToString());
}
sw.WriteLine(" IP whitelist {0}", null == h.IPEndPointWhitelist ? "null" : h.IPEndPointWhitelist.ToString());
sw.WriteLine();
sw.Close();
_log.Debug(sw.ToString());
}
[ConditionalAttribute("DEBUGGING")]
private void _LogDumpOSHttpHandlerList(string msg, List<OSHttpHandler> l)
{
_log.DebugFormat("OSHttpHandlerList dump: {0}", msg);
foreach (OSHttpHandler h in l)
_LogDumpOSHttpHandler("OSHttpHandler", h);
}
} }
} }

View File

@ -106,8 +106,9 @@ namespace OpenSim.Framework.Servers
/// </summary> /// </summary>
public OSHttpServer(IPAddress address, int port, int poolSize) public OSHttpServer(IPAddress address, int port, int poolSize)
{ {
_engineId = String.Format("OSHttpServer [HTTP:{0}/ps:{1}]", port, poolSize); _engineId = String.Format("OSHttpServer (HTTP:{0})", port);
_isSecure = false; _isSecure = false;
_log.DebugFormat("[{0}] HTTP server instantiated", EngineID);
_listener = new HttpListener(address, port); _listener = new HttpListener(address, port);
_queue = new OSHttpRequestQueue(); _queue = new OSHttpRequestQueue();
@ -121,6 +122,7 @@ namespace OpenSim.Framework.Servers
{ {
_engineId = String.Format("OSHttpServer [HTTPS:{0}/ps:{1}]", port, poolSize); _engineId = String.Format("OSHttpServer [HTTPS:{0}/ps:{1}]", port, poolSize);
_isSecure = true; _isSecure = true;
_log.DebugFormat("[{0}] HTTPS server instantiated", EngineID);
_listener = new HttpListener(address, port, certificate); _listener = new HttpListener(address, port, certificate);
_queue = new OSHttpRequestQueue(); _queue = new OSHttpRequestQueue();
@ -176,8 +178,9 @@ namespace OpenSim.Framework.Servers
lock (_syncObject) Monitor.Wait(_syncObject); lock (_syncObject) Monitor.Wait(_syncObject);
} }
catch (Exception) catch (Exception ex)
{ {
_log.DebugFormat("[{0}] HTTP server startup failed: {1}", EngineID, ex.ToString());
} }
_log.InfoFormat("[{0}] HTTP server terminated", EngineID); _log.InfoFormat("[{0}] HTTP server terminated", EngineID);