From 30649a62fd2d920eda492ce4fff9761766c6c143 Mon Sep 17 00:00:00 2001 From: SkyZeroZx <73321943+SkyZeroZx@users.noreply.github.com> Date: Thu, 16 Jul 2026 13:59:53 -0500 Subject: [PATCH 1/2] fix(http): enable xsrf for root-provided HttpClient Include the XSRF interceptor in the root token factory so the automatically provided HttpClient retains the documented default protection without requiring provideHttpClient(). Update test for the root-only provider graph and verify that withNoXsrfProtection() still disables the default header. --- packages/common/http/src/interceptor.ts | 3 ++- packages/common/http/test/provider_spec.ts | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/common/http/src/interceptor.ts b/packages/common/http/src/interceptor.ts index 98861f97b82e..fb21beaa5723 100644 --- a/packages/common/http/src/interceptor.ts +++ b/packages/common/http/src/interceptor.ts @@ -20,6 +20,7 @@ import type {HttpHandler} from './backend'; import {HttpRequest} from './request'; import {HttpEvent} from './response'; +import {xsrfInterceptorFn} from './xsrf'; /** * Intercepts and handles an `HttpRequest` or `HttpResponse`. @@ -200,7 +201,7 @@ export const HTTP_INTERCEPTORS = new InjectionToken( */ export const HTTP_INTERCEPTOR_FNS = new InjectionToken( typeof ngDevMode !== 'undefined' && ngDevMode ? 'HTTP_INTERCEPTOR_FNS' : '', - {factory: () => []}, + {factory: () => [xsrfInterceptorFn]}, ); /** diff --git a/packages/common/http/test/provider_spec.ts b/packages/common/http/test/provider_spec.ts index 1db5271adbcd..450c2de60181 100644 --- a/packages/common/http/test/provider_spec.ts +++ b/packages/common/http/test/provider_spec.ts @@ -264,6 +264,19 @@ describe('provideHttpClient', () => { }); describe('xsrf protection', () => { + it('should enable xsrf protection for the root-provided HttpClient', () => { + TestBed.configureTestingModule({ + providers: [provideHttpClientTesting(), {provide: PLATFORM_ID, useValue: 'test'}], + }); + + setXsrfToken('abcdefg'); + + TestBed.inject(HttpClient).post('/test', '', {responseType: 'text'}).subscribe(); + const req = TestBed.inject(HttpTestingController).expectOne('/test'); + expect(req.request.headers.get('X-XSRF-TOKEN')).toEqual('abcdefg'); + req.flush(''); + }); + it('should enable xsrf protection by default', () => { TestBed.configureTestingModule({ providers: [ @@ -314,7 +327,7 @@ describe('provideHttpClient', () => { TestBed.inject(HttpClient).post('/test', '', {responseType: 'text'}).subscribe(); const req = TestBed.inject(HttpTestingController).expectOne('/test'); - expect(req.request.headers.has('X-Custom-Xsrf-Header')).toBeFalse(); + expect(req.request.headers.has('X-XSRF-TOKEN')).toBeFalse(); req.flush(''); }); From 252708676452b9a881d46e42150057a49906e072 Mon Sep 17 00:00:00 2001 From: SkyZeroZx <73321943+SkyZeroZx@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:51:10 -0500 Subject: [PATCH 2/2] fixup! fix(http): enable xsrf for root-provided HttpClient --- packages/common/http/src/xsrf.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/common/http/src/xsrf.ts b/packages/common/http/src/xsrf.ts index c893474d6ee3..b1cae0c9a12a 100644 --- a/packages/common/http/src/xsrf.ts +++ b/packages/common/http/src/xsrf.ts @@ -16,8 +16,8 @@ import { } from '@angular/core'; import {Observable} from 'rxjs'; -import {HttpHandler} from './backend'; -import {HttpHandlerFn, HttpInterceptor} from './interceptor'; +import type {HttpHandler} from './backend'; +import type {HttpHandlerFn, HttpInterceptor} from './interceptor'; import {HttpRequest} from './request'; import {HttpEvent} from './response';