From 487d6d2db1c23f289432eeb1f57501f2b7ad0e25 Mon Sep 17 00:00:00 2001 From: Stef Heyenrath Date: Thu, 22 Aug 2024 20:31:03 +0200 Subject: [PATCH] Use default timeout for Regex (#1160) --- .../AzureADAuthenticationMatcher.cs | 3 ++- .../BasicAuthenticationMatcher.cs | 7 ++----- .../Compatibility/StringExtensions.cs | 3 ++- .../Constants/WireMockConstants.cs | 18 +++++++++++------- src/WireMock.Net/Matchers/RegexMatcher.cs | 9 +++++---- src/WireMock.Net/Util/HttpVersionParser.cs | 4 ++-- src/WireMock.Net/Util/PortUtils.cs | 3 ++- src/WireMock.Net/Util/RegexUtils.cs | 8 +++----- 8 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/WireMock.Net/Authentication/AzureADAuthenticationMatcher.cs b/src/WireMock.Net/Authentication/AzureADAuthenticationMatcher.cs index 4832fe7f..50aa507a 100644 --- a/src/WireMock.Net/Authentication/AzureADAuthenticationMatcher.cs +++ b/src/WireMock.Net/Authentication/AzureADAuthenticationMatcher.cs @@ -10,6 +10,7 @@ using Microsoft.IdentityModel.Protocols; using Microsoft.IdentityModel.Protocols.OpenIdConnect; using Microsoft.IdentityModel.Tokens; using Stef.Validation; +using WireMock.Constants; using WireMock.Matchers; using WireMock.Models; @@ -50,7 +51,7 @@ internal class AzureADAuthenticationMatcher : IStringMatcher return MatchScores.Mismatch; } - var token = Regex.Replace(input, BearerPrefix, string.Empty, RegexOptions.IgnoreCase); + var token = Regex.Replace(input, BearerPrefix, string.Empty, RegexOptions.IgnoreCase, WireMockConstants.DefaultRegexTimeout); try { diff --git a/src/WireMock.Net/Authentication/BasicAuthenticationMatcher.cs b/src/WireMock.Net/Authentication/BasicAuthenticationMatcher.cs index c2b5aa0f..e078d423 100644 --- a/src/WireMock.Net/Authentication/BasicAuthenticationMatcher.cs +++ b/src/WireMock.Net/Authentication/BasicAuthenticationMatcher.cs @@ -6,12 +6,9 @@ using WireMock.Matchers; namespace WireMock.Authentication; -internal class BasicAuthenticationMatcher : RegexMatcher +internal class BasicAuthenticationMatcher(string username, string password) + : RegexMatcher(BuildPattern(username, password)) { - public BasicAuthenticationMatcher(string username, string password) : base(BuildPattern(username, password)) - { - } - public override string Name => nameof(BasicAuthenticationMatcher); private static string BuildPattern(string username, string password) diff --git a/src/WireMock.Net/Compatibility/StringExtensions.cs b/src/WireMock.Net/Compatibility/StringExtensions.cs index 4b42e4d3..d95c2bc2 100644 --- a/src/WireMock.Net/Compatibility/StringExtensions.cs +++ b/src/WireMock.Net/Compatibility/StringExtensions.cs @@ -2,6 +2,7 @@ #if NET451 || NET452 || NET46 || NET451 || NET461 || NETSTANDARD1_3 || NETSTANDARD2_0 using System.Text.RegularExpressions; +using WireMock.Constants; // ReSharper disable once CheckNamespace namespace System; @@ -11,7 +12,7 @@ internal static class StringExtensions public static string Replace(this string text, string oldValue, string newValue, StringComparison stringComparison) { var options = stringComparison == StringComparison.OrdinalIgnoreCase ? RegexOptions.IgnoreCase : RegexOptions.None; - return Regex.Replace(text, oldValue, newValue, options); + return Regex.Replace(text, oldValue, newValue, options, WireMockConstants.DefaultRegexTimeout); } } #endif \ No newline at end of file diff --git a/src/WireMock.Net/Constants/WireMockConstants.cs b/src/WireMock.Net/Constants/WireMockConstants.cs index 9dea909a..126a57aa 100644 --- a/src/WireMock.Net/Constants/WireMockConstants.cs +++ b/src/WireMock.Net/Constants/WireMockConstants.cs @@ -1,15 +1,19 @@ // Copyright © WireMock.Net +using System; + namespace WireMock.Constants; internal static class WireMockConstants { - public const int AdminPriority = int.MinValue; - public const int MinPriority = -1_000_000; - public const int ProxyPriority = -2_000_000; + internal static readonly TimeSpan DefaultRegexTimeout = TimeSpan.FromSeconds(10); + + internal const int AdminPriority = int.MinValue; + internal const int MinPriority = -1_000_000; + internal const int ProxyPriority = -2_000_000; - public const string ContentTypeJson = "application/json"; - public const string ContentTypeTextPlain = "text/plain"; + internal const string ContentTypeJson = "application/json"; + internal const string ContentTypeTextPlain = "text/plain"; - public const string NoMatchingFound = "No matching mapping found"; -} \ No newline at end of file + internal const string NoMatchingFound = "No matching mapping found"; +} \ No newline at end of file diff --git a/src/WireMock.Net/Matchers/RegexMatcher.cs b/src/WireMock.Net/Matchers/RegexMatcher.cs index 7e717e6c..fca241eb 100644 --- a/src/WireMock.Net/Matchers/RegexMatcher.cs +++ b/src/WireMock.Net/Matchers/RegexMatcher.cs @@ -5,10 +5,11 @@ using System.Linq; using System.Text.RegularExpressions; using AnyOfTypes; using JetBrains.Annotations; +using Stef.Validation; +using WireMock.Constants; using WireMock.Extensions; using WireMock.Models; using WireMock.RegularExpressions; -using Stef.Validation; namespace WireMock.Matchers; @@ -37,7 +38,7 @@ public class RegexMatcher : IStringMatcher, IIgnoreCaseMatcher bool ignoreCase = false, bool useRegexExtended = true, MatchOperator matchOperator = MatchOperator.Or) : - this(MatchBehaviour.AcceptOnMatch, new[] { pattern }, ignoreCase, useRegexExtended, matchOperator) + this(MatchBehaviour.AcceptOnMatch, [pattern], ignoreCase, useRegexExtended, matchOperator) { } @@ -55,7 +56,7 @@ public class RegexMatcher : IStringMatcher, IIgnoreCaseMatcher bool ignoreCase = false, bool useRegexExtended = true, MatchOperator matchOperator = MatchOperator.Or) : - this(matchBehaviour, new[] { pattern }, ignoreCase, useRegexExtended, matchOperator) + this(matchBehaviour, [pattern], ignoreCase, useRegexExtended, matchOperator) { } @@ -86,7 +87,7 @@ public class RegexMatcher : IStringMatcher, IIgnoreCaseMatcher options |= RegexOptions.IgnoreCase; } - _expressions = patterns.Select(p => useRegexExtended ? new RegexExtended(p.GetPattern(), options) : new Regex(p.GetPattern(), options)).ToArray(); + _expressions = patterns.Select(p => useRegexExtended ? new RegexExtended(p.GetPattern(), options) : new Regex(p.GetPattern(), options, WireMockConstants.DefaultRegexTimeout)).ToArray(); } /// diff --git a/src/WireMock.Net/Util/HttpVersionParser.cs b/src/WireMock.Net/Util/HttpVersionParser.cs index 41a9fd0d..a8e22bdc 100644 --- a/src/WireMock.Net/Util/HttpVersionParser.cs +++ b/src/WireMock.Net/Util/HttpVersionParser.cs @@ -1,8 +1,8 @@ // Copyright © WireMock.Net -using System; using System.Text.RegularExpressions; using Stef.Validation; +using WireMock.Constants; namespace WireMock.Util; @@ -11,7 +11,7 @@ namespace WireMock.Util; /// internal static class HttpVersionParser { - private static readonly Regex HttpVersionRegex = new(@"HTTP/(\d+(\.\d+)?(?!\.))", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled, TimeSpan.FromMilliseconds(100)); + private static readonly Regex HttpVersionRegex = new(@"HTTP/(\d+(\.\d+)?(?!\.))", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant | RegexOptions.Compiled, WireMockConstants.DefaultRegexTimeout); /// /// Try to extract the version (as a string) from the protocol. diff --git a/src/WireMock.Net/Util/PortUtils.cs b/src/WireMock.Net/Util/PortUtils.cs index 9d76c95d..843ce8d7 100644 --- a/src/WireMock.Net/Util/PortUtils.cs +++ b/src/WireMock.Net/Util/PortUtils.cs @@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Net; using System.Net.Sockets; using System.Text.RegularExpressions; +using WireMock.Constants; namespace WireMock.Util; @@ -13,7 +14,7 @@ namespace WireMock.Util; /// internal static class PortUtils { - private static readonly Regex UrlDetailsRegex = new(@"^((?\w+)://)(?[^/]+?):(?\d+)\/?$", RegexOptions.Compiled); + private static readonly Regex UrlDetailsRegex = new(@"^((?\w+)://)(?[^/]+?):(?\d+)\/?$", RegexOptions.Compiled, WireMockConstants.DefaultRegexTimeout); /// /// Finds a free TCP port. diff --git a/src/WireMock.Net/Util/RegexUtils.cs b/src/WireMock.Net/Util/RegexUtils.cs index c64ef4bd..622df7d5 100644 --- a/src/WireMock.Net/Util/RegexUtils.cs +++ b/src/WireMock.Net/Util/RegexUtils.cs @@ -1,16 +1,14 @@ // Copyright © WireMock.Net -using System; using System.Collections.Generic; using System.Text.RegularExpressions; +using WireMock.Constants; using WireMock.RegularExpressions; namespace WireMock.Util; internal static class RegexUtils { - private static readonly TimeSpan RegexTimeOut = new(0, 0, 10); - public static Dictionary GetNamedGroups(Regex regex, string input) { var namedGroupsDictionary = new Dictionary(); @@ -38,11 +36,11 @@ internal static class RegexUtils { if (useRegexExtended) { - var regexExtended = new RegexExtended(pattern!, RegexOptions.None, RegexTimeOut); + var regexExtended = new RegexExtended(pattern!, RegexOptions.None, WireMockConstants.DefaultRegexTimeout); return (true, regexExtended.IsMatch(input)); } - var regex = new Regex(pattern, RegexOptions.None, RegexTimeOut); + var regex = new Regex(pattern, RegexOptions.None, WireMockConstants.DefaultRegexTimeout); return (true, regex.IsMatch(input)); } catch