+
+ internal bool PathMatches (string p)
+ {
+ int slash = p.LastIndexOf ('/');
+ string orig = p;
+ if (slash != -1)
+ p = p.Substring (slash);
+
+ for (int j = Paths.Length; j > 0; ){
+ j--;
+ FileMatchingInfo fm = Paths [j];
+
+ if (fm.MatchExact != null)
+ return fm.MatchExact.Length == p.Length && StrUtils.EndsWith (p, fm.MatchExact);
+
+ if (fm.EndsWith != null)
+ return StrUtils.EndsWith (p, fm.EndsWith);
+
+ if (fm.MatchExpr == "*")
+ return true;
+
+ /* convert to regexp */
+ return fm.RegExp.IsMatch (orig);
+ }
+ return false;
+ }
+
+ // Loads the handler, possibly delay-loaded.
+ internal object GetHandlerInstance ()
+ {
+ IHttpHandler ihh = instance as IHttpHandler;
+
+ if (instance == null || (ihh != null && !ihh.IsReusable)){
+ if (type == null)
+ type = LoadType (Type);
+
+ instance = Activator.CreateInstance (type);
+ }
+
+ return instance;
+ }
+
+ class FileMatchingInfo {
+ public string MatchExact;
+ public string MatchExpr;
+
+ // If set, we can fast-path the patch with string.EndsWith (FMI.EndsWith)
+ public string EndsWith;
+ public Regex RegExp;
+
+ public FileMatchingInfo (string s)
+ {
+ MatchExpr = s;
+
+ if (s[0] == '*' && (s.IndexOf ('*', 1) == -1))
+ EndsWith = s.Substring (1);
+
+ if (s.IndexOf ('*') == -1)
+ MatchExact = "/" + s;
+
+ if (MatchExpr != "*") {
+ string expr = MatchExpr.Replace(".", "\\.").Replace("?", "\\?").Replace("*", ".*");
+ if (expr.Length > 0 && expr [0] =='/')
+ expr = expr.Substring (1);
+
+ expr += "\\z";
+ RegExp = new Regex (expr);
+ }
+ }
+ }
+#endregion
+