UNPKG

1.36 kBJavaScriptView Raw
1export 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, // 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 };
51 }
52 });
53}