This problem, is very common and many solutions are provided in stackoverflow. However, I could not get this to work. "My Failed http requests cannot be retried".
Below is the code for interceptor
import { Injectable } from '@angular/core';
import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse, HttpResponse } from
'@angular/common/http';
import { Observable, throwError, BehaviorSubject } from 'rxjs';
import { catchError, filter, take, switchMap, map, retryWhen, delay } from 'rxjs/operators';
import { AuthenticateService } from '../services/authenticate.service';
import { ErrordialogService } from '../@hrms/services/errordialog.service';
@Injectable()
export class TokenInterceptor implements HttpInterceptor {
private isRefreshing = false;
private refreshTokenSubject: BehaviorSubject<any> = new BehaviorSubject<any>(null);
constructor(
private _authService: AuthenticateService,
private _errorDialogService: ErrordialogService
) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let token: string = '';
/**
* Pass the parsed token
* If token present clone the request to add token to every requests
*/
if(this._authService.getTokens() !== null || this._authService.getTokens() !== undefined) {
let extractedToken = JSON.parse(this._authService.getTokens());
token = extractedToken;
}
if (token) {
request = this.addToken(request, token);
}
/**
* This is app specific
* Need to pass @Apiversion as header
*/
if (!request.headers.has('Api-version')) {
request = request.clone({ headers: request.headers.set('Api-version', '1') });
}
/**
* Return the Observable
*/
return next.handle(request).pipe(
map((event: HttpEvent<any>) => {
if(event instanceof HttpResponse) {
console.log('event---->>>', event);
}
return event;
}),
catchError((error: HttpErrorResponse) => {
console.log(error);
if(error.status === 401) {
this.handle401Error(request, next);
}
else if(error.status === 500 || error.statusText === 'Unknown Error') {
this.handleServerError(request, next, token);
}
else {
return throwError(error);
}
return throwError(error)
})
)
}
private addToken(request: HttpRequest<any>, token: string) {
return request.clone({ setHeaders: { 'Authorization': `Bearer ${token}` } });
}
private handleServerError = (request, next, token) => {
this._errorDialogService.showErrorDialog();
console.log(request);
return next.handle(request).pipe(retryWhen(errors => errors.pipe(delay(2000))))
}
private handle401Error(request: HttpRequest<any>, next: HttpHandler) {
// console.log("Handling 401");
}
}
As it can been seen, the function handleServerError is responsible for showing an error dialog(which it shows) and should retry the failed request as indicated the return statement.
What exactly, i am doing wrong, i could not identify. Help appreciated.