| File: IISUrlRewrite\UrlRewriteRuleBuilder.cs | Web Access |
| Project: src\aspnetcore\src\Middleware\Rewrite\src\Microsoft.AspNetCore.Rewrite.csproj (Microsoft.AspNetCore.Rewrite) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Text.RegularExpressions; using Microsoft.AspNetCore.Rewrite.UrlMatches; namespace Microsoft.AspNetCore.Rewrite.IISUrlRewrite; internal sealed class UrlRewriteRuleBuilder { private readonly TimeSpan _regexTimeout = TimeSpan.FromSeconds(1); public string? Name { get; set; } public bool Enabled { get; set; } public bool Global { get; set; } public UriMatchPart UriMatchPart => Global ? UriMatchPart.Full : UriMatchPart.Path; private UrlMatch? _initialMatch; private ConditionCollection? _conditions; private UrlAction? _action; public IISUrlRewriteRule Build() { if (_initialMatch == null || _action == null) { throw new InvalidOperationException("Cannot create UrlRewriteRule without action and match"); } return new IISUrlRewriteRule(Name, _initialMatch, _conditions, _action, Global); } public void AddUrlAction(UrlAction action) { if (action == null) { throw new ArgumentNullException(nameof(action), "Rules must contain an action"); } _action = action; } public void AddUrlMatch(string input, bool ignoreCase = true, bool negate = false, PatternSyntax patternSyntax = PatternSyntax.ECMAScript) { switch (patternSyntax) { case PatternSyntax.ECMAScript: { if (ignoreCase) { var regex = new Regex(input, RegexOptions.CultureInvariant | RegexOptions.Compiled | RegexOptions.IgnoreCase, _regexTimeout); _initialMatch = new RegexMatch(regex, negate); } else { var regex = new Regex(input, RegexOptions.CultureInvariant | RegexOptions.Compiled, _regexTimeout); _initialMatch = new RegexMatch(regex, negate); } break; } case PatternSyntax.Wildcard: throw new NotSupportedException("Wildcard syntax is not supported"); case PatternSyntax.ExactMatch: _initialMatch = new ExactMatch(ignoreCase, input, negate); break; } } public void ConfigureConditionBehavior(LogicalGrouping logicalGrouping, bool trackAllCaptures) { _conditions = new ConditionCollection(logicalGrouping, trackAllCaptures); } public void AddUrlCondition(Condition condition) { if (_conditions == null) { throw new InvalidOperationException($"You must first configure condition behavior by calling {nameof(ConfigureConditionBehavior)}"); } ArgumentNullException.ThrowIfNull(condition); _conditions.Add(condition); } public void AddUrlConditions(IEnumerable<Condition> conditions) { if (_conditions == null) { throw new InvalidOperationException($"You must first configure condition behavior by calling {nameof(ConfigureConditionBehavior)}"); } _conditions.AddConditions(conditions); } }