diff --git a/packages/void/src/pages/navigation-engine.ts b/packages/void/src/pages/navigation-engine.ts index 4499cc572..144fa4a5c 100644 --- a/packages/void/src/pages/navigation-engine.ts +++ b/packages/void/src/pages/navigation-engine.ts @@ -706,23 +706,13 @@ export async function createPageNavigationEngine( window.location.href = method === 'GET' ? url : response.url; return undefined; } - commitTarget.fetchUrl = redirectUrl.pathname + redirectUrl.search; + // The browser already followed the redirect: treat the final response as the GET + // result for the destination instead of fetching it a second time. + method = 'GET'; + fetchUrl = redirectUrl.pathname + redirectUrl.search; + url = fetchUrl + redirectUrl.hash; + commitTarget.fetchUrl = fetchUrl; commitTarget.hash = redirectUrl.hash; - return loadNavigationShell( - id, - redirectUrl.pathname + redirectUrl.search + redirectUrl.hash, - redirectUrl.pathname + redirectUrl.search, - 'GET', - { - preserveScroll: options.preserveScroll, - preserveState: options.preserveState, - replace: options.replace, - viewTransition: options.viewTransition, - }, - signal, - commitTarget, - deferredRegistry, - ); } if (response && method !== 'GET' && !response.ok) { diff --git a/packages/void/test/unit/pages-client.test.ts b/packages/void/test/unit/pages-client.test.ts index f9a159836..e6f5ee83a 100644 --- a/packages/void/test/unit/pages-client.test.ts +++ b/packages/void/test/unit/pages-client.test.ts @@ -1131,18 +1131,15 @@ describe('createVoidRouter other-origin visits', () => { it('follows a same-host Capacitor action redirect in place', async () => { const { router, fetchMock, applyUpdate } = await createRouter('capacitor://localhost'); - const response = pageJson({}); + const response = pageJson({ component: 'users', props: { users: [] } }); Object.defineProperties(response, { redirected: { value: true }, url: { value: 'capacitor://localhost/users' }, }); fetchMock.mockResolvedValueOnce(response); await router.visit('/submit', { method: 'POST' }); - expect(fetchMock).toHaveBeenNthCalledWith( - 2, - '/users', - expect.objectContaining({ method: 'GET' }), - ); + // The redirect destination is rendered from the followed response, not fetched again. + expect(fetchMock).toHaveBeenCalledTimes(1); expect(applyUpdate).toHaveBeenCalledTimes(1); expect(window.location.href).toBeUndefined(); });