Beispiel #1
0
        private IReadOnlyList <IActionConstraint>?ExtractActionConstraints(List <ActionConstraintItem> items)
        {
            var count = 0;

            for (var i = 0; i < items.Count; i++)
            {
                if (items[i].Constraint != null)
                {
                    count++;
                }
            }

            if (count == 0)
            {
                return(null);
            }

            var actionConstraints     = new IActionConstraint[count];
            var actionConstraintIndex = 0;

            for (var i = 0; i < items.Count; i++)
            {
                var actionConstraint = items[i].Constraint;
                if (actionConstraint != null)
                {
                    actionConstraints[actionConstraintIndex++] = actionConstraint;
                }
            }

            return(actionConstraints);
        }
#pragma warning disable CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
            static IReadOnlyList <IActionConstraint>?ExtractActionConstraints(List <ActionConstraintItem> items)
#pragma warning restore CS8632 // The annotation for nullable reference types should only be used in code within a '#nullable' annotations context.
            {
                var count = 0;

                for (var i = 0; i < items.Count; i++)
                {
                    if (items[i].Constraint != null)
                    {
                        count++;
                    }
                }

                if (count == 0)
                {
                    return(null);
                }

                var actionConstraints     = new IActionConstraint[count];
                var actionConstraintIndex = 0;

                for (var i = 0; i < items.Count; i++)
                {
                    var actionConstraint = items[i].Constraint;

                    if (actionConstraint != null)
                    {
                        actionConstraints[actionConstraintIndex++] = actionConstraint;
                    }
                }

                return(actionConstraints);
            }
 public static void ConstraintMismatch(
     this ILogger logger,
     string actionName,
     string actionId,
     IActionConstraint actionConstraint)
 {
     _constraintMismatch(logger, actionName, actionId, actionConstraint, null);
 }
Beispiel #4
0
 public static void ConstraintMismatch(
     this ILogger logger,
     string actionName,
     string actionId,
     IActionConstraint actionConstraint)
 {
     _constraintMismatch(logger, actionName, actionId, actionConstraint, null);
 }
Beispiel #5
0
 protected virtual ActionConstraintContext GetContext(IActionConstraint constraint)
 {
     return(new ActionConstraintContext
     {
         CurrentCandidate = new ActionSelectorCandidate(new ActionDescriptor(), new[] { constraint }),
         RouteContext = new RouteContext(new DefaultHttpContext()),
     });
 }
        protected override ActionConstraintContext GetContext(IActionConstraint constraint)
        {
            var context = base.GetContext(constraint);

            // Constraint throws if receiver name is not present in the request.
            context.RouteContext.RouteData.Values.Add(WebHookConstants.ReceiverKeyName, "ping");

            return(context);
        }
Beispiel #7
0
        protected override ActionConstraintContext GetContext(IActionConstraint constraint)
        {
            var context = base.GetContext(constraint);
            var request = context.RouteContext.HttpContext.Request;

            request.Headers.Add("header", "header value");
            request.QueryString = request.QueryString.Add("query", "query string value");

            return(context);
        }
Beispiel #8
0
        private IReadOnlyList <IActionConstraint> GetConstraints(HttpContext httpContext, ActionDescriptor action)
        {
            if (action.ActionConstraints == null || action.ActionConstraints.Count == 0)
            {
                return(null);
            }

            var items = new List <ActionConstraintItem>(action.ActionConstraints.Count);

            for (var i = 0; i < action.ActionConstraints.Count; i++)
            {
                items.Add(new ActionConstraintItem(action.ActionConstraints[i]));
            }

            var context = new ActionConstraintProviderContext(httpContext, action, items);

            for (var i = 0; i < _actionConstraintProviders.Length; i++)
            {
                _actionConstraintProviders[i].OnProvidersExecuting(context);
            }

            for (var i = _actionConstraintProviders.Length - 1; i >= 0; i--)
            {
                _actionConstraintProviders[i].OnProvidersExecuted(context);
            }

            var count = 0;

            for (var i = 0; i < context.Results.Count; i++)
            {
                if (context.Results[i].Constraint != null)
                {
                    count++;
                }
            }

            if (count == 0)
            {
                return(null);
            }

            var results = new IActionConstraint[count];

            for (int i = 0, j = 0; i < context.Results.Count; i++)
            {
                var constraint = context.Results[i].Constraint;
                if (constraint != null)
                {
                    results[j++] = constraint;
                }
            }

            return(results);
        }
