Updating Class and file names according to PR feedback.
This commit is contained in:
parent
ff3f011ca8
commit
2e96ba5862
|
|
@ -4,7 +4,7 @@
|
|||
using System.Collections.Generic;
|
||||
using Microsoft.AspNet.Http;
|
||||
|
||||
namespace Microsoft.AspNet.Routing.Constraints
|
||||
namespace Microsoft.AspNet.Routing
|
||||
{
|
||||
/// <summary>
|
||||
/// Constrains a route by several child constraints.
|
||||
|
|
@ -25,22 +25,7 @@ namespace Microsoft.AspNet.Routing.Constraints
|
|||
/// </summary>
|
||||
public IEnumerable<IRouteConstraint> Constraints { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Calls Match on the child constraints.
|
||||
/// The call returns as soon as one of the child constraints does not match.
|
||||
/// </summary>
|
||||
/// <param name="httpContext">The HTTP context associated with the current call.</param>
|
||||
/// <param name="route">The route that is being constrained.</param>
|
||||
/// <param name="routeKey">The route key used for the constraint.</param>
|
||||
/// <param name="values">The route value dictionary.</param>
|
||||
/// <param name="routeDirection">The direction of the routing,
|
||||
/// i.e. incoming request or URL generation.</param>
|
||||
/// <returns>True if all the constraints Match,
|
||||
/// false as soon as one of the child constraints does not match.</returns>
|
||||
/// <remarks>
|
||||
/// There is no guarantee for the order in which child constraints are invoked,
|
||||
/// also the method returns as soon as one of the constraints does not match.
|
||||
/// </remarks>
|
||||
/// <inheritdoc />
|
||||
public bool Match([NotNull] HttpContext httpContext,
|
||||
[NotNull] IRouter route,
|
||||
[NotNull] string routeKey,
|
||||
|
|
|
|||
|
|
@ -1,46 +0,0 @@
|
|||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System.Collections.Generic;
|
||||
using Microsoft.AspNet.Http;
|
||||
|
||||
namespace Microsoft.AspNet.Routing
|
||||
{
|
||||
/// <summary>
|
||||
/// Constrains a route by several child constraints.
|
||||
/// </summary>
|
||||
public class CompoundRouteConstraint : IRouteConstraint
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="CompoundRouteConstraint" /> class.
|
||||
/// </summary>
|
||||
/// <param name="constraints">The child constraints that must match for this constraint to match.</param>
|
||||
public CompoundRouteConstraint([NotNull] IEnumerable<IRouteConstraint> constraints)
|
||||
{
|
||||
Constraints = constraints;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the child constraints that must match for this constraint to match.
|
||||
/// </summary>
|
||||
public IEnumerable<IRouteConstraint> Constraints { get; private set; }
|
||||
|
||||
/// <inheritdoc />
|
||||
public bool Match([NotNull] HttpContext httpContext,
|
||||
[NotNull] IRouter route,
|
||||
[NotNull] string routeKey,
|
||||
[NotNull] IDictionary<string, object> values,
|
||||
RouteDirection routeDirection)
|
||||
{
|
||||
foreach (var constraint in Constraints)
|
||||
{
|
||||
if (!constraint.Match(httpContext, route, routeKey, values, routeDirection))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -6,7 +6,6 @@ using System.Collections.Generic;
|
|||
using System.Diagnostics.Contracts;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNet.Routing.Template;
|
||||
using Microsoft.AspNet.Routing.Constraints;
|
||||
|
||||
namespace Microsoft.AspNet.Routing
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1,110 +0,0 @@
|
|||
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.Contracts;
|
||||
using System.Text.RegularExpressions;
|
||||
using Microsoft.AspNet.Routing.Template;
|
||||
|
||||
namespace Microsoft.AspNet.Routing
|
||||
{
|
||||
public static class InlineRouteParameterParser
|
||||
{
|
||||
// One or more characters, matches "id"
|
||||
private const string ParameterNamePattern = @"(?<parameterName>.+?)";
|
||||
|
||||
// Zero or more inline constraints that start with a colon followed by zero or more characters
|
||||
// Optionally the constraint can have arguments within parentheses
|
||||
// - necessary to capture characters like ":" and "}"
|
||||
// Matches ":int", ":length(2)", ":regex(\})", ":regex(:)" zero or more times
|
||||
private const string ConstraintPattern = @"(:(?<constraint>.*?(\(.*?\))?))*";
|
||||
|
||||
// A default value with an equal sign followed by zero or more characters
|
||||
// Matches "=", "=abc"
|
||||
private const string DefaultValueParameter = @"(?<defaultValue>(=.*?))?";
|
||||
|
||||
private static readonly Regex _parameterRegex = new Regex(
|
||||
"^" + ParameterNamePattern + ConstraintPattern + DefaultValueParameter + "$",
|
||||
RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
|
||||
public static TemplatePart ParseRouteParameter([NotNull] string routeParameter,
|
||||
[NotNull] IInlineConstraintResolver constraintResolver)
|
||||
{
|
||||
var isCatchAll = routeParameter.StartsWith("*", StringComparison.Ordinal);
|
||||
var isOptional = routeParameter.EndsWith("?", StringComparison.Ordinal);
|
||||
|
||||
routeParameter = isCatchAll ? routeParameter.Substring(1) : routeParameter;
|
||||
routeParameter = isOptional ? routeParameter.Substring(0, routeParameter.Length - 1) : routeParameter;
|
||||
|
||||
var parameterMatch = _parameterRegex.Match(routeParameter);
|
||||
if (!parameterMatch.Success)
|
||||
{
|
||||
return TemplatePart.CreateParameter(name: string.Empty,
|
||||
isCatchAll: isCatchAll,
|
||||
isOptional: isOptional,
|
||||
defaultValue: null,
|
||||
inlineConstraint: null
|
||||
);
|
||||
}
|
||||
|
||||
var parameterName = parameterMatch.Groups["parameterName"].Value;
|
||||
|
||||
// Add the default value if present
|
||||
var defaultValueGroup = parameterMatch.Groups["defaultValue"];
|
||||
var defaultValue = GetDefaultValue(defaultValueGroup);
|
||||
|
||||
// Register inline constraints if present
|
||||
var constraintGroup = parameterMatch.Groups["constraint"];
|
||||
var inlineConstraint = GetInlineConstraint(constraintGroup, constraintResolver);
|
||||
|
||||
return TemplatePart.CreateParameter(parameterName,
|
||||
isCatchAll,
|
||||
isOptional,
|
||||
defaultValue,
|
||||
inlineConstraint);
|
||||
}
|
||||
|
||||
private static string GetDefaultValue(Group defaultValueGroup)
|
||||
{
|
||||
if (defaultValueGroup.Success)
|
||||
{
|
||||
var defaultValueMatch = defaultValueGroup.Value;
|
||||
|
||||
// Strip out the equal sign at the beginning
|
||||
Contract.Assert(defaultValueMatch.StartsWith("=", StringComparison.Ordinal));
|
||||
return defaultValueMatch.Substring(1);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static IRouteConstraint GetInlineConstraint(Group constraintGroup,
|
||||
IInlineConstraintResolver constraintResolver)
|
||||
{
|
||||
var parameterConstraints = new List<IRouteConstraint>();
|
||||
foreach (Capture constraintCapture in constraintGroup.Captures)
|
||||
{
|
||||
var inlineConstraint = constraintCapture.Value;
|
||||
var constraint = constraintResolver.ResolveConstraint(inlineConstraint);
|
||||
if (constraint == null)
|
||||
{
|
||||
throw new InvalidOperationException(
|
||||
Resources.FormatInlineRouteParser_CouldNotResolveConstraint(
|
||||
constraintResolver.GetType().Name, inlineConstraint));
|
||||
}
|
||||
|
||||
parameterConstraints.Add(constraint);
|
||||
}
|
||||
|
||||
if (parameterConstraints.Count > 0)
|
||||
{
|
||||
var constraint = parameterConstraints.Count == 1 ?
|
||||
parameterConstraints[0] :
|
||||
new CompoundRouteConstraint(parameterConstraints);
|
||||
return constraint;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue