75 lines
2.3 KiB
JavaScript
75 lines
2.3 KiB
JavaScript
/**
|
|
* XMLHttp client (Browser).
|
|
*/
|
|
|
|
import Promise from '../../promise';
|
|
import {each, trim, isFunction} from '../../util';
|
|
|
|
export default function (request) {
|
|
return new Promise(resolve => {
|
|
|
|
var xhr = new XMLHttpRequest(), handler = (event) => {
|
|
|
|
var response = request.respondWith(
|
|
'response' in xhr ? xhr.response : xhr.responseText, {
|
|
status: xhr.status === 1223 ? 204 : xhr.status, // IE9 status bug
|
|
statusText: xhr.status === 1223 ? 'No Content' : trim(xhr.statusText)
|
|
});
|
|
|
|
each(trim(xhr.getAllResponseHeaders()).split('\n'), row => {
|
|
response.headers.append(row.slice(0, row.indexOf(':')), row.slice(row.indexOf(':') + 1));
|
|
});
|
|
|
|
resolve(response);
|
|
};
|
|
|
|
request.abort = () => xhr.abort();
|
|
|
|
xhr.open(request.method, request.getUrl(), true);
|
|
|
|
if (request.timeout) {
|
|
xhr.timeout = request.timeout;
|
|
}
|
|
|
|
if (request.responseType && 'responseType' in xhr) {
|
|
xhr.responseType = request.responseType;
|
|
}
|
|
|
|
if (request.withCredentials || request.credentials) {
|
|
xhr.withCredentials = true;
|
|
}
|
|
|
|
if (!request.crossOrigin) {
|
|
request.headers.set('X-Requested-With', 'XMLHttpRequest');
|
|
}
|
|
|
|
// deprecated use downloadProgress
|
|
if (isFunction(request.progress) && request.method === 'GET') {
|
|
xhr.addEventListener('progress', request.progress);
|
|
}
|
|
|
|
if (isFunction(request.downloadProgress)) {
|
|
xhr.addEventListener('progress', request.downloadProgress);
|
|
}
|
|
|
|
// deprecated use uploadProgress
|
|
if (isFunction(request.progress) && /^(POST|PUT)$/i.test(request.method)) {
|
|
xhr.upload.addEventListener('progress', request.progress);
|
|
}
|
|
|
|
if (isFunction(request.uploadProgress) && xhr.upload) {
|
|
xhr.upload.addEventListener('progress', request.uploadProgress);
|
|
}
|
|
|
|
request.headers.forEach((value, name) => {
|
|
xhr.setRequestHeader(name, value);
|
|
});
|
|
|
|
xhr.onload = handler;
|
|
xhr.onabort = handler;
|
|
xhr.onerror = handler;
|
|
xhr.ontimeout = handler;
|
|
xhr.send(request.getBody());
|
|
});
|
|
}
|