Beispiel #9
0
        protected virtual ActionConstraintContext GetContext(IActionConstraint constraint)
        {
            var candidate = new ActionSelectorCandidate(new ActionDescriptor(), new[] { constraint });
            var context   = new ActionConstraintContext
            {
                Candidates       = new[] { candidate },
                CurrentCandidate = candidate,
                RouteContext     = new RouteContext(new DefaultHttpContext()),
            };

            return(context);
        }
Beispiel #10
0
 public static void ConstraintMismatch(
     this ILogger logger,
     string actionName,
     string actionId,
     IActionConstraint actionConstraint)
 {
     LoggerMessage.Define <string, string, IActionConstraint>(
         LogLevel.Debug,
         2,
         "Action '{ActionName}' with id '{ActionId}' did not match the constraint '{ActionConstraint}'")
         (logger, actionName, actionId, actionConstraint, null);
 }
Beispiel #11
0
        public VersionRoute(string template, string versionRange)
            : base(template)
        {
            var constraint = CreateVersionConstraint(versionRange);

            if (constraint == null)
            {
                var message = string.Format("Invalid version format: {0}", versionRange);
                throw new ArgumentException(message, "versionRange");
            }

            _constraint = constraint;
        }
Beispiel #12
0
        public VersionRoute(string template, string versionRange)
            : base(template)
        {
            var constraint = CreateVersionConstraint(versionRange);

            if (constraint == null)
            {
                var message = string.Format("Invalid version format: {0}", versionRange);
                throw new ArgumentException(message, "versionRange");
            }

            _constraint = constraint;
        }
        private static ActionConstraintContext CreateActionConstraintContext(IActionConstraint constraint)
        {
            var context = new ActionConstraintContext();

            var actionSelectorCandidate = new ActionSelectorCandidate(new ActionDescriptor(), new List <IActionConstraint> {
                constraint
            });

            context.Candidates = new List <ActionSelectorCandidate> {
                actionSelectorCandidate
            };
            context.CurrentCandidate = context.Candidates[0];

            return(context);
        }
 public IActionConstraint CreateInstance(IServiceProvider services)
 {
     _locker
     .LockIf
     (
         () =>
     {
         return
         (_constraint == null);
     }
         , () =>
     {
         _constraint
             = OnActionConstraintFactoryProcessFunc(this);
     }
     );
     return
         (_constraint);
 }
Beispiel #15
0
 internal static void ConstraintMismatch(this ILogger logger, string actionName, string actionId, IActionConstraint actionConstraint) =>
 constraintMismatch(logger, actionName, actionId, actionConstraint, null);
        private IReadOnlyList<IActionConstraint> GetConstraints(HttpContext httpContext, ActionDescriptor action)
        {
            if (action.ActionConstraints == null || action.ActionConstraints.Count == 0)
            {
                return null;
            }

            var items = new List<ActionConstraintItem>(action.ActionConstraints.Count);
            for (var i = 0; i < action.ActionConstraints.Count; i++)
            {
                items.Add(new ActionConstraintItem(action.ActionConstraints[i]));
            }

            var context = new ActionConstraintProviderContext(httpContext, action, items);
            for (var i = 0; i < _actionConstraintProviders.Length; i++)
            {
                _actionConstraintProviders[i].OnProvidersExecuting(context);
            }

            for (var i = _actionConstraintProviders.Length - 1; i >= 0; i--)
            {
                _actionConstraintProviders[i].OnProvidersExecuted(context);
            }

            var count = 0;
            for (var i = 0; i < context.Results.Count; i++)
            {
                if (context.Results[i].Constraint != null)
                {
                    count++;
                }
            }

            if (count == 0)
            {
                return null;
            }

            var results = new IActionConstraint[count];
            for (int i = 0, j = 0; i < context.Results.Count; i++)
            {
                var constraint = context.Results[i].Constraint;
                if (constraint != null)
                {
                    results[j++] = constraint;
                }
            }

            return results;
        }
