105 lines
3.8 KiB
JavaScript
105 lines
3.8 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
var response_1 = require("./response");
|
|
var index_1 = require("./plugins/index");
|
|
function createTransport(options) {
|
|
return {
|
|
use: use,
|
|
abort: abort,
|
|
open: function (request) {
|
|
return handle(request, options);
|
|
}
|
|
};
|
|
}
|
|
exports.createTransport = createTransport;
|
|
var use = [index_1.stringify(), index_1.headers()];
|
|
function handle(request, options) {
|
|
return new Promise(function (resolve, reject) {
|
|
var type = options.type || 'text';
|
|
var url = request.url, method = request.method;
|
|
if (window.location.protocol === 'https:' && /^http\:/.test(url)) {
|
|
return reject(request.error("The request to \"" + url + "\" was blocked", 'EBLOCKED'));
|
|
}
|
|
var xhr = request._raw = new XMLHttpRequest();
|
|
function done() {
|
|
return new Promise(function (resolve) {
|
|
return resolve(new response_1.Response({
|
|
status: xhr.status === 1223 ? 204 : xhr.status,
|
|
statusText: xhr.statusText,
|
|
rawHeaders: parseToRawHeaders(xhr.getAllResponseHeaders()),
|
|
body: type === 'text' ? xhr.responseText : xhr.response,
|
|
url: xhr.responseURL
|
|
}));
|
|
});
|
|
}
|
|
xhr.onload = function () { return resolve(done()); };
|
|
xhr.onabort = function () { return resolve(done()); };
|
|
xhr.onerror = function () {
|
|
return reject(request.error("Unable to connect to \"" + request.url + "\"", 'EUNAVAILABLE'));
|
|
};
|
|
xhr.onprogress = function (e) {
|
|
if (e.lengthComputable) {
|
|
request.downloadLength = e.total;
|
|
}
|
|
request._setDownloadedBytes(e.loaded);
|
|
};
|
|
xhr.upload.onloadend = function () { return request.downloaded = 1; };
|
|
if (method === 'GET' || method === 'HEAD' || !xhr.upload) {
|
|
request.uploadLength = 0;
|
|
request._setUploadedBytes(0, 1);
|
|
}
|
|
else {
|
|
xhr.upload.onprogress = function (e) {
|
|
if (e.lengthComputable) {
|
|
request.uploadLength = e.total;
|
|
}
|
|
request._setUploadedBytes(e.loaded);
|
|
};
|
|
xhr.upload.onloadend = function () { return request.uploaded = 1; };
|
|
}
|
|
try {
|
|
xhr.open(method, url);
|
|
}
|
|
catch (e) {
|
|
return reject(request.error("Refused to connect to \"" + url + "\"", 'ECSP', e));
|
|
}
|
|
if (options.withCredentials) {
|
|
xhr.withCredentials = true;
|
|
}
|
|
if (options.overrideMimeType) {
|
|
xhr.overrideMimeType(options.overrideMimeType);
|
|
}
|
|
if (type !== 'text') {
|
|
try {
|
|
xhr.responseType = type;
|
|
}
|
|
finally {
|
|
if (xhr.responseType !== type) {
|
|
return reject(request.error("Unsupported type: " + type, 'ETYPE'));
|
|
}
|
|
}
|
|
}
|
|
for (var i = 0; i < request.rawHeaders.length; i += 2) {
|
|
xhr.setRequestHeader(request.rawHeaders[i], request.rawHeaders[i + 1]);
|
|
}
|
|
xhr.send(request.body);
|
|
});
|
|
}
|
|
function abort(request) {
|
|
request._raw.abort();
|
|
}
|
|
function parseToRawHeaders(headers) {
|
|
var rawHeaders = [];
|
|
var lines = headers.split(/\r?\n/);
|
|
for (var _i = 0, lines_1 = lines; _i < lines_1.length; _i++) {
|
|
var line = lines_1[_i];
|
|
if (line) {
|
|
var indexOf = line.indexOf(':');
|
|
var name_1 = line.substr(0, indexOf).trim();
|
|
var value = line.substr(indexOf + 1).trim();
|
|
rawHeaders.push(name_1, value);
|
|
}
|
|
}
|
|
return rawHeaders;
|
|
}
|
|
//# sourceMappingURL=browser.js.map
|