-
Notifications
You must be signed in to change notification settings - Fork 19
/
base.js
92 lines (79 loc) · 2.87 KB
/
base.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { invenioConfig } from '@config';
import { goTo, replaceTo } from '@history';
import { AuthenticationRoutes, FrontSiteRoutes } from '@routes/urls';
import axios from 'axios';
const apiConfig = {
baseURL: invenioConfig.APP.REST_ENDPOINTS_BASE_URL,
withCredentials: true,
xsrfCookieName: 'csrftoken',
xsrfHeaderName: 'X_CSRFTOKEN',
};
const http = axios.create(apiConfig);
// List used to specify whether to redirect to route `/errors` & prevent a redundant error notifation
const HTTP_STATUS_CODES_WITH_ERROR_PAGE = [404, 410, 429, 500];
// The corresponding dedicated error page components exist in `@pages/frontsite/ErrorPafe`
const URLS_NOT_TO_REDIRECT_IF_UNAUTHORIZED = ['/me', '/me/loans'];
// CSRF possible errors
const CSRF_ERROR_REASON_NO_COOKIE = 'CSRF cookie';
const CSRF_ERROR_REASON_BAD_TOKEN = 'CSRF token';
const CSRF_ERROR_REASON_BAD_SIGNATURE = 'CSRF error';
const urlShouldRedirect = (url) => {
const urlPath = url.split('?', 1)[0];
const pathsNoRedirect = URLS_NOT_TO_REDIRECT_IF_UNAUTHORIZED.filter((val) =>
urlPath.endsWith(val)
);
const containsUrlNotRedirect = pathsNoRedirect.length > 0;
return !containsUrlNotRedirect;
};
const goToErrorPage = (errorResponse) => {
const state = {
errorCode: errorResponse.status,
};
if (errorResponse.data && errorResponse.data.error_id) {
state['errorId'] = errorResponse.data.error_id;
}
replaceTo(FrontSiteRoutes.errors, state);
};
const isCSRFError = (errorStatus, errorResponse) => {
const isBadRequest = errorStatus === 400;
const errorMessage = errorResponse.data && errorResponse.data.message;
if (isBadRequest && errorMessage) {
const isCSRFError =
errorMessage.includes(CSRF_ERROR_REASON_NO_COOKIE) ||
errorMessage.includes(CSRF_ERROR_REASON_BAD_TOKEN) ||
errorMessage.includes(CSRF_ERROR_REASON_BAD_SIGNATURE);
return isCSRFError;
}
return false;
};
const responseRejectInterceptor = (error) => {
const errorResponse = error.response;
if (errorResponse) {
const errorStatus = errorResponse.status;
const isUnauthorized = errorStatus === 401;
const originalRequest = error.config;
const requestURL = originalRequest.url;
if (isUnauthorized && urlShouldRedirect(requestURL)) {
goTo(`${AuthenticationRoutes.login}?sessionExpired`);
} else {
const alreadyRetried = originalRequest._retry;
if (isCSRFError(errorStatus, errorResponse) && !alreadyRetried) {
originalRequest._retry = true;
return http.request(originalRequest);
}
const hasDedicatedPage =
HTTP_STATUS_CODES_WITH_ERROR_PAGE.includes(errorStatus);
if (hasDedicatedPage) {
goToErrorPage(errorResponse);
}
}
}
return Promise.reject(error);
};
http.interceptors.response.use(undefined, responseRejectInterceptor);
export {
http,
apiConfig,
responseRejectInterceptor,
HTTP_STATUS_CODES_WITH_ERROR_PAGE,
};