Skip to content

Commit 32ff11b

Browse files
authored
Merge pull request #5333 from DSpace/backport-5323-to-dspace-8_x
[Port dspace-8_x] fix(locale): prevent recursive EPerson language lookup for specific endpoint requests
2 parents ffe303f + 6116e2b commit 32ff11b

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

src/app/core/locale/locale.interceptor.spec.ts

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ describe(`LocaleInterceptor`, () => {
1818
let localeService: any;
1919

2020
const languageList = ['en;q=1', 'it;q=0.9', 'de;q=0.8', 'fr;q=0.7'];
21+
const rootHref = 'https://sandbox.dspace.org/server/api';
2122

22-
const mockLocaleService = jasmine.createSpyObj('LocaleService', {
23-
getCurrentLanguageCode: jasmine.createSpy('getCurrentLanguageCode'),
24-
getLanguageCodeList: of(languageList),
25-
});
23+
const mockLocaleService = jasmine.createSpyObj('LocaleService', [
24+
'getCurrentLanguageCode',
25+
'getLanguageCodeList',
26+
]);
2627

2728
const mockHalEndpointService = {
2829
getRootHref: jasmine.createSpy('getRootHref'),
@@ -48,6 +49,8 @@ describe(`LocaleInterceptor`, () => {
4849
localeService = TestBed.inject(LocaleService);
4950

5051
localeService.getCurrentLanguageCode.and.returnValue(of('en'));
52+
localeService.getLanguageCodeList.and.returnValue(of(languageList));
53+
mockHalEndpointService.getRootHref.and.returnValue(rootHref);
5154
});
5255

5356
describe('', () => {
@@ -76,6 +79,29 @@ describe(`LocaleInterceptor`, () => {
7679
const lang = httpRequest.request.headers.get('Accept-Language');
7780
expect(lang).toBeDefined();
7881
expect(lang).toBe(languageList.toString());
82+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(false);
83+
});
84+
85+
it('should ignore EPerson settings for root endpoint requests', () => {
86+
service.request(RestRequestMethod.GET, rootHref).subscribe((response) => {
87+
expect(response).toBeTruthy();
88+
});
89+
90+
httpMock.expectOne(rootHref);
91+
92+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(true);
93+
});
94+
95+
it('should ignore EPerson settings for eperson endpoint requests', () => {
96+
const epersonHref = `${rootHref}/eperson/epersons/1234`;
97+
98+
service.request(RestRequestMethod.GET, epersonHref).subscribe((response) => {
99+
expect(response).toBeTruthy();
100+
});
101+
102+
httpMock.expectOne(epersonHref);
103+
104+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(true);
79105
});
80106

81107
});

src/app/core/locale/locale.interceptor.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ export class LocaleInterceptor implements HttpInterceptor {
3131
*/
3232
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
3333
let newReq: HttpRequest<any>;
34-
return this.localeService.getLanguageCodeList(req.url === this.halEndpointService.getRootHref())
34+
const ignoreEPersonSettings: boolean = this.shouldIgnoreEPersonSettings(req.url);
35+
36+
return this.localeService.getLanguageCodeList(ignoreEPersonSettings)
3537
.pipe(
3638
take(1),
3739
scan((acc: any, value: any) => [...acc, value], []),
@@ -45,4 +47,12 @@ export class LocaleInterceptor implements HttpInterceptor {
4547
return next.handle(newReq);
4648
}));
4749
}
50+
51+
/**
52+
* Avoid recursive EPerson language lookup for requests that are needed to resolve EPerson itself.
53+
*/
54+
private shouldIgnoreEPersonSettings(url: string): boolean {
55+
const rootHref = this.halEndpointService.getRootHref();
56+
return url === rootHref || url.startsWith(`${rootHref}/eperson/epersons`);
57+
}
4858
}

0 commit comments

Comments
 (0)