From fc69c8021c87edad4bc3ca7a8eeddf27e2dbb59c Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 21 Sep 2022 15:22:13 -0700 Subject: [PATCH] refactor(http): convert NgModules to use `provideHttpClient` internally (#47502) This commit converts `HttpClientModule` to use `provideHttpClient()` internally, with a particular configuration of features. Other NgModules related to configuring `HttpClient` are also converted to use the providers directly from various features, to ensure consistency of behavior. PR Close #47502 --- goldens/public-api/common/http/index.md | 2 +- packages/common/http/src/interceptor.ts | 2 - packages/common/http/src/module.ts | 53 ++++++++----------------- packages/common/http/src/provider.ts | 6 ++- 4 files changed, 22 insertions(+), 41 deletions(-) diff --git a/goldens/public-api/common/http/index.md b/goldens/public-api/common/http/index.md index b66e63da5fb..2773c5af9ba 100644 --- a/goldens/public-api/common/http/index.md +++ b/goldens/public-api/common/http/index.md @@ -1654,7 +1654,7 @@ export class HttpClientModule { // (undocumented) static ɵinj: i0.ɵɵInjectorDeclaration; // (undocumented) - static ɵmod: i0.ɵɵNgModuleDeclaration; + static ɵmod: i0.ɵɵNgModuleDeclaration; } // @public diff --git a/packages/common/http/src/interceptor.ts b/packages/common/http/src/interceptor.ts index ad07c739472..9b215784827 100644 --- a/packages/common/http/src/interceptor.ts +++ b/packages/common/http/src/interceptor.ts @@ -170,8 +170,6 @@ export function legacyInterceptorFnFactory(): HttpInterceptorFn { }; } -export const LEGACY_INTERCEPTOR_FN = new InjectionToken('LEGACY_INTERCEPTOR_FN'); - @Injectable() export class HttpInterceptorHandler extends HttpHandler { private chain: ChainedInterceptorFn|null = null; diff --git a/packages/common/http/src/module.ts b/packages/common/http/src/module.ts index 3bca76d4c19..776b7417d45 100644 --- a/packages/common/http/src/module.ts +++ b/packages/common/http/src/module.ts @@ -8,12 +8,9 @@ import {ModuleWithProviders, NgModule} from '@angular/core'; -import {HttpBackend, HttpHandler} from './backend'; -import {HttpClient} from './client'; -import {HTTP_INTERCEPTOR_FNS, HTTP_INTERCEPTORS, HttpInterceptorHandler, LEGACY_INTERCEPTOR_FN, legacyInterceptorFnFactory} from './interceptor'; -import {jsonpCallbackContext, JsonpCallbackContext, JsonpClientBackend, jsonpInterceptorFn} from './jsonp'; -import {HttpXhrBackend} from './xhr'; -import {HttpXsrfCookieExtractor, HttpXsrfInterceptor, HttpXsrfTokenExtractor, XSRF_COOKIE_NAME, XSRF_DEFAULT_COOKIE_NAME, XSRF_DEFAULT_HEADER_NAME, XSRF_ENABLED, XSRF_HEADER_NAME} from './xsrf'; +import {HTTP_INTERCEPTORS} from './interceptor'; +import {provideHttpClient, withJsonpSupport, withLegacyInterceptors, withNoXsrfProtection, withXsrfConfiguration} from './provider'; +import {HttpXsrfCookieExtractor, HttpXsrfInterceptor, HttpXsrfTokenExtractor, XSRF_DEFAULT_COOKIE_NAME, XSRF_DEFAULT_HEADER_NAME, XSRF_ENABLED} from './xsrf'; /** * Configures XSRF protection support for outgoing requests. @@ -32,8 +29,10 @@ import {HttpXsrfCookieExtractor, HttpXsrfInterceptor, HttpXsrfTokenExtractor, XS HttpXsrfInterceptor, {provide: HTTP_INTERCEPTORS, useExisting: HttpXsrfInterceptor, multi: true}, {provide: HttpXsrfTokenExtractor, useClass: HttpXsrfCookieExtractor}, - {provide: XSRF_COOKIE_NAME, useValue: XSRF_DEFAULT_COOKIE_NAME}, - {provide: XSRF_HEADER_NAME, useValue: XSRF_DEFAULT_HEADER_NAME}, + withXsrfConfiguration({ + cookieName: XSRF_DEFAULT_COOKIE_NAME, + headerName: XSRF_DEFAULT_HEADER_NAME, + }).ɵproviders, {provide: XSRF_ENABLED, useValue: true}, ], }) @@ -45,7 +44,7 @@ export class HttpClientXsrfModule { return { ngModule: HttpClientXsrfModule, providers: [ - {provide: XSRF_ENABLED, useValue: false}, + withNoXsrfProtection().ɵproviders, ], }; } @@ -64,10 +63,7 @@ export class HttpClientXsrfModule { } = {}): ModuleWithProviders { return { ngModule: HttpClientXsrfModule, - providers: [ - options.cookieName ? {provide: XSRF_COOKIE_NAME, useValue: options.cookieName} : [], - options.headerName ? {provide: XSRF_HEADER_NAME, useValue: options.headerName} : [], - ], + providers: withXsrfConfiguration(options).ɵproviders, }; } } @@ -82,31 +78,18 @@ export class HttpClientXsrfModule { * @publicApi */ @NgModule({ - /** - * Optional configuration for XSRF protection. - */ - imports: [ - HttpClientXsrfModule.withOptions({ - cookieName: XSRF_DEFAULT_COOKIE_NAME, - headerName: XSRF_DEFAULT_HEADER_NAME, - }), - ], /** * Configures the [dependency injector](guide/glossary#injector) where it is imported * with supporting services for HTTP communications. */ providers: [ - HttpClient, - HttpXhrBackend, - HttpInterceptorHandler, - {provide: HttpHandler, useExisting: HttpInterceptorHandler}, - {provide: HttpBackend, useExisting: HttpXhrBackend}, - {provide: LEGACY_INTERCEPTOR_FN, useFactory: legacyInterceptorFnFactory}, - { - provide: HTTP_INTERCEPTOR_FNS, - useExisting: LEGACY_INTERCEPTOR_FN, - multi: true, - }, + provideHttpClient( + withLegacyInterceptors(), + withXsrfConfiguration({ + cookieName: XSRF_DEFAULT_COOKIE_NAME, + headerName: XSRF_DEFAULT_HEADER_NAME, + }), + ), ], }) export class HttpClientModule { @@ -125,9 +108,7 @@ export class HttpClientModule { */ @NgModule({ providers: [ - JsonpClientBackend, - {provide: JsonpCallbackContext, useFactory: jsonpCallbackContext}, - {provide: HTTP_INTERCEPTOR_FNS, useValue: jsonpInterceptorFn, multi: true}, + withJsonpSupport().ɵproviders, ], }) export class HttpClientJsonpModule { diff --git a/packages/common/http/src/provider.ts b/packages/common/http/src/provider.ts index c2dea45b0b8..b9c5f11d0cb 100644 --- a/packages/common/http/src/provider.ts +++ b/packages/common/http/src/provider.ts @@ -6,11 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {Provider} from '@angular/core'; +import {InjectionToken, Provider} from '@angular/core'; import {HttpBackend, HttpHandler} from './backend'; import {HttpClient} from './client'; -import {HTTP_INTERCEPTOR_FNS, HttpInterceptorHandler, LEGACY_INTERCEPTOR_FN, legacyInterceptorFnFactory} from './interceptor'; +import {HTTP_INTERCEPTOR_FNS, HttpInterceptorFn, HttpInterceptorHandler, legacyInterceptorFnFactory} from './interceptor'; import {JsonpCallbackContext, jsonpCallbackContext, JsonpClientBackend, jsonpInterceptorFn} from './jsonp'; import {HttpXhrBackend} from './xhr'; import {HttpXsrfCookieExtractor, HttpXsrfTokenExtractor, XSRF_COOKIE_NAME, XSRF_ENABLED, XSRF_HEADER_NAME, xsrfInterceptorFn} from './xsrf'; @@ -70,6 +70,8 @@ export function provideHttpClient(...features: HttpFeature[]): return providers; } +const LEGACY_INTERCEPTOR_FN = new InjectionToken('LEGACY_INTERCEPTOR_FN'); + export function withLegacyInterceptors(): HttpFeature { // Note: the legacy interceptor function is provided here via an intermediate token // (`LEGACY_INTERCEPTOR_FN`), using a pattern which guarantees that if these providers are