Skip to content

Commit 3ceb9ef

Browse files
committed
Updates to JobHost CORS support
1 parent 8df66d1 commit 3ceb9ef

File tree

6 files changed

+52
-61
lines changed

6 files changed

+52
-61
lines changed

src/WebJobs.Script.WebHost/Configuration/CorsOptionsSetup.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public CorsOptionsSetup(IEnvironment env, IOptions<HostCorsOptions> hostCorsOpti
2323

2424
public void Configure(CorsOptions options)
2525
{
26-
if (_env.IsLinuxConsumption() && _hostCorsOptions.Value != null)
26+
if (_env.IsLinuxConsumption())
2727
{
2828
string[] allowedOrigins = _hostCorsOptions.Value.AllowedOrigins?.ToArray() ?? Array.Empty<string>();
2929
var policyBuilder = new CorsPolicyBuilder(allowedOrigins);

src/WebJobs.Script.WebHost/Middleware/CorsConfigurationMiddleware.cs

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/WebJobs.Script.WebHost/Middleware/CorsMiddlewareFactory.cs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,27 @@
66
using Microsoft.AspNetCore.Cors.Infrastructure;
77
using Microsoft.AspNetCore.Http;
88
using Microsoft.Azure.WebJobs.Script.WebHost.Configuration;
9+
using Microsoft.Extensions.Logging;
910
using Microsoft.Extensions.Options;
1011

1112
namespace Microsoft.Azure.WebJobs.Script.WebHost.Middleware
1213
{
1314
public class CorsMiddlewareFactory : ICorsMiddlewareFactory
1415
{
1516
private readonly IOptions<CorsOptions> _corsOptions;
17+
private readonly ILoggerFactory _loggerFactory;
1618

17-
public CorsMiddlewareFactory(IOptions<CorsOptions> corsOptions)
19+
public CorsMiddlewareFactory(IOptions<CorsOptions> corsOptions, ILoggerFactory loggerFactory)
1820
{
1921
_corsOptions = corsOptions;
22+
_loggerFactory = loggerFactory;
2023
}
2124

2225
public CorsMiddleware CreateCorsMiddleware(RequestDelegate next, IOptions<HostCorsOptions> corsOptions)
2326
{
24-
CorsMiddleware middleware = null;
25-
if (corsOptions?.Value != null)
26-
{
27-
var corsService = new CorsService(_corsOptions);
28-
var policy = _corsOptions.Value.GetPolicy(_corsOptions.Value.DefaultPolicyName);
29-
middleware = new CorsMiddleware(next, corsService, policy);
30-
}
27+
CorsPolicy policy = _corsOptions.Value.GetPolicy(_corsOptions.Value.DefaultPolicyName);
28+
var corsService = new CorsService(_corsOptions);
29+
var middleware = new CorsMiddleware(next, corsService, policy, _loggerFactory);
3130

3231
return middleware;
3332
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the MIT License. See License.txt in the project root for license information.
3+
4+
using System.Collections.Generic;
5+
using System.Threading.Tasks;
6+
using Microsoft.AspNetCore.Cors.Infrastructure;
7+
using Microsoft.AspNetCore.Http;
8+
using Microsoft.Azure.WebJobs.Script.Middleware;
9+
using Microsoft.Azure.WebJobs.Script.WebHost.Configuration;
10+
using Microsoft.Extensions.Options;
11+
12+
namespace Microsoft.Azure.WebJobs.Script.WebHost.Middleware
13+
{
14+
public class JobHostCorsMiddleware : IJobHostHttpMiddleware
15+
{
16+
private readonly CorsMiddleware _corsMiddleware;
17+
18+
public JobHostCorsMiddleware(IOptions<HostCorsOptions> hostCorsOptions, ICorsMiddlewareFactory middlewareFactory)
19+
{
20+
_corsMiddleware = middlewareFactory.CreateCorsMiddleware(InvokeNext, hostCorsOptions);
21+
}
22+
23+
public async Task Invoke(HttpContext context, RequestDelegate next)
24+
{
25+
context.Items.Add(ScriptConstants.CorsMiddlewareRequestDelegate, next);
26+
27+
await _corsMiddleware.Invoke(context);
28+
}
29+
30+
private async Task InvokeNext(HttpContext context)
31+
{
32+
if (context.Items.Remove(ScriptConstants.CorsMiddlewareRequestDelegate, out object requestDelegate) && requestDelegate is RequestDelegate next)
33+
{
34+
await next(context);
35+
}
36+
}
37+
}
38+
}

src/WebJobs.Script.WebHost/WebScriptHostBuilderExtension.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,8 @@ public static IHostBuilder AddWebScriptHost(this IHostBuilder builder, IServiceP
8888
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, HstsConfigurationMiddleware>());
8989
if (environment.IsLinuxConsumption())
9090
{
91-
services.AddCors();
9291
services.AddSingleton<ICorsMiddlewareFactory, CorsMiddlewareFactory>();
93-
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, CorsConfigurationMiddleware>());
92+
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, JobHostCorsMiddleware>());
9493
}
9594
services.TryAddSingleton<IScaleMetricsRepository, TableStorageScaleMetricsRepository>();
9695

test/WebJobs.Script.Tests/Middleware/CorsConfigurationMiddlewareTests.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.Azure.WebJobs.Script.WebHost.Middleware;
1616
using Microsoft.Extensions.DependencyInjection;
1717
using Microsoft.Extensions.DependencyInjection.Extensions;
18+
using Microsoft.Extensions.Logging.Abstractions;
1819
using Microsoft.Extensions.Options;
1920
using Moq;
2021
using Xunit;
@@ -35,7 +36,7 @@ public async Task Invoke_HasCorsConfig_InvokesNext()
3536
var testOptions = new CorsOptions();
3637
testOptions.AddDefaultPolicy(testPolicy);
3738
var corsOptions = new OptionsWrapper<CorsOptions>(testOptions);
38-
var corsFactory = new CorsMiddlewareFactory(corsOptions);
39+
var corsFactory = new CorsMiddlewareFactory(corsOptions, NullLoggerFactory.Instance);
3940

4041
bool nextInvoked = false;
4142
RequestDelegate next = (context) =>
@@ -45,7 +46,7 @@ public async Task Invoke_HasCorsConfig_InvokesNext()
4546
return Task.CompletedTask;
4647
};
4748

48-
var middleware = new CorsConfigurationMiddleware(hostCorsOptions, corsFactory);
49+
var middleware = new JobHostCorsMiddleware(hostCorsOptions, corsFactory);
4950

5051
var httpContext = new DefaultHttpContext();
5152
await middleware.Invoke(httpContext, next);
@@ -83,7 +84,7 @@ public async Task Invoke_OriginAllowed_AddsExpectedHeaders()
8384
services.AddTransient<IConfigureOptions<HostCorsOptions>>(factory => new TestHostCorsOptionsSetup(hostCorsOptions));
8485
services.TryAddSingleton<IJobHostMiddlewarePipeline, DefaultMiddlewarePipeline>();
8586
services.AddCors();
86-
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, CorsConfigurationMiddleware>());
87+
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, JobHostCorsMiddleware>());
8788
services.AddSingleton<ICorsMiddlewareFactory, CorsMiddlewareFactory>();
8889
});
8990

@@ -136,7 +137,7 @@ public async Task Invoke_OriginNotAllowed_DoesNotAddHeaders()
136137
services.AddTransient<IConfigureOptions<HostCorsOptions>>(factory => new TestHostCorsOptionsSetup(hostCorsOptions));
137138
services.TryAddSingleton<IJobHostMiddlewarePipeline, DefaultMiddlewarePipeline>();
138139
services.AddCors();
139-
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, CorsConfigurationMiddleware>());
140+
services.TryAddEnumerable(ServiceDescriptor.Singleton<IJobHostHttpMiddleware, JobHostCorsMiddleware>());
140141
services.AddSingleton<ICorsMiddlewareFactory, CorsMiddlewareFactory>();
141142
});
142143

0 commit comments

Comments
 (0)