1 | export default function(url, options) {
|
2 | options = options || {};
|
3 | return new Promise( (resolve, reject) => {
|
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,
|
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 | });
|
25 |
|
26 | request.open(options.method || 'get', url, true);
|
27 |
|
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 | });
|
34 | resolve(response());
|
35 | };
|
36 |
|
37 | request.onerror = reject;
|
38 |
|
39 | request.withCredentials = options.credentials=='include';
|
40 |
|
41 | for (const i in options.headers) {
|
42 | request.setRequestHeader(i, options.headers[i]);
|
43 | }
|
44 |
|
45 | request.send(options.body || null);
|
46 | });
|
47 | }
|