mirror of
https://github.com/opensim/opensim.git
synced 2026-08-08 18:25:33 +08:00
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:
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user