Skip to content

Commit 01e61b4

Browse files
Return correct WebHook-Allowed-Origin response header for CloudEvent schema subscriptions for gov cloud. (#47232)
1 parent ab6da02 commit 01e61b4

File tree

4 files changed

+66
-2
lines changed

4 files changed

+66
-2
lines changed

sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Release History
22

3+
## 3.4.4 (2024-11-19)
4+
5+
### Bugs Fixed
6+
7+
- Return correct `WebHook-Allowed-Origin` response header for CloudEvent schema subscriptions for gov cloud.
8+
39
## 3.4.3 (2024-09-10)
410

511
### Bugs Fixed

sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/src/Microsoft.Azure.WebJobs.Extensions.EventGrid.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<PropertyGroup>
33
<TargetFrameworks>$(RequiredTargetFrameworks)</TargetFrameworks>
44
<Description>This extension adds bindings for EventGrid</Description>
5-
<Version>3.4.3</Version>
5+
<Version>3.4.4</Version>
66
<!--The ApiCompatVersion is managed automatically and should not generally be modified manually.-->
77
<ApiCompatVersion>3.4.2</ApiCompatVersion>
88
<NoWarn>$(NoWarn);CS1591</NoWarn>

sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/src/TriggerBinding/HttpRequestProcessor.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ internal async Task<HttpResponseMessage> ProcessAsync(
5151
};
5252
}
5353
var response = new HttpResponseMessage(HttpStatusCode.OK);
54-
response.Headers.Add("Webhook-Allowed-Origin", "eventgrid.azure.net");
54+
response.Headers.Add("Webhook-Allowed-Origin", GetAllowedOriginResponseHeader(req));
5555
return response;
5656
}
5757

@@ -127,5 +127,29 @@ internal async Task<HttpResponseMessage> ProcessAsync(
127127
new HttpResponseMessage(HttpStatusCode.Accepted) :
128128
new HttpResponseMessage(HttpStatusCode.BadRequest);
129129
}
130+
131+
private static string GetAllowedOriginResponseHeader(HttpRequestMessage req)
132+
{
133+
const string publicCloudOrigin = "eventgrid.azure.net";
134+
const string requestOriginHeader = "WebHook-Request-Origin";
135+
136+
if (!req.Headers.Contains(requestOriginHeader))
137+
{
138+
return publicCloudOrigin;
139+
}
140+
141+
string allowedOrigin = req.Headers.GetValues(requestOriginHeader).FirstOrDefault();
142+
switch (allowedOrigin)
143+
{
144+
case publicCloudOrigin:
145+
case "eventgrid.azure.us":
146+
case "eventgrid.azure.eaglex.ic.gov":
147+
case "eventgrid.azure.microsoft.scloud":
148+
case "eventgrid.azure.cn":
149+
return allowedOrigin;
150+
default:
151+
return publicCloudOrigin;
152+
}
153+
}
130154
}
131155
}

sdk/eventgrid/Microsoft.Azure.WebJobs.Extensions.EventGrid/tests/TestListener.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,40 @@ public async Task TestSubscribeOptions(string functionName)
105105
var request = new HttpRequestMessage(HttpMethod.Options, $"http://localhost/?functionName={functionName}");
106106
var response = await ext.ConvertAsync(request, CancellationToken.None);
107107
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
108+
// no WebHook-Request-Origin header, should fallback to public cloud
109+
Assert.AreEqual("eventgrid.azure.net", response.Headers.GetValues("Webhook-Allowed-Origin").First());
110+
}
111+
112+
[TestCase("eventgrid.azure.net")]
113+
[TestCase("eventgrid.azure.us")]
114+
[TestCase("eventgrid.azure.eaglex.ic.gov")]
115+
[TestCase("eventgrid.azure.microsoft.scloud")]
116+
[TestCase("eventgrid.azure.cn")]
117+
public async Task TestSubscribeOptionsKnownAllowedOrigin(string origin)
118+
{
119+
using var host = TestHelpers.NewHost<MyProg1>(CreateConfigProvider);
120+
var ext = host.Services.GetServices<IExtensionConfigProvider>().OfType<EventGridExtensionConfigProvider>().Single();
121+
await host.StartAsync(); // add listener
122+
123+
var request = new HttpRequestMessage(HttpMethod.Options, $"http://localhost/?functionName=TestCloudEvent");
124+
request.Headers.Add("WebHook-Request-Origin", origin);
125+
var response = await ext.ConvertAsync(request, CancellationToken.None);
126+
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
127+
Assert.AreEqual(origin, response.Headers.GetValues("Webhook-Allowed-Origin").First());
128+
}
129+
130+
[Test]
131+
public async Task TestSubscribeOptionsUnknownAllowedOrigin()
132+
{
133+
using var host = TestHelpers.NewHost<MyProg1>(CreateConfigProvider);
134+
var ext = host.Services.GetServices<IExtensionConfigProvider>().OfType<EventGridExtensionConfigProvider>().Single();
135+
await host.StartAsync(); // add listener
136+
137+
var request = new HttpRequestMessage(HttpMethod.Options, $"http://localhost/?functionName=TestCloudEvent");
138+
request.Headers.Add("WebHook-Request-Origin", "someunknown.origin.com");
139+
var response = await ext.ConvertAsync(request, CancellationToken.None);
140+
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
141+
// Unknown origin, should fallback to public cloud
108142
Assert.AreEqual("eventgrid.azure.net", response.Headers.GetValues("Webhook-Allowed-Origin").First());
109143
}
110144

0 commit comments

Comments
 (0)