diff --git a/src/app/core/interceptors/error.interceptor.spec.ts b/src/app/core/interceptors/error.interceptor.spec.ts index 52185f9c6..17d5bbec3 100644 --- a/src/app/core/interceptors/error.interceptor.spec.ts +++ b/src/app/core/interceptors/error.interceptor.spec.ts @@ -2,7 +2,7 @@ import { MockProvider } from 'ng-mocks'; import { throwError } from 'rxjs'; -import { HttpContext, HttpErrorResponse, HttpRequest } from '@angular/common/http'; +import { HttpContext, HttpErrorResponse, HttpHeaders, HttpRequest } from '@angular/common/http'; import { runInInjectionContext } from '@angular/core'; import { TestBed } from '@angular/core/testing'; import { Router } from '@angular/router'; @@ -271,4 +271,25 @@ describe('errorInterceptor', () => { }); }); }); + + it('should not navigate for 403 errors when X-No-Auth-Redirect header is true', () => { + const error = new HttpErrorResponse({ + error: {}, + status: 403, + url: '/metadata/abcde/?format=google-dataset-json-ld', + headers: new HttpHeaders({ 'X-No-Auth-Redirect': 'true' }), + }); + const request = createRequest(); + + runInInjectionContext(TestBed, () => { + const result = errorInterceptor(request, createErrorHandler(error)); + result.subscribe({ + error: () => { + expect(router.navigate).not.toHaveBeenCalled(); + expect(loaderService.hide).toHaveBeenCalled(); + expect(toastService.showError).not.toHaveBeenCalled(); + }, + }); + }); + }); }); diff --git a/src/app/core/interceptors/error.interceptor.ts b/src/app/core/interceptors/error.interceptor.ts index df5a58c0d..99848cc4b 100644 --- a/src/app/core/interceptors/error.interceptor.ts +++ b/src/app/core/interceptors/error.interceptor.ts @@ -63,7 +63,8 @@ export const errorInterceptor: HttpInterceptorFn = (req, next) => { if (error.status === 403) { const requestAccessRegex = /\/v2\/nodes\/[^/]+\/requests\/?$/i; - if (error.url && requestAccessRegex.test(error.url)) { + + if (error.url && (requestAccessRegex.test(error.url) || req.headers.has('X-No-Auth-Redirect'))) { loaderService.hide(); return throwError(() => error); } diff --git a/src/app/shared/services/metadata-records.service.ts b/src/app/shared/services/metadata-records.service.ts index 64e31ef2c..f4926ef3c 100644 --- a/src/app/shared/services/metadata-records.service.ts +++ b/src/app/shared/services/metadata-records.service.ts @@ -1,6 +1,6 @@ import { Observable } from 'rxjs'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { inject, Injectable } from '@angular/core'; import { ENVIRONMENT } from '@core/provider/environment.provider'; @@ -23,6 +23,9 @@ export class MetadataRecordsService { } getMetadataRecord(osfid: string, format: MetadataRecordFormat): Observable { - return this.http.get(this.metadataRecordUrl(osfid, format), { responseType: 'text' }); + return this.http.get(this.metadataRecordUrl(osfid, format), { + responseType: 'text', + headers: new HttpHeaders({ 'X-No-Auth-Redirect': 'true' }), + }); } }