diff --git a/packages/angular/ssr/src/app.ts b/packages/angular/ssr/src/app.ts index 0c381c08ae88..a9ca7dd05fe3 100644 --- a/packages/angular/ssr/src/app.ts +++ b/packages/angular/ssr/src/app.ts @@ -353,7 +353,7 @@ export class AngularServerApp { } if (result.redirectTo) { - return createRedirectResponse(result.redirectTo, responseInit.status, headers); + return createRedirectResponse(result.redirectTo, responseInit.status, responseInit.headers); } if (renderMode === RenderMode.Prerender) { diff --git a/packages/angular/ssr/src/utils/redirect.ts b/packages/angular/ssr/src/utils/redirect.ts index d6f83f2c9870..b67f53265c17 100644 --- a/packages/angular/ssr/src/utils/redirect.ts +++ b/packages/angular/ssr/src/utils/redirect.ts @@ -9,7 +9,9 @@ /** * An set of HTTP status codes that are considered valid for redirect responses. */ -export const VALID_REDIRECT_RESPONSE_CODES: Set = new Set([301, 302, 303, 307, 308]); +export const VALID_REDIRECT_RESPONSE_CODES: ReadonlySet = new Set([ + 301, 302, 303, 307, 308, +]); /** * Checks if the given HTTP status code is a valid redirect response code. @@ -33,7 +35,7 @@ export function isValidRedirectResponseCode(code: number): boolean { export function createRedirectResponse( location: string, status = 302, - headers?: Record, + headers?: Record | Headers, ): Response { if (ngDevMode && !isValidRedirectResponseCode(status)) { throw new Error( @@ -42,7 +44,7 @@ export function createRedirectResponse( ); } - const resHeaders = new Headers(headers); + const resHeaders = headers instanceof Headers ? headers : new Headers(headers); if (ngDevMode && resHeaders.has('location')) { // eslint-disable-next-line no-console console.warn( diff --git a/packages/angular/ssr/test/app_spec.ts b/packages/angular/ssr/test/app_spec.ts index b35424796467..de4b1bcb988e 100644 --- a/packages/angular/ssr/test/app_spec.ts +++ b/packages/angular/ssr/test/app_spec.ts @@ -42,6 +42,10 @@ describe('AngularServerApp', () => { const responseInit = inject(RESPONSE_INIT); if (responseInit) { responseInit.status = 308; + const headers = responseInit.headers; + if (headers) { + (headers as Headers).set('X-Redirect-Header', 'custom-value'); + } } void inject(Router).navigate([], { @@ -326,6 +330,7 @@ describe('AngularServerApp', () => { const response = await app.handle(new Request('http://localhost/redirect-via-navigate')); expect(response?.headers.get('location')).toBe('/redirect-via-navigate?filter=test'); expect(response?.status).toBe(308); + expect(response?.headers.get('X-Redirect-Header')).toBe('custom-value'); }); it('returns a 302 status and redirects to the correct location when `urlTree` is updated in a guard', async () => {