Skip to content

Commit ed9aabe

Browse files
committed
Using router provided function URL templates in metadata response
1 parent 5bb632a commit ed9aabe

File tree

10 files changed

+33
-28
lines changed

10 files changed

+33
-28
lines changed

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Microsoft.AspNetCore.Http;
1313
using Microsoft.AspNetCore.Http.Extensions;
1414
using Microsoft.AspNetCore.Mvc;
15+
using Microsoft.Azure.WebJobs.Extensions.Http;
1516
using Microsoft.Azure.WebJobs.Script.Description;
1617
using Microsoft.Azure.WebJobs.Script.Management.Models;
1718
using Microsoft.Azure.WebJobs.Script.WebHost.Extensions;
@@ -31,14 +32,16 @@ namespace Microsoft.Azure.WebJobs.Script.WebHost.Controllers
3132
public class FunctionsController : Controller
3233
{
3334
private readonly IWebFunctionsManager _functionsManager;
34-
private readonly WebScriptHostManager _scriptHostManager;
35+
private readonly ScriptHostManager _scriptHostManager;
36+
private readonly IWebJobsRouter _webJobsRouter;
3537
private readonly ILogger _logger;
3638
private static readonly Regex FunctionNameValidationRegex = new Regex(@"^[a-z][a-z0-9_\-]{0,127}$(?<!^host$)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
3739

38-
public FunctionsController(IWebFunctionsManager functionsManager, WebScriptHostManager scriptHostManager, ILoggerFactory loggerFactory)
40+
public FunctionsController(IWebFunctionsManager functionsManager, WebScriptHostManager scriptHostManager, IWebJobsRouter webJobsRouter, ILoggerFactory loggerFactory)
3941
{
4042
_functionsManager = functionsManager;
4143
_scriptHostManager = scriptHostManager;
44+
_webJobsRouter = webJobsRouter;
4245
_logger = loggerFactory?.CreateLogger(ScriptConstants.LogCategoryFunctionsController);
4346
}
4447

@@ -47,15 +50,15 @@ public FunctionsController(IWebFunctionsManager functionsManager, WebScriptHostM
4750
[Authorize(Policy = PolicyNames.AdminAuthLevel)]
4851
public async Task<IActionResult> List()
4952
{
50-
return Ok(await _functionsManager.GetFunctionsMetadata(Request, _scriptHostManager.Router));
53+
return Ok(await _functionsManager.GetFunctionsMetadata(Request, _webJobsRouter));
5154
}
5255

5356
[HttpGet]
5457
[Route("admin/functions/{name}")]
5558
[Authorize(Policy = PolicyNames.AdminAuthLevel)]
5659
public async Task<IActionResult> Get(string name)
5760
{
58-
(var success, var function) = await _functionsManager.TryGetFunction(name, Request, _scriptHostManager.Router);
61+
(var success, var function) = await _functionsManager.TryGetFunction(name, Request, _webJobsRouter);
5962

6063
return success
6164
? Ok(function)

src/WebJobs.Script.WebHost/Extensions/FunctionMetadataExtensions.cs

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@
33

44
using System;
55
using System.IO;
6+
using System.Linq;
67
using System.Threading.Tasks;
78
using Microsoft.AspNetCore.Http;
89
using Microsoft.AspNetCore.Routing;
10+
using Microsoft.Azure.WebJobs.Extensions.Http;
911
using Microsoft.Azure.WebJobs.Script.Description;
1012
using Microsoft.Azure.WebJobs.Script.Management.Models;
1113
using Microsoft.Azure.WebJobs.Script.WebHost.Management;
@@ -22,7 +24,7 @@ public static class FunctionMetadataExtensions
2224
/// <param name="request">Current HttpRequest</param>
2325
/// <param name="config">ScriptHostConfig</param>
2426
/// <returns>Promise of a FunctionMetadataResponse</returns>
25-
public static async Task<FunctionMetadataResponse> ToFunctionMetadataResponse(this FunctionMetadata functionMetadata, HttpRequest request, ScriptHostConfiguration config, IRouter router = null)
27+
public static async Task<FunctionMetadataResponse> ToFunctionMetadataResponse(this FunctionMetadata functionMetadata, HttpRequest request, ScriptHostConfiguration config, IWebJobsRouter router = null)
2628
{
2729
var functionPath = Path.Combine(config.RootScriptPath, functionMetadata.Name);
2830
var functionMetadataFilePath = Path.Combine(functionPath, ScriptConstants.FunctionMetadataFileName);
@@ -47,7 +49,7 @@ public static async Task<FunctionMetadataResponse> ToFunctionMetadataResponse(th
4749
IsDirect = functionMetadata.IsDirect,
4850
IsDisabled = functionMetadata.IsDisabled,
4951
IsProxy = functionMetadata.IsProxy,
50-
HttpTriggerInvokeUrl = GetFunctionInvokeUrl(functionMetadata.Name, baseUrl, request, router)
52+
InvokeUrlTemplate = GetFunctionInvokeUrlTemplate(baseUrl, functionMetadata.Name, router)
5153
};
5254
return response;
5355
}
@@ -127,17 +129,16 @@ private static async Task<string> GetTestData(string testDataPath, ScriptHostCon
127129
private static Uri GetFunctionHref(string functionName, string baseUrl) =>
128130
new Uri($"{baseUrl}/admin/functions/{functionName}");
129131

130-
private static Uri GetFunctionInvokeUrl(string functionName, string baseUrl, HttpRequest request, IRouter router)
132+
private static Uri GetFunctionInvokeUrlTemplate(string baseUrl, string functionName, IWebJobsRouter router)
131133
{
132-
if (router == null)
134+
var template = router?.GetFunctionRouteTemplate(functionName);
135+
136+
if (template != null)
133137
{
134-
return null;
138+
return new Uri($"{baseUrl}/{template}");
135139
}
136140

137-
VirtualPathData path = router.GetVirtualPath(
138-
new VirtualPathContext(request.HttpContext, new RouteValueDictionary(), new RouteValueDictionary(), functionName));
139-
140-
return (path != null) ? new Uri(new Uri(baseUrl), path.VirtualPath) : null;
141+
return null;
141142
}
142143
}
143144
}

src/WebJobs.Script.WebHost/Management/IWebFunctionsManager.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
using System.Threading.Tasks;
66
using Microsoft.AspNetCore.Http;
77
using Microsoft.AspNetCore.Routing;
8+
using Microsoft.Azure.WebJobs.Extensions.Http;
89
using Microsoft.Azure.WebJobs.Script.Management.Models;
910

1011
namespace Microsoft.Azure.WebJobs.Script.WebHost.Management
1112
{
1213
public interface IWebFunctionsManager
1314
{
14-
Task<IEnumerable<FunctionMetadataResponse>> GetFunctionsMetadata(HttpRequest request, IRouter router = null);
15+
Task<IEnumerable<FunctionMetadataResponse>> GetFunctionsMetadata(HttpRequest request, IWebJobsRouter router = null);
1516

16-
Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IRouter router = null);
17+
Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IWebJobsRouter router = null);
1718

1819
Task<(bool, bool, FunctionMetadataResponse)> CreateOrUpdate(string name, FunctionMetadataResponse functionMetadata, HttpRequest request);
1920

src/WebJobs.Script.WebHost/Management/WebFunctionsManager.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
using System.Threading.Tasks;
1212
using Microsoft.AspNetCore.Http;
1313
using Microsoft.AspNetCore.Routing;
14+
using Microsoft.Azure.WebJobs.Extensions.Http;
1415
using Microsoft.Azure.WebJobs.Script.Description;
1516
using Microsoft.Azure.WebJobs.Script.Management.Models;
1617
using Microsoft.Azure.WebJobs.Script.WebHost.Extensions;
@@ -46,7 +47,7 @@ public WebFunctionsManager(WebHostSettings webSettings, ILoggerFactory loggerFac
4647
/// </summary>
4748
/// <param name="request">Current HttpRequest for figuring out baseUrl</param>
4849
/// <returns>collection of FunctionMetadataResponse</returns>
49-
public async Task<IEnumerable<FunctionMetadataResponse>> GetFunctionsMetadata(HttpRequest request, IRouter router = null)
50+
public async Task<IEnumerable<FunctionMetadataResponse>> GetFunctionsMetadata(HttpRequest request, IWebJobsRouter router = null)
5051
{
5152
return await GetFunctionsMetadata().Select(fm => fm.ToFunctionMetadataResponse(request, _config, router)).WhenAll();
5253
}
@@ -130,9 +131,10 @@ await functionMetadata
130131
/// <param name="name">Function name to retrieve</param>
131132
/// <param name="request">Current HttpRequest</param>
132133
/// <returns>(success, FunctionMetadataResponse)</returns>
133-
public async Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IRouter router = null)
134+
public async Task<(bool, FunctionMetadataResponse)> TryGetFunction(string name, HttpRequest request, IWebJobsRouter router = null)
134135
{
135136
var functionMetadata = ScriptHost.ReadFunctionMetadata(Path.Combine(_config.RootScriptPath, name), new Dictionary<string, Collection<string>>(), fileSystem: FileUtility.Instance);
137+
136138
if (functionMetadata != null)
137139
{
138140
return (true, await functionMetadata.ToFunctionMetadataResponse(request, _config, router));

src/WebJobs.Script.WebHost/Models/FunctionMetadataResponse.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,10 @@ public class FunctionMetadataResponse
4747
public Uri Href { get; set; }
4848

4949
/// <summary>
50-
/// Gets or sets httptrigger invoke url
50+
/// Gets or sets invoke url for the function, if one is supported (e.g. HTTP triggered functions)
5151
/// </summary>
52-
[JsonProperty(PropertyName = "httptrigger_invoke_url")]
53-
public Uri HttpTriggerInvokeUrl { get; set; }
52+
[JsonProperty(PropertyName = "invoke_url_template")]
53+
public Uri InvokeUrlTemplate { get; set; }
5454

5555
/// <summary>
5656
/// Gets or sets function config json

src/WebJobs.Script.WebHost/WebJobs.Script.WebHost.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@
5050
<PackageReference Include="Microsoft.Azure.AppService.Proxy.Client" Version="2.0.5350001-beta-fc119b98" />
5151
<PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="2.1.0-a-oob-2-1-oob-17035" />
5252
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta7-11351" />
53-
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.0-beta7-10629" />
54-
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10629">
53+
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.0-beta7-10640" />
54+
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10640">
5555
<NoWarn>NU1701</NoWarn>
5656
</PackageReference>
5757
<PackageReference Include="Microsoft.Azure.WebJobs.Logging" Version="3.0.0-beta7-11351" />

src/WebJobs.Script.WebHost/WebScriptHostManager.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,6 @@ public WebScriptHostManager(ScriptHostConfiguration config,
110110

111111
public ISecretManager SecretManager => _secretManager;
112112

113-
public IWebJobsRouter Router => _router;
114-
115113
/// <summary>
116114
/// Gets or sets a value indicating whether http requests should be
117115
/// temporarily delayed due to host state.

src/WebJobs.Script/WebJobs.Script.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@
3434
<PackageReference Include="Microsoft.Azure.Functions.JavaWorker" Version="1.1.0-beta9" />
3535
<PackageReference Include="Microsoft.Azure.Functions.NodeJsWorker" Version="1.0.0-beta3" />
3636
<PackageReference Include="Microsoft.Azure.WebJobs" Version="3.0.0-beta7-11351" />
37-
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.0-beta7-10629" />
38-
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10629">
37+
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions" Version="3.0.0-beta7-10640" />
38+
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10640">
3939
<NoWarn>NU1701</NoWarn>
4040
</PackageReference>
4141
<PackageReference Include="Microsoft.Azure.WebJobs.Logging" Version="3.0.0-beta7-11351" />

test/TestFunctions/TestFunctions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8-
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10629" />
8+
<PackageReference Include="Microsoft.Azure.WebJobs.Extensions.Http" Version="3.0.0-beta7-10640" />
99
</ItemGroup>
1010

1111
</Project>

test/WebJobs.Script.Tests/Controllers/Admin/AdminControllerTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public AdminControllerTests()
5353
managerMock = new Mock<WebScriptHostManager>(MockBehavior.Strict, new object[] { config, new TestSecretManagerFactory(secretsManagerMock.Object), eventManager.Object, _settingsManager, settings, mockRouter.Object, NullLoggerFactory.Instance });
5454
managerMock.SetupGet(p => p.Instance).Returns(hostMock.Object);
5555

56-
testController = new FunctionsController(mockWebFunctionManager.Object, managerMock.Object, new LoggerFactory());
56+
testController = new FunctionsController(mockWebFunctionManager.Object, managerMock.Object, mockRouter.Object, new LoggerFactory());
5757
}
5858

5959
[Fact]

0 commit comments

Comments
 (0)