From 077df0e3ca6849df8173ca818693dbf1d99fa512 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Mon, 22 Jul 2019 08:14:10 -0700 Subject: [PATCH] Support more types of redirection during prerendering. Fixes #11591 (#12418) * E2E test to show current behavior * Actually support base-relative, root-relative, and absolute redirections during prerendering * Fix MVC functional test --- .../Server/src/Circuits/RemoteUriHelper.cs | 4 +++- .../ServerExecutionTests/PrerenderingTest.cs | 22 +++++++++++++++++++ .../BasicTestApp/PrerenderedRedirection.razor | 16 ++++++++++++++ .../ComponentRenderingFunctionalTests.cs | 5 ++--- 4 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 src/Components/test/testassets/BasicTestApp/PrerenderedRedirection.razor diff --git a/src/Components/Server/src/Circuits/RemoteUriHelper.cs b/src/Components/Server/src/Circuits/RemoteUriHelper.cs index f89e917db0..b285868ab4 100644 --- a/src/Components/Server/src/Circuits/RemoteUriHelper.cs +++ b/src/Components/Server/src/Circuits/RemoteUriHelper.cs @@ -88,8 +88,10 @@ namespace Microsoft.AspNetCore.Components.Server.Circuits if (_jsRuntime == null) { - throw new NavigationException(uri); + var absoluteUriString = ToAbsoluteUri(uri).ToString(); + throw new NavigationException(absoluteUriString); } + _jsRuntime.InvokeAsync(Interop.NavigateTo, uri, forceLoad); } diff --git a/src/Components/test/E2ETest/ServerExecutionTests/PrerenderingTest.cs b/src/Components/test/E2ETest/ServerExecutionTests/PrerenderingTest.cs index 9ca2101255..21c14f9789 100644 --- a/src/Components/test/E2ETest/ServerExecutionTests/PrerenderingTest.cs +++ b/src/Components/test/E2ETest/ServerExecutionTests/PrerenderingTest.cs @@ -1,6 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; using Microsoft.AspNetCore.Components.E2ETest.Infrastructure; using Microsoft.AspNetCore.Components.E2ETest.Infrastructure.ServerFixtures; using Microsoft.AspNetCore.E2ETesting; @@ -75,6 +79,24 @@ namespace Microsoft.AspNetCore.Components.E2ETest.ServerExecutionTests () => Browser.FindElement(By.TagName("strong")).Text); } + [Theory] + [InlineData("base/relative", "prerendered/base/relative")] + [InlineData("/root/relative", "/root/relative")] + [InlineData("http://absolute/url", "http://absolute/url")] + public async Task CanRedirectDuringPrerendering(string destinationParam, string expectedRedirectionLocation) + { + var requestUri = new Uri( + _serverFixture.RootUri, + "prerendered/prerendered-redirection?destination=" + destinationParam); + + var httpClient = new HttpClient(new HttpClientHandler { AllowAutoRedirect = false }); + var response = await httpClient.GetAsync(requestUri); + + var expectedUri = new Uri(_serverFixture.RootUri, expectedRedirectionLocation); + Assert.Equal(HttpStatusCode.Redirect, response.StatusCode); + Assert.Equal(expectedUri, response.Headers.Location); + } + private void BeginInteractivity() { Browser.FindElement(By.Id("load-boot-script")).Click(); diff --git a/src/Components/test/testassets/BasicTestApp/PrerenderedRedirection.razor b/src/Components/test/testassets/BasicTestApp/PrerenderedRedirection.razor new file mode 100644 index 0000000000..da489e75c5 --- /dev/null +++ b/src/Components/test/testassets/BasicTestApp/PrerenderedRedirection.razor @@ -0,0 +1,16 @@ +@page "/prerendered-redirection" +@inject IUriHelper UriHelper + +@{ + throw new InvalidOperationException("The rendering logic should never be executed"); +} + +@code { + protected override Task OnInitializedAsync() + { + var uri = UriHelper.GetAbsoluteUri(); + var destination = uri.Substring(uri.IndexOf("?destination=") + 13); + UriHelper.NavigateTo(destination); + return Task.CompletedTask; + } +} diff --git a/src/Mvc/test/Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs b/src/Mvc/test/Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs index 5b77c17e9c..0c6265469a 100644 --- a/src/Mvc/test/Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs +++ b/src/Mvc/test/Mvc.FunctionalTests/ComponentRenderingFunctionalTests.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests // Assert await response.AssertStatusCodeAsync(HttpStatusCode.Redirect); - Assert.Equal("/navigation-redirect", response.Headers.Location.ToString()); + Assert.Equal("http://localhost/navigation-redirect", response.Headers.Location.ToString()); } [Fact] @@ -99,10 +99,9 @@ namespace Microsoft.AspNetCore.Mvc.FunctionalTests var response = await client.GetAsync("http://localhost/components/Navigation/false"); - // Assert // Assert await response.AssertStatusCodeAsync(HttpStatusCode.Redirect); - Assert.Equal("/navigation-redirect", response.Headers.Location.ToString()); + Assert.Equal("http://localhost/navigation-redirect", response.Headers.Location.ToString()); } [Fact]