Merge pull request #15491 from abpframework/issue/15380

Add HttpContext variable and skip it http interceptor logic when it i…
pull/15495/head
Muhammed Altuğ 3 years ago committed by GitHub
commit cfd66fbe3c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -298,3 +298,15 @@ export function handleHttpErrors(injector: Injector, httpError: HttpErrorRespons
return throwError(httpError)
}
```
### How to Skip HTTP interceptors and ABP headers
The ABP Framework adds several HTTP headers to the HttpClient, such as the "Auth token" or "tenant Id".
The ABP Server must possess the information but the ABP user may not want to send this informations to an external server.
ExternalHttpClient and IS EXTERNAL REQUEST HttpContext Token were added in V6.0.4.
The ABP Http interceptors check the value of the `IS_EXTERNAL_REQUEST` token. If the token is True then ABP-specific headers won't be added to Http Request.
The `ExternalHttpClient` extends from `HTTPClient` and sets the `IS_EXTERNAL_REQUEST` context token to true.
When you are using `ExternalHttpClient` as HttpClient in your components, it does not add ABP-specific headers.
Note: With `IS_EXTERNAL_REQUEST` or without it, ABP loading service works.

@ -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<any>,
url?: string,
options: RequestOptions = {},
): Observable<any> {
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<HttpClient['request']>[2];

@ -0,0 +1 @@
export * from './http.client';

@ -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',
@ -19,12 +20,14 @@ export class ApiInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler) {
this.httpWaitService.addRequest(request);
return next
.handle(
request.clone({
const isExternalRequest = request.context?.get(IS_EXTERNAL_REQUEST);
const newRequest = isExternalRequest
? request
: request.clone({
setHeaders: this.getAdditionalHeaders(request.headers),
}),
)
});
return next
.handle(newRequest)
.pipe(finalize(() => this.httpWaitService.deleteRequest(request)));
}

@ -0,0 +1,3 @@
import { HttpContextToken } from '@angular/common/http';
export const IS_EXTERNAL_REQUEST = new HttpContextToken<boolean>(() => false);

@ -7,3 +7,4 @@ export * from './manage-profile.token';
export * from './options.token';
export * from './queue.token';
export * from './tenant-key.token';
export * from './http-context.token';

@ -23,3 +23,4 @@ export * from './lib/strategies';
export * from './lib/tokens';
export * from './lib/utils';
export * from './lib/validators';
export * from './lib/clients';

Loading…
Cancel
Save