Beispiel #17
0
        private IReadOnlyList <ActionSelectorCandidate> EvaluateActionConstraintsCore(RouteContext context, IReadOnlyList <ActionSelectorCandidate> candidates, int?startingOrder)
        {
            int?startingOrder1 = new int?();
            int?nullable;

            for (int index1 = 0; index1 < candidates.Count; ++index1)
            {
                ActionSelectorCandidate candidate = candidates[index1];
                if (candidate.Constraints != null)
                {
                    for (int index2 = 0; index2 < candidate.Constraints.Count; ++index2)
                    {
                        IActionConstraint constraint = candidate.Constraints[index2];
                        if (startingOrder.HasValue)
                        {
                            int order = constraint.Order;
                            nullable = startingOrder;
                            int valueOrDefault = nullable.GetValueOrDefault();
                            if ((order > valueOrDefault ? (nullable.HasValue ? 1 : 0) : 0) == 0)
                            {
                                continue;
                            }
                        }
                        if (startingOrder1.HasValue)
                        {
                            int order = constraint.Order;
                            nullable = startingOrder1;
                            int valueOrDefault = nullable.GetValueOrDefault();
                            if ((order < valueOrDefault ? (nullable.HasValue ? 1 : 0) : 0) == 0)
                            {
                                continue;
                            }
                        }
                        startingOrder1 = new int?(constraint.Order);
                    }
                }
            }
            if (!startingOrder1.HasValue)
            {
                return(candidates);
            }
            List <ActionSelectorCandidate> selectorCandidateList1 = new List <ActionSelectorCandidate>();
            List <ActionSelectorCandidate> selectorCandidateList2 = new List <ActionSelectorCandidate>();
            ActionConstraintContext        context1 = new ActionConstraintContext();

            context1.Candidates   = candidates;
            context1.RouteContext = context;
            for (int index1 = 0; index1 < candidates.Count; ++index1)
            {
                ActionSelectorCandidate candidate = candidates[index1];
                bool flag1 = true;
                bool flag2 = false;
                if (candidate.Constraints != null)
                {
                    context1.CurrentCandidate = candidate;
                    for (int index2 = 0; index2 < candidate.Constraints.Count; ++index2)
                    {
                        IActionConstraint constraint = candidate.Constraints[index2];
                        int order = constraint.Order;
                        nullable = startingOrder1;
                        int valueOrDefault = nullable.GetValueOrDefault();
                        if ((order == valueOrDefault ? (nullable.HasValue ? 1 : 0) : 0) != 0)
                        {
                            flag2 = true;
                            if (!constraint.Accept(context1))
                            {
                                flag1 = false;
                                this._logger.LogDebug($"ConstraintMismatch( {candidate.Action.DisplayName}, {candidate.Action.Id}, {constraint}");
                                break;
                            }
                        }
                    }
                }
                if (flag1 & flag2)
                {
                    selectorCandidateList1.Add(candidate);
                }
                else if (flag1)
                {
                    selectorCandidateList2.Add(candidate);
                }
            }
            if (selectorCandidateList1.Count > 0)
            {
                IReadOnlyList <ActionSelectorCandidate> actionConstraintsCore = this.EvaluateActionConstraintsCore(context, (IReadOnlyList <ActionSelectorCandidate>)selectorCandidateList1, startingOrder1);
                if (actionConstraintsCore != null && actionConstraintsCore.Count > 0)
                {
                    return(actionConstraintsCore);
                }
            }
            if (selectorCandidateList2.Count == 0)
            {
                return((IReadOnlyList <ActionSelectorCandidate>)null);
            }
            return(this.EvaluateActionConstraintsCore(context, (IReadOnlyList <ActionSelectorCandidate>)selectorCandidateList2, startingOrder1));
        }
Beispiel #18
0
 public static partial void ConstraintMismatch(ILogger logger, string?actionName, string actionId, IActionConstraint actionConstraint);
Beispiel #19
0
 public VersionedRoute(string template, int allowedVersion = 1) : base(template)
 {
     Order       = -10;
     _constraint = new VersionConstraint(allowedVersion);
 }