|
1 | 1 | export default function(url, options) {
|
2 | 2 | options = options || {};
|
3 | 3 | return new Promise( (resolve, reject) => {
|
4 |
| - let request = new XMLHttpRequest(); |
| 4 | + const request = new XMLHttpRequest(); |
| 5 | + const keys = []; |
| 6 | + const all = []; |
| 7 | + const headers = {}; |
| 8 | + |
| 9 | + const response = () => ({ |
| 10 | + ok: (request.status/100|0) == 2, // 200-299 |
| 11 | + statusText: request.statusText, |
| 12 | + status: request.status, |
| 13 | + url: request.responseURL, |
| 14 | + text: () => Promise.resolve(request.responseText), |
| 15 | + json: () => Promise.resolve(JSON.parse(request.responseText)), |
| 16 | + blob: () => Promise.resolve(new Blob([request.response])), |
| 17 | + clone: response, |
| 18 | + headers: { |
| 19 | + keys: () => keys, |
| 20 | + entries: () => all, |
| 21 | + get: n => headers[n.toLowerCase()], |
| 22 | + has: n => n.toLowerCase() in headers |
| 23 | + } |
| 24 | + }); |
5 | 25 |
|
6 | 26 | request.open(options.method || 'get', url, true);
|
7 | 27 |
|
8 |
| - for (let i in options.headers) { |
9 |
| - request.setRequestHeader(i, options.headers[i]); |
10 |
| - } |
11 |
| - |
12 |
| - request.withCredentials = options.credentials=='include'; |
13 |
| - |
14 | 28 | request.onload = () => {
|
| 29 | + request.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, (m, key, value) => { |
| 30 | + keys.push(key = key.toLowerCase()); |
| 31 | + all.push([key, value]); |
| 32 | + headers[key] = headers[key] ? `${headers[key]},${value}` : value; |
| 33 | + }); |
15 | 34 | resolve(response());
|
16 | 35 | };
|
17 | 36 |
|
18 | 37 | request.onerror = reject;
|
19 | 38 |
|
20 |
| - request.send(options.body || null); |
21 |
| - |
22 |
| - function response() { |
23 |
| - let keys = [], |
24 |
| - all = [], |
25 |
| - headers = {}, |
26 |
| - header; |
27 |
| - |
28 |
| - request.getAllResponseHeaders().replace(/^(.*?):[^\S\n]*([\s\S]*?)$/gm, (m, key, value) => { |
29 |
| - keys.push(key = key.toLowerCase()); |
30 |
| - all.push([key, value]); |
31 |
| - header = headers[key]; |
32 |
| - headers[key] = header ? `${header},${value}` : value; |
33 |
| - }); |
| 39 | + request.withCredentials = options.credentials=='include'; |
34 | 40 |
|
35 |
| - return { |
36 |
| - ok: (request.status/100|0) == 2, // 200-299 |
37 |
| - status: request.status, |
38 |
| - statusText: request.statusText, |
39 |
| - url: request.responseURL, |
40 |
| - clone: response, |
41 |
| - text: () => Promise.resolve(request.responseText), |
42 |
| - json: () => Promise.resolve(request.responseText).then(JSON.parse), |
43 |
| - blob: () => Promise.resolve(new Blob([request.response])), |
44 |
| - headers: { |
45 |
| - keys: () => keys, |
46 |
| - entries: () => all, |
47 |
| - get: n => headers[n.toLowerCase()], |
48 |
| - has: n => n.toLowerCase() in headers |
49 |
| - } |
50 |
| - }; |
| 41 | + for (const i in options.headers) { |
| 42 | + request.setRequestHeader(i, options.headers[i]); |
51 | 43 | }
|
| 44 | + |
| 45 | + request.send(options.body || null); |
52 | 46 | });
|
53 | 47 | }
|
0 commit comments