Skip to content

Commit efaf437

Browse files
authored
Merge pull request DSpace#5323 from pcg-kk/5085/end-user-agreement-stalls-on-submit
fix(locale): prevent recursive EPerson language lookup for specific endpoint requests
2 parents 3d3615a + 2211cea commit efaf437

2 files changed

Lines changed: 41 additions & 5 deletions

File tree

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

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

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

26-
const mockLocaleService = jasmine.createSpyObj('LocaleService', {
27-
getCurrentLanguageCode: jasmine.createSpy('getCurrentLanguageCode'),
28-
getLanguageCodeList: of(languageList),
29-
});
27+
const mockLocaleService = jasmine.createSpyObj('LocaleService', [
28+
'getCurrentLanguageCode',
29+
'getLanguageCodeList',
30+
]);
3031

3132
const mockHalEndpointService = {
3233
getRootHref: jasmine.createSpy('getRootHref'),
@@ -54,6 +55,8 @@ describe(`LocaleInterceptor`, () => {
5455
localeService = TestBed.inject(LocaleService);
5556

5657
localeService.getCurrentLanguageCode.and.returnValue(of('en'));
58+
localeService.getLanguageCodeList.and.returnValue(of(languageList));
59+
mockHalEndpointService.getRootHref.and.returnValue(rootHref);
5760
});
5861

5962
describe('', () => {
@@ -82,6 +85,29 @@ describe(`LocaleInterceptor`, () => {
8285
const lang = httpRequest.request.headers.get('Accept-Language');
8386
expect(lang).toBeDefined();
8487
expect(lang).toBe(languageList.toString());
88+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(false);
89+
});
90+
91+
it('should ignore EPerson settings for root endpoint requests', () => {
92+
service.request(RestRequestMethod.GET, rootHref).subscribe((response) => {
93+
expect(response).toBeTruthy();
94+
});
95+
96+
httpMock.expectOne(rootHref);
97+
98+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(true);
99+
});
100+
101+
it('should ignore EPerson settings for eperson endpoint requests', () => {
102+
const epersonHref = `${rootHref}/eperson/epersons/1234`;
103+
104+
service.request(RestRequestMethod.GET, epersonHref).subscribe((response) => {
105+
expect(response).toBeTruthy();
106+
});
107+
108+
httpMock.expectOne(epersonHref);
109+
110+
expect(localeService.getLanguageCodeList).toHaveBeenCalledWith(true);
85111
});
86112

87113
});

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)