1 | export default function(url, options) {
|
2 | options = options || {};
|
3 | return new Promise( (resolve, reject) => {
|
4 | let request = new XMLHttpRequest();
|
5 |
|
6 | request.open(options.method || 'get', url, true);
|
7 |
|
8 | for (let i in options.headers) {
|
9 | request.setRequestHeader(i, options.headers[i]);
|
10 | }
|
11 |
|
12 | request.withCredentials = options.credentials=='include';
|
13 |
|
14 | request.onload = () => {
|
15 | resolve(response());
|
16 | };
|
17 |
|
18 | request.onerror = reject;
|
19 |
|
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 | });
|
34 |
|
35 | return {
|
36 | ok: (request.status/100|0) == 2,
|
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 | };
|
51 | }
|
52 | });
|
53 | }
|