morphing OSHttpHandler interface into an abstract base class. adding

HTTP method matching support. adapting OSHttpXmlRpcHandler
accordingly. dropping OSHttpXmlProcessor delegate in favour of good
old XmlRpcMethodHandler delegate (was the same signature).
This commit is contained in:
Dr Scofield
2008-07-17 12:54:15 +00:00
parent 2a30e85c97
commit ed4241583f
3 changed files with 108 additions and 109 deletions

View File

@@ -175,6 +175,7 @@ namespace OpenSim.Framework.Servers
_log.DebugFormat("[{0}] MatchHandlers for {1}", EngineID, req);
foreach (OSHttpHandler h in handlers)
{
Regex methodRegex = h.Method;
Regex pathRegex = h.Path;
Dictionary<string, Regex> headerRegexs = h.Headers;
Regex endPointsRegex = h.IPEndPointWhitelist;
@@ -198,10 +199,18 @@ namespace OpenSim.Framework.Servers
}
}
if (null != methodRegex)
{
Match m = methodRegex.Match(req.HttpMethod);
if (!m.Success) continue;
scoredHandlers[h]++;
}
// whitelist ok, now check path
if (null != pathRegex)
{
Match m = pathRegex.Match(req.HttpRequest.Uri.AbsolutePath);
Match m = pathRegex.Match(req.RawUrl);
if (!m.Success) continue;
scoredHandlers[h] = m.ToString().Length;
@@ -227,8 +236,7 @@ namespace OpenSim.Framework.Servers
{
// no: remove the handler if it was added
// earlier and on to the next one
_LogDumpOSHttpHandler(String.Format("[{0}] dropping handler for {1}: null {2} header field",
EngineID, req, tag), h);
_log.DebugFormat("[{0}] dropping handler for {1}: null {2} header field: {3}", EngineID, req, tag, h);
scoredHandlers.Remove(h);
break;
@@ -240,8 +248,8 @@ namespace OpenSim.Framework.Servers
if (!hm.Success) {
// no: remove the handler if it was added
// 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);
_log.DebugFormat("[{0}] dropping handler for {1}: {2} header field content \"{3}\" does not match regex {4}: {5}",
EngineID, req, tag, headers[tag], headerRegexs[tag].ToString(), h);
scoredHandlers.Remove(h);
break;
}
@@ -252,14 +260,13 @@ namespace OpenSim.Framework.Servers
if ((null != h.ContentTypeChecker) && !h.ContentTypeChecker(req))
{
scoredHandlers.Remove(h);
_LogDumpOSHttpHandler(String.Format("[{0}] dropping handler for {1}: content checker returned false",
EngineID, req), h);
_log.DebugFormat("[{0}] dropping handler for {1}: content checker returned false: {2}", EngineID, req, h);
break;
}
// ok: header matches
headersMatch++;
_LogDumpOSHttpHandler(String.Format("[{0}] MatchHandlers: found handler for {1}", EngineID, req), h);
_log.DebugFormat("[{0}] MatchHandlers: found handler for {1}: {2}", EngineID, req, h.ToString());
continue;
}
// check whether h got kicked out
@@ -269,48 +276,21 @@ namespace OpenSim.Framework.Servers
}
}
foreach (OSHttpHandler hh in scoredHandlers.Keys)
{
_LogDumpOSHttpHandler("scoredHandlers:", hh);
}
List<OSHttpHandler> matchingHandlers = new List<OSHttpHandler>(scoredHandlers.Keys);
_LogDumpOSHttpHandlerList("before sort: ", matchingHandlers);
matchingHandlers.Sort(delegate(OSHttpHandler x, OSHttpHandler y)
{
return scoredHandlers[x] - scoredHandlers[y];
});
_LogDumpOSHttpHandlerList("after sort: ", matchingHandlers);
LogDumpHandlerList(matchingHandlers);
return matchingHandlers;
}
[ConditionalAttribute("DEBUGGING")]
private void _LogDumpOSHttpHandler(string msg, OSHttpHandler h)
private void LogDumpHandlerList(List<OSHttpHandler> l)
{
_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);
_log.DebugFormat("[{0}] OSHttpHandlerList dump:", EngineID);
foreach (OSHttpHandler h in l)
_LogDumpOSHttpHandler("OSHttpHandler", h);
_log.DebugFormat(" ", h.ToString());
}
}
}