From 4a9f0ba8ae0fe77c999f7ed2fb8f0fa09cec6508 Mon Sep 17 00:00:00 2001 From: Mahmut Gundogdu Date: Mon, 23 Jan 2023 17:54:11 +0300 Subject: [PATCH] Add HttpContext variable and skip it http interceptor logic when it is true --- .../core/src/lib/clients/http.client.ts | 30 +++++++++++++++++++ .../packages/core/src/lib/clients/index.ts | 1 + .../src/lib/interceptors/api.interceptor.ts | 4 +++ .../core/src/lib/tokens/http-context.token.ts | 3 ++ npm/ng-packs/packages/core/src/public-api.ts | 1 + 5 files changed, 39 insertions(+) create mode 100644 npm/ng-packs/packages/core/src/lib/clients/http.client.ts create mode 100644 npm/ng-packs/packages/core/src/lib/clients/index.ts create mode 100644 npm/ng-packs/packages/core/src/lib/tokens/http-context.token.ts diff --git a/npm/ng-packs/packages/core/src/lib/clients/http.client.ts b/npm/ng-packs/packages/core/src/lib/clients/http.client.ts new file mode 100644 index 0000000000..c6e9017be7 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/clients/http.client.ts @@ -0,0 +1,30 @@ +import { HttpClient, HttpContext, HttpRequest } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { IS_EXTERNAL_REQUEST } from '../tokens/http-context.token'; + +// source : https://github.com/armanozak/demo-angular-server-specific-interceptors +@Injectable({ + providedIn: 'root', +}) +export class ExternalHttpClient extends HttpClient { + override request( + first: string | HttpRequest, + url?: string, + options: RequestOptions = {}, + ): Observable { + if (typeof first === 'string') { + this.#setPlaceholderContext(options); + return super.request(first, url, options); + } + + this.#setPlaceholderContext(first); + return super.request(first); + } + #setPlaceholderContext(optionsOrRequest: { context?: HttpContext }) { + optionsOrRequest.context ??= new HttpContext(); + optionsOrRequest.context.set(IS_EXTERNAL_REQUEST, true); + } +} + +type RequestOptions = Parameters[2]; diff --git a/npm/ng-packs/packages/core/src/lib/clients/index.ts b/npm/ng-packs/packages/core/src/lib/clients/index.ts new file mode 100644 index 0000000000..c9aba4d030 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/clients/index.ts @@ -0,0 +1 @@ +export * from './http.client'; diff --git a/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts b/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts index d3dbe19ec0..aef5b9e706 100644 --- a/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts +++ b/npm/ng-packs/packages/core/src/lib/interceptors/api.interceptor.ts @@ -5,6 +5,7 @@ import { finalize } from 'rxjs/operators'; import { SessionStateService } from '../services/session-state.service'; import { HttpWaitService } from '../services/http-wait.service'; import { TENANT_KEY } from '../tokens/tenant-key.token'; +import { IS_EXTERNAL_REQUEST } from '../tokens/http-context.token'; @Injectable({ providedIn: 'root', @@ -18,6 +19,9 @@ export class ApiInterceptor implements HttpInterceptor { ) {} intercept(request: HttpRequest, next: HttpHandler) { + if (request.context?.get(IS_EXTERNAL_REQUEST)) { + return next.handle(request); + } this.httpWaitService.addRequest(request); return next .handle( diff --git a/npm/ng-packs/packages/core/src/lib/tokens/http-context.token.ts b/npm/ng-packs/packages/core/src/lib/tokens/http-context.token.ts new file mode 100644 index 0000000000..e935232b08 --- /dev/null +++ b/npm/ng-packs/packages/core/src/lib/tokens/http-context.token.ts @@ -0,0 +1,3 @@ +import { HttpContextToken } from '@angular/common/http'; + +export const IS_EXTERNAL_REQUEST = new HttpContextToken(() => false); diff --git a/npm/ng-packs/packages/core/src/public-api.ts b/npm/ng-packs/packages/core/src/public-api.ts index a5cbd78e4e..e740b4c4df 100644 --- a/npm/ng-packs/packages/core/src/public-api.ts +++ b/npm/ng-packs/packages/core/src/public-api.ts @@ -23,3 +23,4 @@ export * from './lib/strategies'; export * from './lib/tokens'; export * from './lib/utils'; export * from './lib/validators'; +export * from './lib/clients';