public RouteValueDictionary Match(Uri url, RouteValueDictionary defaults) { if (url == null) { return(null); } ParsedRoutePattern parsedUrl = Parse(url.ToString()); RouteValueDictionary values = defaults != null ? new RouteValueDictionary(defaults) : new RouteValueDictionary(); // check Scheme if (IsVariableSegment(SchemeSegment)) { string variableName = GetVariableName(SchemeSegment); values[variableName] = parsedUrl.SchemeSegment; } else if (!parsedUrl.SchemeSegment.Equals(SchemeSegment, StringComparison.InvariantCultureIgnoreCase) && !"".Equals(SchemeSegment)) { return(null); } // check Host if (!SegmentsMatchs(hostSegments, parsedUrl.hostSegments, values, HostSeparator, true) && !"".Equals(HostPattern)) { return(null); } // check Path if (!SegmentsMatchs(pathSegments, parsedUrl.pathSegments, values, PathDelimiter)) { return(null); } return(values); }
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { Uri requestUrl = requestContext.HttpContext.Request.Url; var defaultScheme = requestUrl != null ? requestUrl.Scheme : string.Empty; var contextValues = new RouteValueDictionary(requestContext.RouteData.Values); if (parsedRoute.HasHostPattern && requestUrl != null) { // create a fake patterm just to extract variables values from host var pattern = (string.IsNullOrEmpty(defaultScheme) ? "http://" : defaultScheme + "://") + parsedRoute.HostPattern; var parsedHostRoute = ParsedRoutePattern.Parse(pattern); contextValues.MergeWith(parsedHostRoute.Match(requestUrl, null)); } var matchUrl = parsedRoute.CreateUrlWhenMatch(defaultScheme, values, Defaults, contextValues); if (matchUrl == null || !MatchConstraints(matchUrl.UsedValues)) { return(null); } var virtualPathData = new VirtualPathData(this, matchUrl.Url); virtualPathData.DataTokens.OverrideMergeWith(DataTokens); return(virtualPathData); }