예제 #1
0
        public void AuthRoute(RouteContext ctx)
        {
            if (ctx.Method.NoAuth)
            {
                return;
            }

            var authToken = ctx.HttpRequest.GetHeader("monospad-auth-token");

            Guid tokenGuid;
            Guid.TryParse(authToken, out tokenGuid);

            if (tokenGuid == Guid.Empty)
            {
                throw Errors.Auth_LoginRequired;
            }

            var login = _repo.Select<Login>()
                .Join(l => l.User)
                .FirstOrDefault(l => l.Token == tokenGuid);

            if (login == null)
            {
                throw Errors.Auth_LoginRequired;
            }

            if (login.ExpireDate < DateTime.UtcNow)
            {
                throw Errors.Auth_LoginTokenExpired;
            }

            MonospadContext.Current.Login = login;
        }
 public void AfterCall(RouteContext ctx)
 {
     foreach (var interceptor in _interceptors.Reverse())
     {
         interceptor.AfterCall(ctx);
     }
 }
 public IActionInterceptor Build(RouteContext context)
 {
     return new MonospadActionInterceptor(
         new ValidationInterceptor(),
         new UnitOfWorkInterceptor(),
         new SecurityInterceptor(_authProvider));
 }
예제 #4
0
        public object BeforeCall(RouteContext ctx)
        {
            if (ctx.Parameters.Length == 1)
            {
                ValidationManager.Validate(ctx.Parameters[0]);
            }

            return null;
        }
예제 #5
0
        public object BeforeCall(RouteContext ctx)
        {
            _uow = DependencyContainer.Current.Resolve<IUnitOfWork>();

            if (ctx.Method.HttpMethod != HttpMethod.Get)
            {
                _uow.BeginTransaction();
            }
            return null;
        }
 public object BeforeCall(RouteContext ctx)
 {
     foreach (var interceptor in _interceptors)
     {
         var res = interceptor.BeforeCall(ctx);
         if (res != null)
         {
             return res;
         }
     }
     return null;
 }
 public object OnException(RouteContext ctx)
 {
     foreach (var interceptor in _interceptors.Reverse())
     {
         var res = interceptor.OnException(ctx);
         if (res != null)
         {
             return res;
         }
     }
     return null;
 }
예제 #8
0
 public object OnException(RouteContext ctx)
 {
     var ex = ctx.Exception as Error ?? Errors.Unknown;
     return Response.Error(ex);
 }
 public string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
 {
     return(SelectActionImpl(routeContext, controllerResult, actionDescriptors));
 }
예제 #10
0
 public Task RouteAsync(RouteContext context)
 {
     throw new NotImplementedException();
 }
 /// <summary>
 /// Determines whether the action selection is valid for the specified route context.
 /// </summary>
 public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
 {
     return(routeContext.HttpContext.Request.IsAjaxRequest());
 }
예제 #12
0
        /// <inheritdoc />
        public async Task RouteAsync(RouteContext context)
        {
            foreach (var tree in _trees)
            {
                var tokenizer = new PathTokenizer(context.HttpContext.Request.Path);
                var root      = tree.Root;

                var treeEnumerator = new TreeEnumerator(root, tokenizer);

                // Create a snapshot before processing the route. We'll restore this snapshot before running each
                // to restore the state. This is likely an "empty" snapshot, which doesn't allocate.
                var snapshot = context.RouteData.PushState(router: null, values: null, dataTokens: null);

                while (treeEnumerator.MoveNext())
                {
                    var node = treeEnumerator.Current;
                    foreach (var item in node.Matches)
                    {
                        var entry   = item.Entry;
                        var matcher = item.TemplateMatcher;

                        try
                        {
                            if (!matcher.TryMatch(context.HttpContext.Request.Path, context.RouteData.Values))
                            {
                                continue;
                            }

                            if (!RouteConstraintMatcher.Match(
                                    entry.Constraints,
                                    context.RouteData.Values,
                                    context.HttpContext,
                                    this,
                                    RouteDirection.IncomingRequest,
                                    _constraintLogger))
                            {
                                continue;
                            }

                            _logger.RequestMatchedRoute(entry.RouteName, entry.RouteTemplate.TemplateText);
                            context.RouteData.Routers.Add(entry.Handler);

                            await entry.Handler.RouteAsync(context);

                            if (context.Handler != null)
                            {
                                return;
                            }
                        }
                        finally
                        {
                            if (context.Handler == null)
                            {
                                // Restore the original values to prevent polluting the route data.
                                snapshot.Restore();
                            }
                        }
                    }
                }
            }
        }
예제 #13
0
 public ModuleRouteContext(HttpContext httpContext, RouteContext parentRouteContext) : base(httpContext)
 {
     _parentRouteContext = parentRouteContext;
     RouteData           = _parentRouteContext.RouteData;
 }
