@osimatic/helpers-js 1.1.77 → 1.1.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +76 -76
- package/array.js +93 -90
- package/bank.js +20 -20
- package/contact_details.js +194 -194
- package/count_down.js +102 -102
- package/data_table.js +416 -416
- package/date_time.js +592 -592
- package/details_sub_array.js +123 -123
- package/draw.js +52 -52
- package/duration.js +198 -198
- package/event_bus.js +38 -38
- package/file.js +146 -146
- package/flash_message.js +35 -35
- package/form_date.js +610 -610
- package/form_helper.js +410 -410
- package/google_charts.js +347 -347
- package/google_maps.js +169 -169
- package/google_recaptcha.js +87 -87
- package/http_client.js +469 -469
- package/import_from_csv.js +273 -273
- package/index.js +55 -55
- package/jwt.js +288 -288
- package/list_box.js +112 -112
- package/location.js +431 -431
- package/media.js +218 -218
- package/multiple_action_in_table.js +336 -336
- package/network.js +756 -756
- package/number.js +99 -99
- package/open_street_map.js +142 -142
- package/package.json +15 -15
- package/paging.js +278 -278
- package/php.min.js +5 -5
- package/revolut.js +22 -22
- package/select_all.js +121 -121
- package/shopping_cart.js +31 -31
- package/social_network.js +109 -109
- package/sortable_list.js +37 -37
- package/string.js +162 -162
- package/util.js +16 -16
- package/visitor.js +77 -77
- package/web_rtc.js +114 -114
- package/web_socket.js +97 -97
package/http_client.js
CHANGED
|
@@ -1,470 +1,470 @@
|
|
|
1
|
-
|
|
2
|
-
class HTTPClient {
|
|
3
|
-
static setAuthorizationToken(authorizationToken) {
|
|
4
|
-
HTTPClient.authorizationToken = authorizationToken;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
// URL appelée pour rafraichir le token. Le token est mis à jour dans JwtSession. En cas de succès, on appelle HTTPClient.onSuccessRefreshTokenCallback et on réexécute toutes les requêtes HTTP en attente de nouveau token. En cas d'échec, on redirige vers HTTPClient.onInvalidRefreshTokenRedirectUrl et/ou on appelle HTTPClient.onInvalidRefreshTokenCallback.
|
|
8
|
-
static setRefreshTokenUrl(url) {
|
|
9
|
-
HTTPClient.refreshTokenUrl = url;
|
|
10
|
-
}
|
|
11
|
-
// Callback appelé pour remplacer l'appel à HTTPClient.refreshTokenUrl (et donc pas de gestion de la session avec JwtSession)
|
|
12
|
-
static setRefreshTokenCallback(callback) {
|
|
13
|
-
HTTPClient.refreshTokenCallback = callback;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
static setOnSuccessRefreshTokenCallback(callback) {
|
|
17
|
-
HTTPClient.onSuccessRefreshTokenCallback = callback;
|
|
18
|
-
}
|
|
19
|
-
static setOnInvalidRefreshTokenCallback(callback) {
|
|
20
|
-
HTTPClient.onInvalidRefreshTokenCallback = callback;
|
|
21
|
-
}
|
|
22
|
-
static setOnInvalidRefreshTokenRedirectUrl(url) {
|
|
23
|
-
HTTPClient.onInvalidRefreshTokenRedirectUrl = url;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// URL de la page vers laquelle on redirige si le token est invalide apres destruction de la JwtSession.
|
|
27
|
-
static setOnInvalidTokenRedirectUrl(url) {
|
|
28
|
-
HTTPClient.onInvalidTokenRedirectUrl = url;
|
|
29
|
-
}
|
|
30
|
-
// Callback appelé lorsqu'un token est invalide (destruction de la JwtSession dans tous les cas).
|
|
31
|
-
static setOnInvalidTokenCallback(callback) {
|
|
32
|
-
HTTPClient.onInvalidTokenCallback = callback;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
static getHeaders(asObject=false, additionalHeaders={}, addAuthorizationHeader=true) {
|
|
36
|
-
let httpHeadersData = {};
|
|
37
|
-
|
|
38
|
-
if (typeof HTTPClient.headers != 'undefined' && null != HTTPClient.headers) {
|
|
39
|
-
HTTPClient.headers['Authorization'] = null;
|
|
40
|
-
httpHeadersData = HTTPClient.headers;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
if (addAuthorizationHeader) {
|
|
44
|
-
const authorizationToken = typeof HTTPClient.authorizationToken != 'undefined' && null != HTTPClient.authorizationToken ? HTTPClient.authorizationToken : JwtSession.getToken();
|
|
45
|
-
if (null != authorizationToken && '' !== authorizationToken) {
|
|
46
|
-
httpHeadersData['Authorization'] = 'Bearer ' + authorizationToken;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (null != additionalHeaders && typeof additionalHeaders == 'object') {
|
|
51
|
-
for (const [key, value] of Object.entries(additionalHeaders)) {
|
|
52
|
-
httpHeadersData[key] = value;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
if (asObject) {
|
|
57
|
-
return httpHeadersData;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
let httpHeaders = new Headers();
|
|
61
|
-
Object.entries(httpHeadersData).forEach(([key, value]) => {
|
|
62
|
-
httpHeaders.append(key, value);
|
|
63
|
-
});
|
|
64
|
-
return httpHeaders;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
static getHeader(key) {
|
|
68
|
-
if (typeof HTTPClient.headers == 'undefined') {
|
|
69
|
-
HTTPClient.headers = {};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
return HTTPClient.headers[key];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
static setHeader(key, value) {
|
|
76
|
-
if (typeof HTTPClient.headers == 'undefined') {
|
|
77
|
-
HTTPClient.headers = {};
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
HTTPClient.headers[key] = value;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
static convertObjectToFormData(obj) {
|
|
84
|
-
// 30/05/2022 : ancienne version, qui ne fonctionne pas avec des tableaux
|
|
85
|
-
// let formData = new FormData();
|
|
86
|
-
// Object.entries(data).forEach(([key, value]) => formData.append(key, value));
|
|
87
|
-
// return formData;
|
|
88
|
-
|
|
89
|
-
let formData = new FormData();
|
|
90
|
-
|
|
91
|
-
function appendFormData(data, root) {
|
|
92
|
-
//console.log('appendFormData', data, root);
|
|
93
|
-
root = root || '';
|
|
94
|
-
if (data instanceof File) {
|
|
95
|
-
formData.append(root, data);
|
|
96
|
-
}
|
|
97
|
-
else if (Array.isArray(data)) {
|
|
98
|
-
for (let i = 0; i < data.length; i++) {
|
|
99
|
-
appendFormData(data[i], root + '[' + i + ']');
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
else if (typeof data === 'object' && data) {
|
|
103
|
-
for (let key in data) {
|
|
104
|
-
if (data.hasOwnProperty(key)) {
|
|
105
|
-
if (root === '') {
|
|
106
|
-
appendFormData(data[key], key);
|
|
107
|
-
} else {
|
|
108
|
-
appendFormData(data[key], root + '.' + key);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
if (data !== null && typeof data !== 'undefined') {
|
|
115
|
-
formData.append(root, data);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
appendFormData(obj);
|
|
121
|
-
|
|
122
|
-
return formData;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
static formatQueryString(data) {
|
|
126
|
-
if (data == null) {
|
|
127
|
-
return '';
|
|
128
|
-
}
|
|
129
|
-
if (typeof data == 'object') {
|
|
130
|
-
data = UrlAndQueryString.buildQuery(data);
|
|
131
|
-
}
|
|
132
|
-
if (data !== '' && data.substring(0, 1) !== '&') {
|
|
133
|
-
data = '&' + data;
|
|
134
|
-
}
|
|
135
|
-
return data;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
static formatFormData(data) {
|
|
139
|
-
if (!(data instanceof FormData)) {
|
|
140
|
-
return HTTPClient.convertObjectToFormData(data);
|
|
141
|
-
}
|
|
142
|
-
return data;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
static formatJsonData(data) {
|
|
146
|
-
if (typeof data == 'string') {
|
|
147
|
-
return data;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
let formData = HTTPClient.formatFormData(data);
|
|
151
|
-
|
|
152
|
-
let object = {};
|
|
153
|
-
formData.forEach((value, key) => object[key] = value);
|
|
154
|
-
return JSON.stringify(object);
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
static logRequestFailure(response, json) {
|
|
158
|
-
if (null == response) {
|
|
159
|
-
console.error('Request failure : network error.');
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
console.error('Request failure. Status: '+response.statusText+' ; HTTP Code : '+response.status, json);
|
|
163
|
-
}
|
|
164
|
-
static logJqueryRequestFailure(jqxhr, status, errorThrown) {
|
|
165
|
-
console.error('Request failure. Status: ' + status + ' ; HTTP Code: ' + jqxhr.status + (null != errorThrown && '' !== errorThrown ? ' ; Error message: ' + errorThrown : ''), jqxhr.responseJSON);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
static isExpiredToken(response, json) {
|
|
169
|
-
if (response.status !== 401) {
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
return (
|
|
174
|
-
response.statusText === 'Expired JWT Token'
|
|
175
|
-
|| (typeof json['message'] != 'undefined' && json['message'] === 'Expired JWT Token')
|
|
176
|
-
|| (typeof json['error'] != 'undefined' && json['error'] === 'expired_token')
|
|
177
|
-
|| (json === 'expired_token')
|
|
178
|
-
);
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
static isInvalidToken(response, json) {
|
|
182
|
-
if (response.status !== 401) {
|
|
183
|
-
return false;
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return (
|
|
187
|
-
response.statusText === 'Invalid JWT Token'
|
|
188
|
-
|| (typeof json['message'] != 'undefined' && json['message'] === 'Invalid JWT Token')
|
|
189
|
-
|| (typeof json['error'] != 'undefined' && json['error'] === 'invalid_token')
|
|
190
|
-
|| (typeof json['error'] != 'undefined' && json['error'] === 'authentification_failure')
|
|
191
|
-
|| (json === 'invalid_token')
|
|
192
|
-
|| (json === 'authentification_failure')
|
|
193
|
-
);
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
static onInvalidToken() {
|
|
197
|
-
JwtSession.logout(HTTPClient.onInvalidTokenRedirectUrl, HTTPClient.onInvalidTokenCallback);
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
static async request(method, url, data, successCallback=null, errorCallback=null, formErrorCallback=null, additionalHeaders={}, sendAuthorizationHeader=true) {
|
|
201
|
-
if (!window.fetch) {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
let body = null;
|
|
206
|
-
method = method.toUpperCase();
|
|
207
|
-
|
|
208
|
-
let headers = HTTPClient.getHeaders(false, additionalHeaders, sendAuthorizationHeader);
|
|
209
|
-
|
|
210
|
-
if ('PATCH' === method || 'DELETE' === method) {
|
|
211
|
-
headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
|
212
|
-
// 30/01/2023 : ajout encodeURIComponent() sinon les valeurs contenant des "+" pose pb (signe "+" retiré)
|
|
213
|
-
body = encodeURIComponent(new URLSearchParams(HTTPClient.formatFormData(data)).toString());
|
|
214
|
-
}
|
|
215
|
-
else if ('POST' === method) {
|
|
216
|
-
if (headers.get('Content-Type') === 'application/json') {
|
|
217
|
-
body = HTTPClient.formatJsonData(data);
|
|
218
|
-
}
|
|
219
|
-
else {
|
|
220
|
-
body = HTTPClient.formatFormData(data);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
else {
|
|
224
|
-
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
225
|
-
data = null;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
let response = null;
|
|
229
|
-
let jsonData = {};
|
|
230
|
-
try {
|
|
231
|
-
const requestOptions = {
|
|
232
|
-
method: method,
|
|
233
|
-
headers: headers,
|
|
234
|
-
body: body,
|
|
235
|
-
mode: 'cors',
|
|
236
|
-
cache: 'no-cache'
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
// On met le fetch dans un try catch pour détecter les erreurs de connexion réseau (si pas de connexion, une exception est déclenchée par fetch)
|
|
240
|
-
response = await fetch(url, requestOptions);
|
|
241
|
-
|
|
242
|
-
if (response.status !== 204 && response.statusText !== 'No Content') {
|
|
243
|
-
jsonData = await response.json();
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (HTTPClient.isExpiredToken(response, jsonData)) {
|
|
247
|
-
HTTPClient.refreshToken(() => HTTPClient.request(method, url, data, successCallback, errorCallback, formErrorCallback, additionalHeaders), errorCallback);
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
if (HTTPClient.isInvalidToken(response, jsonData)) {
|
|
252
|
-
HTTPClient.onInvalidToken();
|
|
253
|
-
return;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
if (response.ok) {
|
|
257
|
-
if (typeof successCallback == 'function') {
|
|
258
|
-
successCallback(jsonData, response);
|
|
259
|
-
}
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
if (response.status === 400 && typeof formErrorCallback == 'function') {
|
|
264
|
-
formErrorCallback(jsonData, response);
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
catch (e) {
|
|
269
|
-
console.error(e);
|
|
270
|
-
if (typeof errorCallback == 'function') {
|
|
271
|
-
errorCallback(response);
|
|
272
|
-
}
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
HTTPClient.logRequestFailure(response, jsonData);
|
|
277
|
-
if (typeof errorCallback == 'function') {
|
|
278
|
-
errorCallback(response, jsonData);
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
static download(method, url, data, errorCallback=null, completeCallback=null, additionalHeaders={}) {
|
|
283
|
-
HTTPClient.requestBlob(method, url, data,
|
|
284
|
-
(blobData, response) => File.download(blobData, response.headers.get('content-type'), response.headers.get('content-disposition')),
|
|
285
|
-
errorCallback,
|
|
286
|
-
completeCallback,
|
|
287
|
-
additionalHeaders
|
|
288
|
-
);
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
static async requestBlob(method, url, data, successCallback=null, errorCallback=null, completeCallback=null, additionalHeaders={}) {
|
|
292
|
-
if (!window.fetch) {
|
|
293
|
-
return;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
let body = null;
|
|
297
|
-
method = method.toUpperCase();
|
|
298
|
-
|
|
299
|
-
let headers = HTTPClient.getHeaders(false, additionalHeaders);
|
|
300
|
-
if ('PATCH' === method || 'DELETE' === method) {
|
|
301
|
-
headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
|
302
|
-
body = encodeURIComponent(new URLSearchParams(HTTPClient.formatFormData(data)).toString());
|
|
303
|
-
}
|
|
304
|
-
else if ('POST' === method) {
|
|
305
|
-
if (headers.get('Content-Type') === 'application/json') {
|
|
306
|
-
body = HTTPClient.formatJsonData(data);
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
body = HTTPClient.formatFormData(data);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
else {
|
|
313
|
-
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
314
|
-
data = null;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
let response = null;
|
|
318
|
-
try {
|
|
319
|
-
const requestOptions = {
|
|
320
|
-
method: method,
|
|
321
|
-
headers: headers,
|
|
322
|
-
body: body,
|
|
323
|
-
mode: 'cors',
|
|
324
|
-
cache: 'no-cache'
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// On met le fetch dans un try catch pour détecter les erreurs de connexion réseau (si pas de connexion, une exception est déclenchée par fetch)
|
|
328
|
-
response = await fetch(url, requestOptions);
|
|
329
|
-
|
|
330
|
-
if (response.status === 401 && response.statusText === 'Expired JWT Token') {
|
|
331
|
-
HTTPClient.refreshToken(() => HTTPClient.requestBlob(method, url, data, successCallback, errorCallback, completeCallback, additionalHeaders), errorCallback);
|
|
332
|
-
return;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
if (response.status === 401 && response.statusText === 'Invalid JWT Token') {
|
|
336
|
-
HTTPClient.onInvalidToken();
|
|
337
|
-
return;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
if (response.ok) {
|
|
341
|
-
const blobData = await response.blob();
|
|
342
|
-
if (typeof successCallback == 'function') {
|
|
343
|
-
successCallback(blobData, response);
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
let json = null;
|
|
348
|
-
if (response.headers.get('Content-Type') === 'application/json') {
|
|
349
|
-
json = await response.json();
|
|
350
|
-
}
|
|
351
|
-
HTTPClient.logRequestFailure(response, json);
|
|
352
|
-
if (typeof errorCallback == 'function') {
|
|
353
|
-
errorCallback(response, json);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
catch (e) {
|
|
358
|
-
console.error(e);
|
|
359
|
-
if (typeof errorCallback == 'function') {
|
|
360
|
-
errorCallback(response);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
if (typeof completeCallback == 'function') {
|
|
364
|
-
completeCallback(response);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
static refreshToken(completeCallback, errorCallback=null) {
|
|
369
|
-
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished == 'undefined') {
|
|
370
|
-
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished = [];
|
|
371
|
-
}
|
|
372
|
-
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.push(completeCallback);
|
|
373
|
-
//HTTPClient.addCompleteCallbackAfterRefreshTokenFinished(completeCallback);
|
|
374
|
-
|
|
375
|
-
// S'il y a déjà un appel à refresh token effectué, on le refait pas (le completeCallback est dans une liste de callback à exécuter apres la fin du refresh token)
|
|
376
|
-
if (typeof HTTPClient.refreshTokenStarted != 'undefined' && HTTPClient.refreshTokenStarted) {
|
|
377
|
-
return;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
function onRefreshTokenComplete() {
|
|
381
|
-
HTTPClient.refreshTokenStarted = false;
|
|
382
|
-
|
|
383
|
-
// On exécute les completeCallback qui était en attente de la requete refresh token
|
|
384
|
-
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished != 'undefined') {
|
|
385
|
-
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.forEach(callback => typeof callback == 'function' ? callback() : null);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
HTTPClient.refreshTokenStarted = true;
|
|
390
|
-
|
|
391
|
-
if (typeof HTTPClient.refreshTokenCallback == 'function') {
|
|
392
|
-
console.log('HTTPClient.refreshToken : Appel callback HTTPClient.refreshTokenCallback');
|
|
393
|
-
HTTPClient.refreshTokenCallback(onRefreshTokenComplete);
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
if (typeof HTTPClient.refreshTokenUrl == 'undefined') {
|
|
398
|
-
console.error('URL refresh token non définie. Appeler HTTPClient.setRefreshTokenUrl(url)');
|
|
399
|
-
return;
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
console.log('HTTPClient.refreshToken : Appel HTTP vers HTTPClient.refreshTokenUrl');
|
|
403
|
-
let payload = new FormData();
|
|
404
|
-
payload.append('refresh_token', JwtSession.getRefreshToken());
|
|
405
|
-
|
|
406
|
-
HTTPClient.request('POST', HTTPClient.refreshTokenUrl, payload,
|
|
407
|
-
(data) => {
|
|
408
|
-
JwtSession.updateToken(data['token'], data['refresh_token'], HTTPClient.onSuccessRefreshTokenCallback);
|
|
409
|
-
HTTPClient.setAuthorizationToken(JwtSession.getToken());
|
|
410
|
-
onRefreshTokenComplete();
|
|
411
|
-
},
|
|
412
|
-
() => {
|
|
413
|
-
JwtSession.expireSession(HTTPClient.onInvalidRefreshTokenRedirectUrl, HTTPClient.onInvalidRefreshTokenCallback);
|
|
414
|
-
if (typeof errorCallback == 'function') {
|
|
415
|
-
errorCallback();
|
|
416
|
-
}
|
|
417
|
-
},
|
|
418
|
-
null,
|
|
419
|
-
null,
|
|
420
|
-
false
|
|
421
|
-
);
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
static sendRequest(url, strParam, methode, formatRetour, callback) {
|
|
425
|
-
let xhr = null;
|
|
426
|
-
|
|
427
|
-
if (window.XMLHttpRequest || window.ActiveXObject) {
|
|
428
|
-
if (window.ActiveXObject) {
|
|
429
|
-
try {
|
|
430
|
-
xhr = new ActiveXObject('Msxml2.XMLHTTP');
|
|
431
|
-
} catch (e) {
|
|
432
|
-
xhr = new ActiveXObject('Microsoft.XMLHTTP');
|
|
433
|
-
}
|
|
434
|
-
} else {
|
|
435
|
-
xhr = new XMLHttpRequest();
|
|
436
|
-
}
|
|
437
|
-
} else {
|
|
438
|
-
// Votre navigateur ne supporte pas l'objet XMLHTTPRequest!
|
|
439
|
-
return null;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
xhr.onreadystatechange = function () {
|
|
443
|
-
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
|
|
444
|
-
let data;
|
|
445
|
-
if (formatRetour === 'xml') {
|
|
446
|
-
data = xhr.responseXML;
|
|
447
|
-
}
|
|
448
|
-
else {
|
|
449
|
-
data = eval('(' + xhr.responseText + ')');
|
|
450
|
-
}
|
|
451
|
-
callback(data);
|
|
452
|
-
}
|
|
453
|
-
};
|
|
454
|
-
|
|
455
|
-
if (methode === 'POST') {
|
|
456
|
-
xhr.open('POST', url, true);
|
|
457
|
-
xhr.send();
|
|
458
|
-
}
|
|
459
|
-
else {
|
|
460
|
-
xhr.open('GET', url + '?' + strParam, true);
|
|
461
|
-
xhr.send(null);
|
|
462
|
-
}
|
|
463
|
-
return false;
|
|
464
|
-
}
|
|
465
|
-
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
require('whatwg-fetch'); //fetch polyfill loaded in window.fetch
|
|
469
|
-
|
|
1
|
+
|
|
2
|
+
class HTTPClient {
|
|
3
|
+
static setAuthorizationToken(authorizationToken) {
|
|
4
|
+
HTTPClient.authorizationToken = authorizationToken;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// URL appelée pour rafraichir le token. Le token est mis à jour dans JwtSession. En cas de succès, on appelle HTTPClient.onSuccessRefreshTokenCallback et on réexécute toutes les requêtes HTTP en attente de nouveau token. En cas d'échec, on redirige vers HTTPClient.onInvalidRefreshTokenRedirectUrl et/ou on appelle HTTPClient.onInvalidRefreshTokenCallback.
|
|
8
|
+
static setRefreshTokenUrl(url) {
|
|
9
|
+
HTTPClient.refreshTokenUrl = url;
|
|
10
|
+
}
|
|
11
|
+
// Callback appelé pour remplacer l'appel à HTTPClient.refreshTokenUrl (et donc pas de gestion de la session avec JwtSession)
|
|
12
|
+
static setRefreshTokenCallback(callback) {
|
|
13
|
+
HTTPClient.refreshTokenCallback = callback;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static setOnSuccessRefreshTokenCallback(callback) {
|
|
17
|
+
HTTPClient.onSuccessRefreshTokenCallback = callback;
|
|
18
|
+
}
|
|
19
|
+
static setOnInvalidRefreshTokenCallback(callback) {
|
|
20
|
+
HTTPClient.onInvalidRefreshTokenCallback = callback;
|
|
21
|
+
}
|
|
22
|
+
static setOnInvalidRefreshTokenRedirectUrl(url) {
|
|
23
|
+
HTTPClient.onInvalidRefreshTokenRedirectUrl = url;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// URL de la page vers laquelle on redirige si le token est invalide apres destruction de la JwtSession.
|
|
27
|
+
static setOnInvalidTokenRedirectUrl(url) {
|
|
28
|
+
HTTPClient.onInvalidTokenRedirectUrl = url;
|
|
29
|
+
}
|
|
30
|
+
// Callback appelé lorsqu'un token est invalide (destruction de la JwtSession dans tous les cas).
|
|
31
|
+
static setOnInvalidTokenCallback(callback) {
|
|
32
|
+
HTTPClient.onInvalidTokenCallback = callback;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static getHeaders(asObject=false, additionalHeaders={}, addAuthorizationHeader=true) {
|
|
36
|
+
let httpHeadersData = {};
|
|
37
|
+
|
|
38
|
+
if (typeof HTTPClient.headers != 'undefined' && null != HTTPClient.headers) {
|
|
39
|
+
HTTPClient.headers['Authorization'] = null;
|
|
40
|
+
httpHeadersData = HTTPClient.headers;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if (addAuthorizationHeader) {
|
|
44
|
+
const authorizationToken = typeof HTTPClient.authorizationToken != 'undefined' && null != HTTPClient.authorizationToken ? HTTPClient.authorizationToken : JwtSession.getToken();
|
|
45
|
+
if (null != authorizationToken && '' !== authorizationToken) {
|
|
46
|
+
httpHeadersData['Authorization'] = 'Bearer ' + authorizationToken;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (null != additionalHeaders && typeof additionalHeaders == 'object') {
|
|
51
|
+
for (const [key, value] of Object.entries(additionalHeaders)) {
|
|
52
|
+
httpHeadersData[key] = value;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (asObject) {
|
|
57
|
+
return httpHeadersData;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
let httpHeaders = new Headers();
|
|
61
|
+
Object.entries(httpHeadersData).forEach(([key, value]) => {
|
|
62
|
+
httpHeaders.append(key, value);
|
|
63
|
+
});
|
|
64
|
+
return httpHeaders;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static getHeader(key) {
|
|
68
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
69
|
+
HTTPClient.headers = {};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return HTTPClient.headers[key];
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
static setHeader(key, value) {
|
|
76
|
+
if (typeof HTTPClient.headers == 'undefined') {
|
|
77
|
+
HTTPClient.headers = {};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
HTTPClient.headers[key] = value;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
static convertObjectToFormData(obj) {
|
|
84
|
+
// 30/05/2022 : ancienne version, qui ne fonctionne pas avec des tableaux
|
|
85
|
+
// let formData = new FormData();
|
|
86
|
+
// Object.entries(data).forEach(([key, value]) => formData.append(key, value));
|
|
87
|
+
// return formData;
|
|
88
|
+
|
|
89
|
+
let formData = new FormData();
|
|
90
|
+
|
|
91
|
+
function appendFormData(data, root) {
|
|
92
|
+
//console.log('appendFormData', data, root);
|
|
93
|
+
root = root || '';
|
|
94
|
+
if (data instanceof File) {
|
|
95
|
+
formData.append(root, data);
|
|
96
|
+
}
|
|
97
|
+
else if (Array.isArray(data)) {
|
|
98
|
+
for (let i = 0; i < data.length; i++) {
|
|
99
|
+
appendFormData(data[i], root + '[' + i + ']');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (typeof data === 'object' && data) {
|
|
103
|
+
for (let key in data) {
|
|
104
|
+
if (data.hasOwnProperty(key)) {
|
|
105
|
+
if (root === '') {
|
|
106
|
+
appendFormData(data[key], key);
|
|
107
|
+
} else {
|
|
108
|
+
appendFormData(data[key], root + '.' + key);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
if (data !== null && typeof data !== 'undefined') {
|
|
115
|
+
formData.append(root, data);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
appendFormData(obj);
|
|
121
|
+
|
|
122
|
+
return formData;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
static formatQueryString(data) {
|
|
126
|
+
if (data == null) {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
if (typeof data == 'object') {
|
|
130
|
+
data = UrlAndQueryString.buildQuery(data);
|
|
131
|
+
}
|
|
132
|
+
if (data !== '' && data.substring(0, 1) !== '&') {
|
|
133
|
+
data = '&' + data;
|
|
134
|
+
}
|
|
135
|
+
return data;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
static formatFormData(data) {
|
|
139
|
+
if (!(data instanceof FormData)) {
|
|
140
|
+
return HTTPClient.convertObjectToFormData(data);
|
|
141
|
+
}
|
|
142
|
+
return data;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
static formatJsonData(data) {
|
|
146
|
+
if (typeof data == 'string') {
|
|
147
|
+
return data;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
let formData = HTTPClient.formatFormData(data);
|
|
151
|
+
|
|
152
|
+
let object = {};
|
|
153
|
+
formData.forEach((value, key) => object[key] = value);
|
|
154
|
+
return JSON.stringify(object);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
static logRequestFailure(response, json) {
|
|
158
|
+
if (null == response) {
|
|
159
|
+
console.error('Request failure : network error.');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
console.error('Request failure. Status: '+response.statusText+' ; HTTP Code : '+response.status, json);
|
|
163
|
+
}
|
|
164
|
+
static logJqueryRequestFailure(jqxhr, status, errorThrown) {
|
|
165
|
+
console.error('Request failure. Status: ' + status + ' ; HTTP Code: ' + jqxhr.status + (null != errorThrown && '' !== errorThrown ? ' ; Error message: ' + errorThrown : ''), jqxhr.responseJSON);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
static isExpiredToken(response, json) {
|
|
169
|
+
if (response.status !== 401) {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return (
|
|
174
|
+
response.statusText === 'Expired JWT Token'
|
|
175
|
+
|| (typeof json['message'] != 'undefined' && json['message'] === 'Expired JWT Token')
|
|
176
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'expired_token')
|
|
177
|
+
|| (json === 'expired_token')
|
|
178
|
+
);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
static isInvalidToken(response, json) {
|
|
182
|
+
if (response.status !== 401) {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
return (
|
|
187
|
+
response.statusText === 'Invalid JWT Token'
|
|
188
|
+
|| (typeof json['message'] != 'undefined' && json['message'] === 'Invalid JWT Token')
|
|
189
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'invalid_token')
|
|
190
|
+
|| (typeof json['error'] != 'undefined' && json['error'] === 'authentification_failure')
|
|
191
|
+
|| (json === 'invalid_token')
|
|
192
|
+
|| (json === 'authentification_failure')
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
static onInvalidToken() {
|
|
197
|
+
JwtSession.logout(HTTPClient.onInvalidTokenRedirectUrl, HTTPClient.onInvalidTokenCallback);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
static async request(method, url, data, successCallback=null, errorCallback=null, formErrorCallback=null, additionalHeaders={}, sendAuthorizationHeader=true) {
|
|
201
|
+
if (!window.fetch) {
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
let body = null;
|
|
206
|
+
method = method.toUpperCase();
|
|
207
|
+
|
|
208
|
+
let headers = HTTPClient.getHeaders(false, additionalHeaders, sendAuthorizationHeader);
|
|
209
|
+
|
|
210
|
+
if ('PATCH' === method || 'DELETE' === method) {
|
|
211
|
+
headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
|
212
|
+
// 30/01/2023 : ajout encodeURIComponent() sinon les valeurs contenant des "+" pose pb (signe "+" retiré)
|
|
213
|
+
body = encodeURIComponent(new URLSearchParams(HTTPClient.formatFormData(data)).toString());
|
|
214
|
+
}
|
|
215
|
+
else if ('POST' === method) {
|
|
216
|
+
if (headers.get('Content-Type') === 'application/json') {
|
|
217
|
+
body = HTTPClient.formatJsonData(data);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
body = HTTPClient.formatFormData(data);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
225
|
+
data = null;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
let response = null;
|
|
229
|
+
let jsonData = {};
|
|
230
|
+
try {
|
|
231
|
+
const requestOptions = {
|
|
232
|
+
method: method,
|
|
233
|
+
headers: headers,
|
|
234
|
+
body: body,
|
|
235
|
+
mode: 'cors',
|
|
236
|
+
cache: 'no-cache'
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// On met le fetch dans un try catch pour détecter les erreurs de connexion réseau (si pas de connexion, une exception est déclenchée par fetch)
|
|
240
|
+
response = await fetch(url, requestOptions);
|
|
241
|
+
|
|
242
|
+
if (response.status !== 204 && response.statusText !== 'No Content') {
|
|
243
|
+
jsonData = await response.json();
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (HTTPClient.isExpiredToken(response, jsonData)) {
|
|
247
|
+
HTTPClient.refreshToken(() => HTTPClient.request(method, url, data, successCallback, errorCallback, formErrorCallback, additionalHeaders), errorCallback);
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (HTTPClient.isInvalidToken(response, jsonData)) {
|
|
252
|
+
HTTPClient.onInvalidToken();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (response.ok) {
|
|
257
|
+
if (typeof successCallback == 'function') {
|
|
258
|
+
successCallback(jsonData, response);
|
|
259
|
+
}
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
if (response.status === 400 && typeof formErrorCallback == 'function') {
|
|
264
|
+
formErrorCallback(jsonData, response);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
catch (e) {
|
|
269
|
+
console.error(e);
|
|
270
|
+
if (typeof errorCallback == 'function') {
|
|
271
|
+
errorCallback(response);
|
|
272
|
+
}
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
HTTPClient.logRequestFailure(response, jsonData);
|
|
277
|
+
if (typeof errorCallback == 'function') {
|
|
278
|
+
errorCallback(response, jsonData);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
static download(method, url, data, errorCallback=null, completeCallback=null, additionalHeaders={}) {
|
|
283
|
+
HTTPClient.requestBlob(method, url, data,
|
|
284
|
+
(blobData, response) => File.download(blobData, response.headers.get('content-type'), response.headers.get('content-disposition')),
|
|
285
|
+
errorCallback,
|
|
286
|
+
completeCallback,
|
|
287
|
+
additionalHeaders
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
static async requestBlob(method, url, data, successCallback=null, errorCallback=null, completeCallback=null, additionalHeaders={}) {
|
|
292
|
+
if (!window.fetch) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
let body = null;
|
|
297
|
+
method = method.toUpperCase();
|
|
298
|
+
|
|
299
|
+
let headers = HTTPClient.getHeaders(false, additionalHeaders);
|
|
300
|
+
if ('PATCH' === method || 'DELETE' === method) {
|
|
301
|
+
headers.append('Content-Type', 'application/x-www-form-urlencoded');
|
|
302
|
+
body = encodeURIComponent(new URLSearchParams(HTTPClient.formatFormData(data)).toString());
|
|
303
|
+
}
|
|
304
|
+
else if ('POST' === method) {
|
|
305
|
+
if (headers.get('Content-Type') === 'application/json') {
|
|
306
|
+
body = HTTPClient.formatJsonData(data);
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
body = HTTPClient.formatFormData(data);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
url += (!url.includes('?') ? '?' : '') + HTTPClient.formatQueryString(data);
|
|
314
|
+
data = null;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
let response = null;
|
|
318
|
+
try {
|
|
319
|
+
const requestOptions = {
|
|
320
|
+
method: method,
|
|
321
|
+
headers: headers,
|
|
322
|
+
body: body,
|
|
323
|
+
mode: 'cors',
|
|
324
|
+
cache: 'no-cache'
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// On met le fetch dans un try catch pour détecter les erreurs de connexion réseau (si pas de connexion, une exception est déclenchée par fetch)
|
|
328
|
+
response = await fetch(url, requestOptions);
|
|
329
|
+
|
|
330
|
+
if (response.status === 401 && response.statusText === 'Expired JWT Token') {
|
|
331
|
+
HTTPClient.refreshToken(() => HTTPClient.requestBlob(method, url, data, successCallback, errorCallback, completeCallback, additionalHeaders), errorCallback);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (response.status === 401 && response.statusText === 'Invalid JWT Token') {
|
|
336
|
+
HTTPClient.onInvalidToken();
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
if (response.ok) {
|
|
341
|
+
const blobData = await response.blob();
|
|
342
|
+
if (typeof successCallback == 'function') {
|
|
343
|
+
successCallback(blobData, response);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
let json = null;
|
|
348
|
+
if (response.headers.get('Content-Type') === 'application/json') {
|
|
349
|
+
json = await response.json();
|
|
350
|
+
}
|
|
351
|
+
HTTPClient.logRequestFailure(response, json);
|
|
352
|
+
if (typeof errorCallback == 'function') {
|
|
353
|
+
errorCallback(response, json);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
catch (e) {
|
|
358
|
+
console.error(e);
|
|
359
|
+
if (typeof errorCallback == 'function') {
|
|
360
|
+
errorCallback(response);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
if (typeof completeCallback == 'function') {
|
|
364
|
+
completeCallback(response);
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
static refreshToken(completeCallback, errorCallback=null) {
|
|
369
|
+
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished == 'undefined') {
|
|
370
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished = [];
|
|
371
|
+
}
|
|
372
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.push(completeCallback);
|
|
373
|
+
//HTTPClient.addCompleteCallbackAfterRefreshTokenFinished(completeCallback);
|
|
374
|
+
|
|
375
|
+
// S'il y a déjà un appel à refresh token effectué, on le refait pas (le completeCallback est dans une liste de callback à exécuter apres la fin du refresh token)
|
|
376
|
+
if (typeof HTTPClient.refreshTokenStarted != 'undefined' && HTTPClient.refreshTokenStarted) {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function onRefreshTokenComplete() {
|
|
381
|
+
HTTPClient.refreshTokenStarted = false;
|
|
382
|
+
|
|
383
|
+
// On exécute les completeCallback qui était en attente de la requete refresh token
|
|
384
|
+
if (typeof HTTPClient.listCompleteCallbackAfterRefreshTokenFinished != 'undefined') {
|
|
385
|
+
HTTPClient.listCompleteCallbackAfterRefreshTokenFinished.forEach(callback => typeof callback == 'function' ? callback() : null);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
HTTPClient.refreshTokenStarted = true;
|
|
390
|
+
|
|
391
|
+
if (typeof HTTPClient.refreshTokenCallback == 'function') {
|
|
392
|
+
console.log('HTTPClient.refreshToken : Appel callback HTTPClient.refreshTokenCallback');
|
|
393
|
+
HTTPClient.refreshTokenCallback(onRefreshTokenComplete);
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (typeof HTTPClient.refreshTokenUrl == 'undefined') {
|
|
398
|
+
console.error('URL refresh token non définie. Appeler HTTPClient.setRefreshTokenUrl(url)');
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
console.log('HTTPClient.refreshToken : Appel HTTP vers HTTPClient.refreshTokenUrl');
|
|
403
|
+
let payload = new FormData();
|
|
404
|
+
payload.append('refresh_token', JwtSession.getRefreshToken());
|
|
405
|
+
|
|
406
|
+
HTTPClient.request('POST', HTTPClient.refreshTokenUrl, payload,
|
|
407
|
+
(data) => {
|
|
408
|
+
JwtSession.updateToken(data['token'], data['refresh_token'], HTTPClient.onSuccessRefreshTokenCallback);
|
|
409
|
+
HTTPClient.setAuthorizationToken(JwtSession.getToken());
|
|
410
|
+
onRefreshTokenComplete();
|
|
411
|
+
},
|
|
412
|
+
() => {
|
|
413
|
+
JwtSession.expireSession(HTTPClient.onInvalidRefreshTokenRedirectUrl, HTTPClient.onInvalidRefreshTokenCallback);
|
|
414
|
+
if (typeof errorCallback == 'function') {
|
|
415
|
+
errorCallback();
|
|
416
|
+
}
|
|
417
|
+
},
|
|
418
|
+
null,
|
|
419
|
+
null,
|
|
420
|
+
false
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
static sendRequest(url, strParam, methode, formatRetour, callback) {
|
|
425
|
+
let xhr = null;
|
|
426
|
+
|
|
427
|
+
if (window.XMLHttpRequest || window.ActiveXObject) {
|
|
428
|
+
if (window.ActiveXObject) {
|
|
429
|
+
try {
|
|
430
|
+
xhr = new ActiveXObject('Msxml2.XMLHTTP');
|
|
431
|
+
} catch (e) {
|
|
432
|
+
xhr = new ActiveXObject('Microsoft.XMLHTTP');
|
|
433
|
+
}
|
|
434
|
+
} else {
|
|
435
|
+
xhr = new XMLHttpRequest();
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
// Votre navigateur ne supporte pas l'objet XMLHTTPRequest!
|
|
439
|
+
return null;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
xhr.onreadystatechange = function () {
|
|
443
|
+
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)) {
|
|
444
|
+
let data;
|
|
445
|
+
if (formatRetour === 'xml') {
|
|
446
|
+
data = xhr.responseXML;
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
449
|
+
data = eval('(' + xhr.responseText + ')');
|
|
450
|
+
}
|
|
451
|
+
callback(data);
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
|
|
455
|
+
if (methode === 'POST') {
|
|
456
|
+
xhr.open('POST', url, true);
|
|
457
|
+
xhr.send();
|
|
458
|
+
}
|
|
459
|
+
else {
|
|
460
|
+
xhr.open('GET', url + '?' + strParam, true);
|
|
461
|
+
xhr.send(null);
|
|
462
|
+
}
|
|
463
|
+
return false;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
require('whatwg-fetch'); //fetch polyfill loaded in window.fetch
|
|
469
|
+
|
|
470
470
|
module.exports = { HTTPClient };
|