private async Task <RouterResult> CompileRoutes(RouteTree routeTree, RouteContext context, HtmlNode node = null, Component parent = null) { var component = _provider.CreateComponent(routeTree.Route.Component, context: context.HttpContext); var _authorizationService = context.HttpContext.RequestServices.GetRequiredService <IAuthorizationService>(); if (routeTree.Route.Handler != null) { _currentRoute.Route = routeTree.Route; var authResult = await _authorizationService.AuthorizeAsync(context.HttpContext.User, new object { }, "BibaScheme"); if (!authResult.Succeeded) { throw new UnauthorizedAccessException(); } } if (!routeTree.Skip) { if (node == null) { node = new HtmlNode(HtmlNodeType.Document, new HtmlDocument(), 0); node.InnerHtml = _compiler.PassValues(component); } else { var container = node.Descendants().FirstOrDefault(x => x.Attributes.Any(a => a.Name.Equals("router-container"))); if (container != null) { container.InnerHtml = _compiler.PassValues(component); } else { throw new RouterChildContainerNotExistsException(); } } } if (routeTree.NestedRoute != null) { return(await CompileRoutes(routeTree.NestedRoute, context, node, parent)); } return(new RouterResult { Html = node.OuterHtml, Scope = component.Scope }); }
private async Task ExecuteRouter(RouteContext context) { context.HttpContext.Request.Path = context.HttpContext.Request.Path.Value.Replace("/c/", "/"); var actualRoute = (Route)context.RouteData.Routers[1]; RouteTree routeTree; var bibaRoute = _routes.FirstOrDefault(x => x.Path.ToLower().Equals(actualRoute.Name)); if (bibaRoute != null) { routeTree = new RouteTree { Route = bibaRoute, RouteName = bibaRoute.Path } } ; else { routeTree = BuildRouteTree(TemplateParser.Parse(context.HttpContext.Request.Path.Value.Remove(0, 1)).Segments, TemplateParser.Parse(PathString.FromUriComponent( new Uri(context.HttpContext.Request.Headers["Referer"].ToString(), UriKind.Absolute)).Value.Remove(0, 1)).Segments); } var completeTemplate = new RouterResult(); try { completeTemplate = await CompileRoutes(routeTree, context); } catch (UnauthorizedAccessException) { context.HttpContext.Response.StatusCode = 401; await context.HttpContext.Response.WriteAsync("Unauthorize"); } await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(completeTemplate, new JsonSerializerSettings { ContractResolver = _contractResolver })); }
private RouteTree BuildRouteTree(IList <TemplateSegment> toSegments, IList <TemplateSegment> fromSegments, RouteTree route = null, Routes routes = null) { if (routes == null) { routes = _routes; } if (route == null) { route = new RouteTree(); if (toSegments.Count() == 0) { route.RouteName = ""; route.Route = routes.FindRoute(route.RouteName); return(route); } } if (toSegments.Count > 0 && fromSegments.Count > 0) { if (toSegments[0].Parts[0].Text == fromSegments[0].Parts[0].Text) { route.Skip = true; } else { fromSegments.Clear(); } } else { fromSegments.Clear(); } route.RouteName = toSegments.First().Parts.First().Text; route.Route = routes.FindRoute(route.RouteName); if (route.Route == null) { route.RouteName = string.Join("/", toSegments.Select(x => x.Parts[0].Text)); route.Route = routes.FindRoute(route.RouteName); if (route.Route == null) { throw new RouteNotExistsException(route.RouteName); } } toSegments.RemoveAt(0); if (fromSegments.Count > 0) { fromSegments.RemoveAt(0); } if (toSegments.Count > 0) { route.NestedRoute = new RouteTree(); BuildRouteTree(toSegments, fromSegments, route.NestedRoute, route.Route.Children); } return(route); }