예제 #14
0
        private static async Task <IHtmlContent> RenderActionAsync(this IHtmlHelper helper, string action, string controller, string area, object parameters = null)
        {
            // fetching required services for invocation
            var serviceProvider       = helper.ViewContext.HttpContext.RequestServices;
            var actionContextAccessor = helper.ViewContext.HttpContext.RequestServices.GetRequiredService <IActionContextAccessor>();
            var httpContextAccessor   = helper.ViewContext.HttpContext.RequestServices.GetRequiredService <IHttpContextAccessor>();
            var actionSelector        = serviceProvider.GetRequiredService <IActionSelector>();

            // creating new action invocation context
            var routeData = new RouteData();

            foreach (var router in helper.ViewContext.RouteData.Routers)
            {
                routeData.PushState(router, null, null);
            }
            routeData.PushState(null, new RouteValueDictionary(new { controller = controller, action = action, area = area }), null);
            routeData.PushState(null, new RouteValueDictionary(parameters ?? new { }), null);

            //get the actiondescriptor
            RouteContext routeContext = new RouteContext(helper.ViewContext.HttpContext)
            {
                RouteData = routeData
            };
            var candidates       = actionSelector.SelectCandidates(routeContext);
            var actionDescriptor = actionSelector.SelectBestCandidate(routeContext, candidates);

            var originalActionContext = actionContextAccessor.ActionContext;
            var originalhttpContext   = httpContextAccessor.HttpContext;

            try
            {
                var newHttpContext = serviceProvider.GetRequiredService <IHttpContextFactory>().Create(helper.ViewContext.HttpContext.Features);
                if (newHttpContext.Items.ContainsKey(typeof(IUrlHelper)))
                {
                    newHttpContext.Items.Remove(typeof(IUrlHelper));
                }
                newHttpContext.Response.Body = new MemoryStream();
                var actionContext = new ActionContext(newHttpContext, routeData, actionDescriptor);
                actionContextAccessor.ActionContext = actionContext;
                var invoker = serviceProvider.GetRequiredService <IActionInvokerFactory>().CreateInvoker(actionContext);
                await invoker.InvokeAsync();

                newHttpContext.Response.Body.Position = 0;
                using (var reader = new StreamReader(newHttpContext.Response.Body))
                {
                    return(new HtmlString(reader.ReadToEnd()));
                }
            }
            catch (Exception ex)
            {
                return(new HtmlString(ex.Message));
            }
            finally
            {
                actionContextAccessor.ActionContext = originalActionContext;
                httpContextAccessor.HttpContext     = originalhttpContext;
                if (helper.ViewContext.HttpContext.Items.ContainsKey(typeof(IUrlHelper)))
                {
                    helper.ViewContext.HttpContext.Items.Remove(typeof(IUrlHelper));
                }
            }
        }
예제 #15
0
 public Task RouteAsync(RouteContext context)
 {
     context.Handler = (c) => Task.FromResult(0);
     return(Task.FromResult(false));
 }
예제 #16
0
 public abstract Task RouteAsync(RouteContext context);
예제 #17
0
 /// <summary>
 /// Determines whether the action selection is valid for the specified route context.
 /// </summary>
 /// <param name="routeContext">The route context.</param>
 /// <param name="action">Information about the action.</param>
 /// <returns>
 /// <see langword="true"/> if the action  selection is valid for the specified context;
 /// otherwise, <see langword="false"/>.
 /// </returns>
 public abstract bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action);
예제 #18
0
 protected Mapping()
 {
     Context = new RouteContext();
 }
예제 #19
0
 public HttpValidationStatus Validate(ResponseContext response, RouteContext context)
 {
     // TODO: Implement response validator
     return(HttpValidationStatus.Success());
 }
예제 #20
0
 public virtual void RestoreRouteData(RouteContext context, ReusablePipeline pipeline)
 {
     context.RouteData.Values[_options.Value.PipelineNameRouteDataKey] = pipeline.Name.ToLower();
 }
예제 #21
0
        public async Task RouteAsync([NotNull] RouteContext context)
        {
            var services = context.HttpContext.RequestServices;

            // Verify if AddMvc was done before calling UseMvc
            // We use the MvcMarkerService to make sure if all the services were added.
            MvcServicesHelper.ThrowIfMvcNotRegistered(services);
            EnsureServices(context.HttpContext);

            var actionDescriptor = await _actionSelector.SelectAsync(context);

            if (actionDescriptor == null)
            {
                _logger.LogVerbose("No actions matched the current request.");
                return;
            }

            // Replacing the route data allows any code running here to dirty the route values or data-tokens
            // without affecting something upstream.
            var oldRouteData = context.RouteData;
            var newRouteData = new RouteData(oldRouteData);

            if (actionDescriptor.RouteValueDefaults != null)
            {
                foreach (var kvp in actionDescriptor.RouteValueDefaults)
                {
                    if (!newRouteData.Values.ContainsKey(kvp.Key))
                    {
                        newRouteData.Values.Add(kvp.Key, kvp.Value);
                    }
                }
            }

            try
            {
                context.RouteData = newRouteData;

                if (_notifier.ShouldNotify("Microsoft.AspNet.Mvc.BeforeAction"))
                {
                    _notifier.Notify(
                        "Microsoft.AspNet.Mvc.BeforeAction",
                        new { actionDescriptor, httpContext = context.HttpContext, routeData = context.RouteData });
                }

                using (_logger.BeginScope("ActionId: {ActionId}", actionDescriptor.Id))
                {
                    _logger.LogVerbose("Executing action {ActionDisplayName}", actionDescriptor.DisplayName);

                    await InvokeActionAsync(context, actionDescriptor);

                    context.IsHandled = true;
                }
            }
            finally
            {
                if (_notifier.ShouldNotify("Microsoft.AspNet.Mvc.AfterAction"))
                {
                    _notifier.Notify(
                        "Microsoft.AspNet.Mvc.AfterAction",
                        new { actionDescriptor, httpContext = context.HttpContext });
                }

                if (!context.IsHandled)
                {
                    context.RouteData = oldRouteData;
                }
            }
        }
