Skip to content

Commit 6ca776b

Browse files
committed
moving logic together and adding unit test
1 parent 3f98daf commit 6ca776b

File tree

4 files changed

+26
-6
lines changed

4 files changed

+26
-6
lines changed

src/WebJobs.Script.WebHost/Controllers/FunctionsController.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.IO.Abstractions;
66
using System.IO.Compression;
77
using System.Linq;
8-
using System.Text.RegularExpressions;
98
using System.Threading.Tasks;
109
using Microsoft.AspNetCore.Authorization;
1110
using Microsoft.AspNetCore.Http;
@@ -34,7 +33,6 @@ public class FunctionsController : Controller
3433
private readonly IWebFunctionsManager _functionsManager;
3534
private readonly IWebJobsRouter _webJobsRouter;
3635
private readonly ILogger _logger;
37-
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
3836

3937
public FunctionsController(IWebFunctionsManager functionsManager, IWebJobsRouter webJobsRouter, ILoggerFactory loggerFactory)
4038
{
@@ -69,7 +67,7 @@ public async Task<IActionResult> Get(string name)
6967
[Authorize(Policy = PolicyNames.AdminAuthLevel)]
7068
public async Task<IActionResult> CreateOrUpdate(string name, [FromBody] FunctionMetadataResponse functionMetadata)
7169
{
72-
if (!FunctionNameValidationRegex.IsMatch(name))
70+
if (!Utility.IsValidFunctionName(name))
7371
{
7472
return BadRequest($"{name} is not a valid function name");
7573
}

src/WebJobs.Script/Host/FunctionMetadataManager.cs

+1-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
using System.IO;
99
using System.IO.Abstractions;
1010
using System.Linq;
11-
using System.Text.RegularExpressions;
1211
using Microsoft.Azure.WebJobs.Logging;
1312
using Microsoft.Azure.WebJobs.Script.Description;
1413
using Microsoft.Azure.WebJobs.Script.Diagnostics.Extensions;
@@ -21,7 +20,6 @@ namespace Microsoft.Azure.WebJobs.Script
2120
{
2221
public class FunctionMetadataManager : IFunctionMetadataManager
2322
{
24-
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
2523
private readonly Dictionary<string, ICollection<string>> _functionErrors = new Dictionary<string, ICollection<string>>();
2624
private readonly Lazy<ImmutableArray<FunctionMetadata>> _metadata;
2725
private readonly IEnumerable<WorkerConfig> _workerConfigs;
@@ -131,7 +129,7 @@ internal static FunctionMetadata ReadFunctionMetadata(string scriptDir, ICollect
131129

132130
internal static void ValidateName(string name, bool isProxy = false)
133131
{
134-
if (!FunctionNameValidationRegex.IsMatch(name))
132+
if (!Utility.IsValidFunctionName(name))
135133
{
136134
throw new InvalidOperationException(string.Format("'{0}' is not a valid {1} name.", name, isProxy ? "proxy" : "function"));
137135
}

src/WebJobs.Script/Utility.cs

+7
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Linq;
1212
using System.Reflection;
1313
using System.Text;
14+
using System.Text.RegularExpressions;
1415
using System.Threading;
1516
using System.Threading.Tasks;
1617
using Microsoft.Azure.WebJobs.Script.Description;
@@ -29,6 +30,7 @@ public static class Utility
2930
// i.e.: "f-<functionname>"
3031
public const string AssemblyPrefix = "f-";
3132
public const string AssemblySeparator = "__";
33+
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
3234

3335
private static readonly string UTF8ByteOrderMark = Encoding.UTF8.GetString(Encoding.UTF8.GetPreamble());
3436
private static readonly FilteredExpandoObjectConverter _filteredExpandoObjectConverter = new FilteredExpandoObjectConverter();
@@ -165,6 +167,11 @@ public static string GetFunctionShortName(string functionName)
165167
return functionName;
166168
}
167169

170+
public static bool IsValidFunctionName(string functionName)
171+
{
172+
return FunctionNameValidationRegex.IsMatch(functionName);
173+
}
174+
168175
// "Namespace.Class.Method" --> "Namespace.Class"
169176
public static string GetFullClassName(string fullFunctionName)
170177
{

test/WebJobs.Script.Tests/UtilityTests.cs

+17
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Collections.Generic;
66
using System.Diagnostics;
77
using System.Dynamic;
8+
using System.Globalization;
89
using System.Text;
910
using System.Threading;
1011
using System.Threading.Tasks;
@@ -353,5 +354,21 @@ public void IsHttporManualTriggerTests(string triggerType, bool expectedResult)
353354
{
354355
Assert.Equal(expectedResult, Utility.IsHttporManualTrigger(triggerType));
355356
}
357+
358+
[Theory]
359+
[InlineData("createIsolationEnvironment", true)]
360+
[InlineData("HttpTrigger2", true)]
361+
[InlineData("HttptRIGGER", true)]
362+
[InlineData("MANUALtRIGGER", true)]
363+
[InlineData("Function-200", true)]
364+
[InlineData("hello!", false)]
365+
[InlineData("🙅", false)]
366+
public void IsValidFunctionNameTests(string functionName, bool expectedResult)
367+
{
368+
CultureInfo defaultCulture = Thread.CurrentThread.CurrentCulture;
369+
Thread.CurrentThread.CurrentCulture = new CultureInfo("tr-TR");
370+
Assert.Equal(expectedResult, Utility.IsValidFunctionName(functionName));
371+
Thread.CurrentThread.CurrentCulture = defaultCulture;
372+
}
356373
}
357374
}

0 commit comments

Comments
 (0)