Skip to content

Commit fbe4fca

Browse files
committed
Changing the way in which Accept is validated. Resolves #34
1 parent 08a2ad1 commit fbe4fca

File tree

3 files changed

+54
-7
lines changed

3 files changed

+54
-7
lines changed

Lib.AspNetCore.ServerSentEvents/Lib.AspNetCore.ServerSentEvents.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<Description>Lib.AspNetCore.ServerSentEvents is a library which provides Server-Sent Events (SSE) support for ASP.NET Core</Description>
44
<Copyright>Copyright © 2017 - 2020 Tomasz Pęczek</Copyright>
55
<VersionPrefix>5.0.0</VersionPrefix>
6-
<VersionSuffix>alpha2</VersionSuffix>
6+
<VersionSuffix>alpha3</VersionSuffix>
77
<Authors>Tomasz Pęczek</Authors>
88
<TargetFrameworks>netcoreapp2.1;netcoreapp3.0;net461</TargetFrameworks>
99
<AssemblyTitle>Lib.AspNetCore.ServerSentEvents</AssemblyTitle>

Lib.AspNetCore.ServerSentEvents/ServerSentEventsMiddleware.cs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Linq;
23
using System.Threading;
34
using System.Threading.Tasks;
45
using Microsoft.AspNetCore.Http;
@@ -52,7 +53,7 @@ public ServerSentEventsMiddleware(RequestDelegate next, IAuthorizationPolicyProv
5253
/// <returns>The task object representing the asynchronous operation.</returns>
5354
public async Task Invoke(HttpContext context, IPolicyEvaluator policyEvaluator)
5455
{
55-
if (context.Request.Headers[Constants.ACCEPT_HTTP_HEADER] == Constants.SSE_CONTENT_TYPE)
56+
if (CheckAcceptHeader(context.Request.Headers))
5657
{
5758
if (!await AuthorizeAsync(context, policyEvaluator))
5859
{
@@ -84,6 +85,26 @@ public async Task Invoke(HttpContext context, IPolicyEvaluator policyEvaluator)
8485
}
8586
}
8687

88+
private bool CheckAcceptHeader(IHeaderDictionary requestHeaders)
89+
{
90+
if (!requestHeaders.ContainsKey(Constants.ACCEPT_HTTP_HEADER))
91+
{
92+
return true;
93+
}
94+
95+
if (requestHeaders[Constants.ACCEPT_HTTP_HEADER].Count == 0)
96+
{
97+
return true;
98+
}
99+
100+
if (requestHeaders[Constants.ACCEPT_HTTP_HEADER].Any(acceptHeaderValue => acceptHeaderValue == Constants.SSE_CONTENT_TYPE))
101+
{
102+
return true;
103+
}
104+
105+
return false;
106+
}
107+
87108
private async Task<bool> AuthorizeAsync(HttpContext context, IPolicyEvaluator policyEvaluator)
88109
{
89110
bool authorized = false;

Test.AspNetCore.ServerSentEvents/Middleware/HandshakeTests.cs

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,15 @@ private ServerSentEventsMiddleware<ServerSentEventsService> PrepareServerSentEve
3434
);
3535
}
3636

37-
private HttpContext PrepareHttpContext()
37+
private HttpContext PrepareHttpContext(string acceptHeaderValue)
3838
{
3939
HttpContext context = new DefaultHttpContext();
4040

41-
context.Request.Headers.Append(ACCEPT_HTTP_HEADER, SSE_CONTENT_TYPE);
41+
if (acceptHeaderValue != null)
42+
{
43+
context.Request.Headers.Append(ACCEPT_HTTP_HEADER, acceptHeaderValue);
44+
}
45+
4246
context.RequestAborted = new CancellationToken(true);
4347

4448
return context;
@@ -47,16 +51,38 @@ private HttpContext PrepareHttpContext()
4751

4852
#region Tests
4953
[Fact]
50-
public async Task Invoke_SseRequest_Accepts()
54+
public async Task Invoke_SseRequestWithoutAcceptHeader_Accepts()
5155
{
5256
ServerSentEventsMiddleware<ServerSentEventsService> serverSentEventsMiddleware = PrepareServerSentEventsMiddleware();
53-
HttpContext context = PrepareHttpContext();
57+
HttpContext context = PrepareHttpContext(null);
5458

5559
await serverSentEventsMiddleware.Invoke(context, null);
5660

5761
Assert.Equal(SSE_CONTENT_TYPE, context.Response.ContentType);
5862
}
5963

64+
[Fact]
65+
public async Task Invoke_SseRequestWithEventStreamAcceptHeader_Accepts()
66+
{
67+
ServerSentEventsMiddleware<ServerSentEventsService> serverSentEventsMiddleware = PrepareServerSentEventsMiddleware();
68+
HttpContext context = PrepareHttpContext(SSE_CONTENT_TYPE);
69+
70+
await serverSentEventsMiddleware.Invoke(context, null);
71+
72+
Assert.Equal(SSE_CONTENT_TYPE, context.Response.ContentType);
73+
}
74+
75+
[Fact]
76+
public async Task Invoke_SseRequestWithNotEventStreamAcceptHeader_Accepts()
77+
{
78+
ServerSentEventsMiddleware<ServerSentEventsService> serverSentEventsMiddleware = PrepareServerSentEventsMiddleware();
79+
HttpContext context = PrepareHttpContext("text/plain");
80+
81+
await serverSentEventsMiddleware.Invoke(context, null);
82+
83+
Assert.Null(context.Response.ContentType);
84+
}
85+
6086
[Fact]
6187
public async Task Invoke_SseRequest_CallsOnPrepareAccept()
6288
{
@@ -66,7 +92,7 @@ public async Task Invoke_SseRequest_CallsOnPrepareAccept()
6692
OnPrepareAccept = onPrepareAcceptMock.Object
6793
});
6894

69-
await serverSentEventsMiddleware.Invoke(PrepareHttpContext(), null);
95+
await serverSentEventsMiddleware.Invoke(PrepareHttpContext(null), null);
7096

7197
onPrepareAcceptMock.Verify(m => m(It.IsAny<HttpResponse>()), Times.Once);
7298
}

0 commit comments

Comments
 (0)