Skip to content

Commit 61852ce

Browse files
Ensure enhanced nav requests have the correct headers (#50263)
1 parent 3ea1fa3 commit 61852ce

File tree

5 files changed

+40
-5
lines changed

5 files changed

+40
-5
lines changed

src/Components/Web.JS/dist/Release/blazor.web.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Components/Web.JS/src/Services/NavigationEnhancement.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,10 @@ export async function performEnhancedPageLoad(internalDestinationHref: string, f
133133
const abortSignal = currentEnhancedNavigationAbortController.signal;
134134
const responsePromise = fetch(internalDestinationHref, Object.assign({
135135
signal: abortSignal,
136-
headers: { 'blazor-enhanced-nav': 'on' },
136+
headers: {
137+
'blazor-enhanced-nav': 'on',
138+
'accept': 'text/html',
139+
},
137140
}, fetchOptions));
138141
await getResponsePartsWithFraming(responsePromise, abortSignal,
139142
(response, initialContent) => {

src/Components/test/E2ETest/ServerRenderingTests/EnhancedNavigationTest.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,24 @@ public void CanNavigateToNonHtmlResponse()
7070
Browser.Equal("Hello, this is plain text", () => Browser.Exists(By.TagName("html")).Text);
7171
}
7272

73+
[Fact]
74+
public void EnhancedNavRequestsIncludeExpectedHeaders()
75+
{
76+
Navigate($"{ServerPathBase}/nav");
77+
Browser.Exists(By.TagName("nav")).FindElement(By.LinkText("List headers")).Click();
78+
79+
var ul = Browser.Exists(By.Id("all-headers"));
80+
var allHeaders = ul.FindElements(By.TagName("li")).Select(x => x.Text.ToLowerInvariant()).ToList();
81+
82+
// The server can trigger arbitrary behavior based on this
83+
Assert.Contains("blazor-enhanced-nav: on", allHeaders);
84+
85+
// This is to make the enhanced nav outcomes more similar to non-enhanced nav.
86+
// For example, the default error middleware will only serve the error page if
87+
// this header is included.
88+
Assert.Contains("accept: text/html", allHeaders);
89+
}
90+
7391
[Fact]
7492
public void ScrollsToHashWithContentAddedAsynchronously()
7593
{

src/Components/test/testassets/Components.TestServer/RazorComponentEndpointsStartup.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Globalization;
55
using System.Reflection;
66
using System.Security.Claims;
7+
using System.Web;
78
using Components.TestServer.RazorComponents;
89
using Components.TestServer.RazorComponents.Pages.Forms;
910
using Components.TestServer.Services;
@@ -123,5 +124,17 @@ private static void MapEnhancedNavigationEndpoints(IEndpointRouteBuilder endpoin
123124
response.ContentType = "text/html";
124125
await response.WriteAsync("<h1>404</h1><p>Sorry, there's nothing here! This is a custom server-generated 404 message.</p>");
125126
});
127+
128+
// Used when testing that enhanced nav includes "Accept: text/html"
129+
endpoints.Map("/nav/list-headers", async (HttpRequest request, HttpResponse response) =>
130+
{
131+
response.ContentType = "text/html";
132+
await response.WriteAsync("<ul id='all-headers'>");
133+
foreach (var header in request.Headers)
134+
{
135+
await response.WriteAsync($"<li>{HttpUtility.HtmlEncode(header.Key)}: {HttpUtility.HtmlEncode(header.Value)}</li>");
136+
}
137+
await response.WriteAsync("</ul>");
138+
});
126139
}
127140
}

src/Components/test/testassets/Components.TestServer/RazorComponents/Shared/EnhancedNavLayout.razor

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212
<NavLink href="nav/do-redirection?destination=https://microsoft.com">Redirect external</NavLink> |
1313
<NavLink href="nav/do-redirection-while-streaming">Redirect while streaming</NavLink> |
1414
<NavLink href="nav/do-redirection-while-streaming?destination=https://microsoft.com">Redirect external while streaming</NavLink> |
15-
<NavLink href="nav/throw-while-streaming">Error while streaming</NavLink>
16-
<NavLink href="nav/interactive-component-navigation/server">Interactive component navigation (server)</NavLink>
17-
<NavLink href="nav/interactive-component-navigation/webassembly">Interactive component navigation (webassembly)</NavLink>
15+
<NavLink href="nav/throw-while-streaming">Error while streaming</NavLink> |
16+
<NavLink href="nav/interactive-component-navigation/server">Interactive component navigation (server)</NavLink> |
17+
<NavLink href="nav/interactive-component-navigation/webassembly">Interactive component navigation (webassembly)</NavLink> |
18+
<NavLink href="nav/list-headers">List headers</NavLink> |
1819
</nav>
1920
<hr/>
2021
@Body

0 commit comments

Comments
 (0)