예제 #22
0
 public void AfterCall(RouteContext ctx)
 {
 }
예제 #23
0
 public object OnException(RouteContext ctx)
 {
     _uow?.Rollback();
     return null;
 }
예제 #24
0
 public Task RouteAsync(RouteContext context)
 {
     context.Handler = new ApiActionRouteHandler(_edgeDeserializer, _edgeSerializerProvider,
                                                 _apiActionExecutioner, context.RouteData).Handle;
     return(CompletedTask);
 }
        /// <summary>
        /// Is valid?
        /// </summary>
        /// <param name="routeContext">Route context</param>
        /// <param name="action">Action descriptor</param>
        /// <returns>Result</returns>
        public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
        {
            if (routeContext.HttpContext.Request.Method != WebRequestMethods.Http.Post)
            {
                return(false);
            }

            foreach (var buttonName in _submitButtonNames)
            {
                try
                {
                    switch (this._requirement)
                    {
                    case FormValueRequirement.Equal:
                    {
                        if (_validateNameOnly)
                        {
                            //"name" only
                            if (routeContext.HttpContext.Request.Form.Keys.Any(x => x.Equals(buttonName, StringComparison.InvariantCultureIgnoreCase)))
                            {
                                return(true);
                            }
                        }
                        else
                        {
                            //validate "value"
                            //do not iterate because "Invalid request" exception can be thrown
                            string value = routeContext.HttpContext.Request.Form[buttonName];
                            if (!string.IsNullOrEmpty(value))
                            {
                                return(true);
                            }
                        }
                    }
                    break;

                    case FormValueRequirement.StartsWith:
                    {
                        if (_validateNameOnly)
                        {
                            //"name" only
                            if (routeContext.HttpContext.Request.Form.Keys.Any(x => x.StartsWith(buttonName, StringComparison.InvariantCultureIgnoreCase)))
                            {
                                return(true);
                            }
                        }
                        else
                        {
                            //validate "value"
                            foreach (var formValue in routeContext.HttpContext.Request.Form.Keys)
                            {
                                if (formValue.StartsWith(buttonName, StringComparison.InvariantCultureIgnoreCase))
                                {
                                    var value = routeContext.HttpContext.Request.Form[formValue];
                                    if (!string.IsNullOrEmpty(value))
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                    break;
                    }
                }
                catch (Exception exc)
                {
                    //try-catch to ensure that no exception is throw
                    Debug.WriteLine(exc.Message);
                }
            }
            return(false);
        }
예제 #26
0
        /**
         * Create SQL rewrite context.
         *
         * @param sql SQL
         * @param parameters parameters
         * @param sqlStatementContext SQL statement context
         * @param routeContext route context
         * @return SQL rewrite context
         */
        public SqlRewriteContext CreateSqlRewriteContext(string sql, ParameterContext parameterContext, ISqlCommandContext <ISqlCommand> sqlCommandContext, RouteContext routeContext)
        {
            var result = new SqlRewriteContext(_schemaMetaData, sqlCommandContext, sql, parameterContext);

            Decorate(_decorators, result, routeContext);
            result.GenerateSqlTokens();
            return(result);
        }
예제 #27
0
        IReadOnlyList <ActionSelectorCandidate> EvaluateActionConstraintsCore(RouteContext context, IReadOnlyList <ActionSelectorCandidate> candidates, int?startingOrder)
        {
            Contract.Requires(context != null);
            Contract.Requires(candidates != null);

            var order = default(int?);

            for (var i = 0; i < candidates.Count; i++)
            {
                var candidate = candidates[i];

                if (candidate.Constraints == null)
                {
                    continue;
                }

                for (var j = 0; j < candidate.Constraints.Count; j++)
                {
                    var constraint = candidate.Constraints[j];

                    if ((startingOrder == null || constraint.Order > startingOrder) && (order == null || constraint.Order < order))
                    {
                        order = constraint.Order;
                    }
                }
            }

            if (order == null)
            {
                return(candidates);
            }

            var actionsWithConstraint    = new List <ActionSelectorCandidate>();
            var actionsWithoutConstraint = new List <ActionSelectorCandidate>();
            var constraintContext        = new ActionConstraintContext()
            {
                Candidates   = candidates,
                RouteContext = context,
            };

            for (var i = 0; i < candidates.Count; i++)
            {
                var candidate = candidates[i];
                var isMatch   = true;
                var foundMatchingConstraint = false;

                if (candidate.Constraints != null)
                {
                    constraintContext.CurrentCandidate = candidate;

                    for (var j = 0; j < candidate.Constraints.Count; j++)
                    {
                        var constraint = candidate.Constraints[j];

                        if (constraint.Order != order)
                        {
                            continue;
                        }

                        foundMatchingConstraint = true;

                        if (!constraint.Accept(constraintContext))
                        {
                            isMatch = false;
                            Logger.ConstraintMismatch(candidate.Action.DisplayName, candidate.Action.Id, constraint);
                            break;
                        }
                    }
                }

                if (isMatch && foundMatchingConstraint)
                {
                    actionsWithConstraint.Add(candidate);
                }
                else if (isMatch)
                {
                    actionsWithoutConstraint.Add(candidate);
                }
            }

            if (actionsWithConstraint.Count > 0)
            {
                var matches = EvaluateActionConstraintsCore(context, actionsWithConstraint, order);

                if (matches?.Count > 0)
                {
                    return(matches);
                }
            }

            if (actionsWithoutConstraint.Count == 0)
            {
                return(null);
            }
            else
            {
                return(EvaluateActionConstraintsCore(context, actionsWithoutConstraint, order));
            }
        }
예제 #28
0
 private void Decorate(IDictionary <IBaseRule, ISqlRewriteContextDecorator> decorators, SqlRewriteContext sqlRewriteContext, RouteContext routeContext)
 {
     foreach (var decoratorEntry in decorators)
     {
         var rule      = decoratorEntry.Key;
         var decorator = decoratorEntry.Value;
         if (decorator is IRouteContextAware routeContextAware)
         {
             routeContextAware.SetRouteContext(routeContext);
         }
         decorator.Decorate(rule, _properties, sqlRewriteContext);
     }
 }
        /// <inheritdoc/>
        public virtual ActionDescriptor SelectAction(RouteContext routeContext)
        {
            if (routeContext == null)
            {
                throw Error.ArgumentNull("routeContext");
            }

            if (_attributeMappings == null)
            {
                if (ActionDescriptorCollectionProvider == null)
                {
                    ActionDescriptorCollectionProvider =
                        routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>
                            ();
                }

                if (ODataPathTemplateHandler == null)
                {
                    ODataPathTemplateHandler =
                        routeContext.HttpContext.RequestServices.GetRequiredService <IODataPathTemplateHandler>();
                }

                IEdmModel model = routeContext.HttpContext.ODataFeature().Model;

                IEnumerable <ControllerActionDescriptor> actionDescriptors =
                    ActionDescriptorCollectionProvider.ActionDescriptors.Items.OfType <ControllerActionDescriptor>();

                _attributeMappings = BuildAttributeMappings(actionDescriptors, model);
            }

            HttpRequest request   = routeContext.HttpContext.Request;
            ODataPath   odataPath = routeContext.HttpContext.ODataFeature().Path;
            Dictionary <string, object> values = new Dictionary <string, object>();

            var routeData = routeContext.RouteData;
            var routingConventionsStore = request.ODataFeature().RoutingConventionsStore;

            foreach (KeyValuePair <ODataPathTemplate, ControllerActionDescriptor> attributeMapping in _attributeMappings)
            {
                ODataPathTemplate          template         = attributeMapping.Key;
                ControllerActionDescriptor actionDescriptor = attributeMapping.Value;

                if (IsHttpMethodMatch(actionDescriptor, request.Method) && template.TryMatch(odataPath, values))
                {
                    foreach (var item in values)
                    {
                        if (item.Key.StartsWith(ODataParameterValue.ParameterValuePrefix, StringComparison.Ordinal) &&
                            item.Value is ODataParameterValue)
                        {
                            routingConventionsStore.Add(item);
                        }
                        else
                        {
                            routeData.Values.Add(item.Key, item.Value);
                        }
                    }

                    return(actionDescriptor);
                }
            }

            return(null);
        }
예제 #30
0
        /// <summary>
        /// Create and init the context.
        /// </summary>
        /// <param name="dbctx"></param>
        /// <param name="host"></param>
        /// <param name="path"></param>
        /// <param name="regionName"></param>
        /// <param name="user"></param>
        /// <param name="checkInitResults"></param>
        /// <returns></returns>
        protected async Task <WcmsAppContext> CreateAndInitAppContext(AppDbContext dbctx, string host, string path, string regionName, ApplicationUser user = null, bool checkInitResults = true)
        {
            // Check the service provider...
            Assert.NotEqual(null, _serviceProvider);

            // Create and init the http context...
            var httpContext = new DefaultHttpContext();

            Assert.NotEqual(null, httpContext);
            // Configure the http context...
            httpContext.RequestServices = _services.BuildServiceProvider();
            Assert.NotEqual(null, httpContext.RequestServices);
            httpContext.Request.Host = new HostString(host);
            httpContext.Request.Path = new PathString(path);
            // Add user to the http context...
            if (user != null)
            {
                UserClaimsPrincipalFactory <ApplicationUser, IdentityRole> clmFact
                    = _GetRequiredServicee <UserClaimsPrincipalFactory <ApplicationUser, IdentityRole> >(httpContext.RequestServices);
                Assert.NotEqual(null, clmFact);
                httpContext.User = /*ClaimsPrincipal upp =*/ await clmFact.CreateAsync(user);

                Assert.NotEqual(null, httpContext.User /*upp*/);
                //httpContext.User = new ClaimsPrincipal(upp);
            }

            // Create and init the route context...
            var routeContext = new RouteContext(httpContext);

            Assert.NotEqual(null, routeContext);
            // Configure the route context...
            routeContext.RouteData = new RouteData();
            Assert.NotEqual(null, routeContext.RouteData);
            routeContext.RouteData.Values.Add(CRoute.RegionTagName, regionName);

            // Build loger factory...
            var logFactory =
                _GetRequiredServicee <ILoggerFactory>(httpContext.RequestServices);

            Assert.NotEqual(null, logFactory);
#if DEBUG
            //logFactory.AddConsole(_LogFilter);
            logFactory.AddDebug(_LogFilter);
#endif

            // Create and init the context...
            WcmsAppContext ctx =
                _GetRequiredServicee <WcmsAppContext>(httpContext.RequestServices);
            Assert.NotEqual(null, ctx);
            Assert.Equal(null, ctx.User);
            Assert.Equal(null, ctx.Site);
            //ctx.UnitTestInit(dbctx);
            int initSiteAsyncRes = await ctx.InitSiteAsync(httpContext,
                                                           _GetRequiredServicee <IAuthorizationService>(httpContext.RequestServices));

            bool initRouteAsyncRes = await ctx.InitRouteAsync(routeContext);

            if (checkInitResults == true)
            {
                Assert.Equal(3, initSiteAsyncRes); // No module registered.
                Assert.Equal(true, initRouteAsyncRes);
            }
            return(ctx);
        }
예제 #31
0
 /// <summary>
 /// Occurs when a single action is matched to the route policy.
 /// </summary>
 /// <param name="context">The current <see cref="RouteContext">route context</see>.</param>
 /// <param name="selectionResult">The current <see cref="ActionSelectionResult">action selection result</see>.</param>
 /// <returns>The single, matching <see cref="ActionDescriptor">action</see> conforming to the policy.</returns>
 protected virtual ActionDescriptor OnSingleMatch(RouteContext context, ActionSelectionResult selectionResult)
 {
     Arg.NotNull(context, nameof(context));
     Arg.NotNull(selectionResult, nameof(selectionResult));
     return(selectionResult.BestMatch);
 }
예제 #32
0
 /// <inheritdoc />
 protected override Task OnRouteMatched(RouteContext context)
 {
     context.RouteData.Routers.Add(_target);
     return(_target.RouteAsync(context));
 }
예제 #33
0
        /// <inheritdoc />
        public Task RouteAsync(RouteContext context)
        {
            var router = GetTreeRouter();

            return(router.RouteAsync(context));
        }
예제 #34
0
 public async Task <ActionDescriptor> SelectAsync(RouteContext context)
 {
     return(await Task.FromResult(Select(context)));
 }
        private string SelectActionImpl(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
        {
            Microsoft.AspNet.OData.Routing.ODataPath odataPath = routeContext.HttpContext.ODataFeature().Path;
            HttpRequest request = routeContext.HttpContext.Request;

            if (odataPath.PathTemplate == "~/entityset")
            {
                EntitySetSegment  entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase entitySet        = entitySetSegment.EntitySet;

                if (HttpMethods.IsGet(request.Method))
                {
                    // e.g. Try GetCustomers first, then fall back to Get action name
                    return(actionDescriptors.FindMatchingAction(
                               "Get" + entitySet.Name,
                               "Get"));
                }
                else if (HttpMethods.IsPost(request.Method))
                {
                    // e.g. Try PostCustomer first, then fall back to Post action name
                    return(actionDescriptors.FindMatchingAction(
                               "Post" + entitySet.EntityType().Name,
                               "Post"));
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/key" ||
                     odataPath.PathTemplate == "~/entityset/key/cast")
            {
                string httpMethodName;

                if (HttpMethods.IsGet(request.Method))
                {
                    httpMethodName = "Get";
                }
                else if (HttpMethods.IsPut(request.Method))
                {
                    httpMethodName = "Put";
                }
                else if (HttpMethods.IsPatch(request.Method))
                {
                    httpMethodName = "Patch";
                }
                else if (HttpMethods.IsDelete(request.Method))
                {
                    httpMethodName = "Delete";
                }
                else
                {
                    return(null);
                }

                Contract.Assert(httpMethodName != null);

                IEdmEntityType entityType = (IEdmEntityType)odataPath.EdmType;

                // e.g. Try GetCustomer first, then fallback on Get action name
                string actionName = actionDescriptors.FindMatchingAction(
                    httpMethodName + entityType.Name,
                    httpMethodName);

                if (actionName != null)
                {
                    KeySegment keySegment = (KeySegment)odataPath.Segments[1];
                    // TODO: Add key/value to RouteData
                    return(actionName);
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/$count" &&
                     HttpMethods.IsGet(request.Method))
            {
                EntitySetSegment  entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase entitySet        = entitySetSegment.EntitySet;

                // e.g. Try GetCustomers first, then fall back to Get action name
                return(actionDescriptors.FindMatchingAction(
                           "Get" + entitySet.Name,
                           "Get"));
            }
            else if (odataPath.PathTemplate == "~/entityset/cast")
            {
                EntitySetSegment   entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase  entitySet        = entitySetSegment.EntitySet;
                IEdmCollectionType collectionType   = (IEdmCollectionType)odataPath.EdmType;
                IEdmEntityType     entityType       = (IEdmEntityType)collectionType.ElementType.Definition;

                if (HttpMethods.IsGet(request.Method))
                {
                    // e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
                    return(actionDescriptors.FindMatchingAction(
                               "Get" + entitySet.Name + "From" + entityType.Name,
                               "GetFrom" + entityType.Name));
                }
                else if (HttpMethods.IsPost(request.Method))
                {
                    // e.g. Try PostCustomerFromSpecialCustomer first, then fall back to PostFromSpecialCustomer
                    return(actionDescriptors.FindMatchingAction(
                               "Post" + entitySet.EntityType().Name + "From" + entityType.Name,
                               "PostFrom" + entityType.Name));
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/cast/$count" &&
                     HttpMethods.IsGet(request.Method))
            {
                EntitySetSegment   entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase  entitySet        = entitySetSegment.EntitySet;
                IEdmCollectionType collectionType   = (IEdmCollectionType)odataPath.Segments[1].EdmType;
                IEdmEntityType     entityType       = (IEdmEntityType)collectionType.ElementType.Definition;

                // e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
                return(actionDescriptors.FindMatchingAction(
                           "Get" + entitySet.Name + "From" + entityType.Name,
                           "GetFrom" + entityType.Name));
            }

            return(null);
        }
예제 #36
0
        public async virtual Task RouteAsync(RouteContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context));
            }

            EnsureLoggers(context.HttpContext);

            var requestPath = context.HttpContext.Request.Path;
            var values = _matcher.Match(requestPath);

            if (values == null)
            {
                // If we got back a null value set, that means the URI did not match
                return;
            }

            var oldRouteData = context.RouteData;

            var newRouteData = new RouteData(oldRouteData);

            // Perf: Avoid accessing data tokens if you don't need to write to it, these dictionaries are all
            // created lazily.
            if (_dataTokens.Count > 0)
            {
                MergeValues(newRouteData.DataTokens, _dataTokens);
            }

            newRouteData.Routers.Add(_target);
            MergeValues(newRouteData.Values, values);

            if (!RouteConstraintMatcher.Match(
                Constraints,
                newRouteData.Values,
                context.HttpContext,
                this,
                RouteDirection.IncomingRequest,
                _constraintLogger))
            {
                return;
            }

            _logger.LogVerbose(
                "Request successfully matched the route with name '{RouteName}' and template '{RouteTemplate}'.",
                Name,
                RouteTemplate);

            try
            {
                context.RouteData = newRouteData;

                await _target.RouteAsync(context);
            }
            finally
            {
                // Restore the original values to prevent polluting the route data.
                if (!context.IsHandled)
                {
                    context.RouteData = oldRouteData;
                }
            }
        }
예제 #37
0
 public object OnException(RouteContext ctx)
 {
     return null;
 }
예제 #38
0
        public static Task Initialize()
        {
            return Task.Run(() =>
            {

                _database = new RailwayDataModelContainer();

                Clients = new ClientContext();
                Employees = new EmployeeContext();
                Stations = new StationContext();
                Seats = new SeatContext();
                Tickets = new TicketContext();
                TrainWagons = new TrainWagonContext();
                Trains = new TrainContext();
                Routes = new RouteContext();
                VoyageRoutes = new VoyageRouteContext();
                Voyages = new VoyageContext();
                Wagons = new WagonContext();
                WagonSeats = new WagonSeatContext();

                Clients.Repository = _database.ClientSet;
                Employees.Repository = _database.EmployeeSet;
                Stations.Repository = _database.StationSet;
                Seats.Repository = _database.SeatSet;
                Tickets.Repository = _database.TicketSet;
                TrainWagons.Repository = _database.TrainWagonSet;
                Trains.Repository = _database.TrainSet;
                VoyageRoutes.Repository = _database.VoyageRouteSet;
                Routes.Repository = _database.RouteSet;
                Voyages.Repository = _database.VoyageSet;
                Wagons.Repository = _database.WagonSet;
                WagonSeats.Repository = _database.WagonSeatSet;

                DataBase.Database.Connection.OpenAsync();
            });
        }
예제 #39
0
 public object BeforeCall(RouteContext ctx)
 {
     _authProvider.AuthRoute(ctx);
     return null;
 }
예제 #40
0
        private async Task BatchVariableRequest(RouteContext context)
        {
            var segments =
                context.HttpContext
                .Request
                .Path
                .Value
                .Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);

            if (segments.Length == 1 && segments[0] == "variables")
            {
                using var reader = new StreamReader(context.HttpContext.Request.Body);
                var source = await reader.ReadToEndAsync();

                var query    = JObject.Parse(source);
                var response = new JObject();
                foreach (var kernelProperty in query.Properties())
                {
                    var kernelName  = kernelProperty.Name;
                    var propertyBag = new JObject();
                    response[kernelName] = propertyBag;
                    var targetKernel = GetKernel(kernelName);
                    if (targetKernel is DotNetKernel languageKernel)
                    {
                        foreach (var variableName in kernelProperty.Value.Values <string>())
                        {
                            if (languageKernel.TryGetVariable(variableName, out object value))
                            {
                                if (value is string)
                                {
                                    propertyBag[variableName] = JToken.FromObject(value);
                                }
                                else
                                {
                                    propertyBag[variableName] = JToken.Parse(value.ToDisplayString(JsonFormatter.MimeType));
                                }
                            }
                            else
                            {
                                context.Handler = async httpContext =>
                                {
                                    httpContext.Response.StatusCode = 400;
                                    await httpContext.Response.WriteAsync($"variable {variableName} not found on kernel {kernelName}");

                                    await httpContext.Response.CompleteAsync();
                                };
                                return;
                            }
                        }
                    }
                    else
                    {
                        context.Handler = async httpContext =>
                        {
                            httpContext.Response.StatusCode = 400;
                            await httpContext.Response.WriteAsync($"kernel {kernelName} not found");

                            await httpContext.Response.CompleteAsync();
                        };
                        return;
                    }
                }

                context.Handler = async httpContext =>
                {
                    httpContext.Response.ContentType = JsonFormatter.MimeType;

                    await using (var writer = new StreamWriter(httpContext.Response.Body))
                    {
                        await writer.WriteAsync(response.ToString());
                    }

                    await httpContext.Response.CompleteAsync();
                };
            }
        }
예제 #41
0
 public override Boolean IsValidForRequest(RouteContext context, ActionDescriptor action)
 {
     return(context.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest");
 }
        /// <summary>
        /// Resolves HTTP request to a route using the provided route context and the action selector and invoker services.
        /// </summary>
        /// <param name="services">Application services from which the route will be resolved.</param>
        /// <param name="router">IRouter to resolve route values.</param>
        /// <param name="routeContext">RouteContext to use for resolving the route values.</param>
        /// <param name="fullExecution">Indicates whether the full MVC pipeline will be executed or not.</param>
        /// <returns>Resolved route information.</returns>
        public static ResolvedRouteContext Resolve(
            IServiceProvider services,
            IRouter router,
            RouteContext routeContext,
            bool fullExecution = false)
        {
            try
            {
                RouteDataResolver.ResolveRouteData(router, routeContext);
            }
            catch (Exception ex)
            {
                return(new ResolvedRouteContext($"exception was thrown when trying to resolve route data: '{ex.Unwrap().Message}'"));
            }

            var actionSelector = services.GetRequiredService <IActionSelector>();

            ActionDescriptor actionDescriptor;

            try
            {
                var actions = routeContext
                              .RouteData
                              .Routers
                              .Where(r => r.GetType() == WebFramework.Internals.MvcAttributeRouteHandler)
                              .FirstOrDefault()
                              ?.Exposed()
                              .Actions
                              ?? actionSelector.SelectCandidates(routeContext);

                actionDescriptor = actionSelector.SelectBestCandidate(
                    routeContext,
                    actions);
            }
            catch (Exception ex)
            {
                return(new ResolvedRouteContext($"exception was thrown when trying to select an action: '{ex.Unwrap().Message}'"));
            }

            if (actionDescriptor == null)
            {
                return(new ResolvedRouteContext("action could not be matched"));
            }

            routeContext.HttpContext.Features.Set(new RouteTestingFeature(fullExecution));

            var actionContext = new ActionContext(routeContext.HttpContext, routeContext.RouteData, actionDescriptor);

            if (!(actionDescriptor is ControllerActionDescriptor controllerActionDescriptor))
            {
                throw new InvalidOperationException("Only controller actions are supported by the route testing.");
            }

            var actionInvokerFactory = services.GetRequiredService <IActionInvokerFactory>();

            var invoker = actionInvokerFactory.CreateInvoker(actionContext);

            if (!(invoker is IModelBindingActionInvoker modelBindingActionInvoker))
            {
                throw new InvalidOperationException($"Route testing requires the selected {nameof(IActionInvoker)} by the {nameof(IActionInvokerFactory)} to implement {nameof(IModelBindingActionInvoker)}.");
            }

            try
            {
                AsyncHelper.RunSync(() => modelBindingActionInvoker.InvokeAsync());
            }
            catch (Exception ex)
            {
                return(new ResolvedRouteContext($"exception was thrown when trying to invoke the pipeline: '{ex.Unwrap().Message}'"));
            }

            if (modelBindingActionInvoker.BoundActionArguments == null)
            {
                var filters = actionDescriptor
                              .FilterDescriptors
                              .OrderByDescending(f => f.Order)
                              .Select(f => $"{f.Filter.GetName()} ({f.Scope.ToFilterScopeName()})");

                var filtersMessage = filters != null && filters.Any()
                    ? $"filters - {string.Join(", ", filters)}"
                    : "filters";

                return(new ResolvedRouteContext($"action could not be invoked because of the declared {filtersMessage}. Either a filter is setting the response result before the action itself, or you must set the request properties so that they will pass through the pipeline"));
            }

            return(new ResolvedRouteContext(
                       controllerActionDescriptor.ControllerTypeInfo,
                       controllerActionDescriptor.ControllerName,
                       controllerActionDescriptor.ActionName,
                       modelBindingActionInvoker.BoundActionArguments,
                       actionContext.RouteData,
                       actionContext.ModelState));
        }
예제 #43
0
            public Task RouteAsync(RouteContext context)
            {
                if (MatchingDelegate == null)
                {
                    context.Handler = NullHandler;
                }
                else
                {
                    context.Handler = MatchingDelegate(context) ? NullHandler : null;
                }

                return Task.FromResult(true);
            }
예제 #44
0
 public TelefoneRepository(RouteContext context) : base(context)
 {
 }
예제 #45
0
        /// <summary>
        /// Route request to the particular action
        /// </summary>
        /// <param name="context">A route context object</param>
        /// <returns>Task of the routing</returns>
        public override Task RouteAsync(RouteContext context)
        {
            if (!DataSettingsHelper.DatabaseIsInstalled())
            {
                return(Task.CompletedTask);
            }

            //try to get slug from the route data
            var routeValues = GetRouteValues(context);

            if (!routeValues.TryGetValue("GenericSeName", out object slugValue) || string.IsNullOrEmpty(slugValue as string))
            {
                return(Task.CompletedTask);
            }

            var slug = slugValue as string;

            //performance optimization, we load a cached verion here. It reduces number of SQL requests for each page load
            var urlRecordService = EngineContext.Current.Resolve <IUrlRecordService>();
            var urlRecord        = urlRecordService.GetBySlugCached(slug);

            //comment the line above and uncomment the line below in order to disable this performance "workaround"
            //var urlRecord = urlRecordService.GetBySlug(slug);

            //no URL record found
            if (urlRecord == null)
            {
                return(Task.CompletedTask);
            }

            //virtual directory path
            var pathBase = context.HttpContext.Request.PathBase;

            //if URL record is not active let's find the latest one
            if (!urlRecord.IsActive)
            {
                var activeSlug = urlRecordService.GetActiveSlug(urlRecord.EntityId, urlRecord.EntityName, urlRecord.LanguageId);
                if (string.IsNullOrEmpty(activeSlug))
                {
                    return(Task.CompletedTask);
                }

                //redirect to active slug if found
                var redirectionRouteData = new RouteData(context.RouteData);
                redirectionRouteData.Values["controller"]        = "Common";
                redirectionRouteData.Values["action"]            = "InternalRedirect";
                redirectionRouteData.Values["url"]               = $"{pathBase}/{activeSlug}{context.HttpContext.Request.QueryString}";
                redirectionRouteData.Values["permanentRedirect"] = true;
                context.HttpContext.Items["nop.RedirectFromGenericPathRoute"] = true;
                context.RouteData = redirectionRouteData;
                return(_target.RouteAsync(context));
            }

            //ensure that the slug is the same for the current language,
            //otherwise it can cause some issues when customers choose a new language but a slug stays the same
            var workContext            = EngineContext.Current.Resolve <IWorkContext>();
            var slugForCurrentLanguage = SeoExtensions.GetSeName(urlRecord.EntityId, urlRecord.EntityName, workContext.WorkingLanguage.Id);

            if (!string.IsNullOrEmpty(slugForCurrentLanguage) && !slugForCurrentLanguage.Equals(slug, StringComparison.InvariantCultureIgnoreCase))
            {
                //we should make validation above because some entities does not have SeName for standard (Id = 0) language (e.g. news, blog posts)

                //redirect to the page for current language
                var redirectionRouteData = new RouteData(context.RouteData);
                redirectionRouteData.Values["controller"]        = "Common";
                redirectionRouteData.Values["action"]            = "InternalRedirect";
                redirectionRouteData.Values["url"]               = $"{pathBase}/{slugForCurrentLanguage}{context.HttpContext.Request.QueryString}";
                redirectionRouteData.Values["permanentRedirect"] = false;
                context.HttpContext.Items["nop.RedirectFromGenericPathRoute"] = true;
                context.RouteData = redirectionRouteData;
                return(_target.RouteAsync(context));
            }

            //since we are here, all is ok with the slug, so process URL
            var currentRouteData = new RouteData(context.RouteData);

            switch (urlRecord.EntityName.ToLowerInvariant())
            {
            case "product":
                currentRouteData.Values["controller"] = "Product";
                currentRouteData.Values["action"]     = "ProductDetails";
                currentRouteData.Values["productid"]  = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            case "category":
                currentRouteData.Values["controller"] = "Catalog";
                currentRouteData.Values["action"]     = "Category";
                currentRouteData.Values["categoryid"] = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            case "manufacturer":
                currentRouteData.Values["controller"]     = "Catalog";
                currentRouteData.Values["action"]         = "Manufacturer";
                currentRouteData.Values["manufacturerid"] = urlRecord.EntityId;
                currentRouteData.Values["SeName"]         = urlRecord.Slug;
                break;

            case "vendor":
                currentRouteData.Values["controller"] = "Catalog";
                currentRouteData.Values["action"]     = "Vendor";
                currentRouteData.Values["vendorid"]   = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            case "newsitem":
                currentRouteData.Values["controller"] = "News";
                currentRouteData.Values["action"]     = "NewsItem";
                currentRouteData.Values["newsItemId"] = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            case "blogpost":
                currentRouteData.Values["controller"] = "Blog";
                currentRouteData.Values["action"]     = "BlogPost";
                currentRouteData.Values["blogPostId"] = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            case "topic":
                currentRouteData.Values["controller"] = "Topic";
                currentRouteData.Values["action"]     = "TopicDetails";
                currentRouteData.Values["topicId"]    = urlRecord.EntityId;
                currentRouteData.Values["SeName"]     = urlRecord.Slug;
                break;

            default:
                //no record found, thus generate an event this way developers could insert their own types
                EngineContext.Current.Resolve <IEventPublisher>().Publish(new CustomUrlRecordEntityNameRequested(currentRouteData, urlRecord));
                break;
            }
            context.RouteData = currentRouteData;

            //route request
            return(_target.RouteAsync(context));
        }
예제 #46
0
 public void AfterCall(RouteContext ctx)
 {
     _uow?.Commit();
 }