Example #1
0
        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
            });
        }
Example #2
0
        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
            }));
        }
Example #3
0
        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);
        }