2022-07-12 09:00:22 +02:00

149 lines
6.2 KiB
JavaScript

// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
import { HttpHeaders } from "./httpHeaders";
import { RestError } from "./restError";
/**
* A HttpClient implementation that uses XMLHttpRequest to send HTTP requests.
*/
var XhrHttpClient = /** @class */ (function () {
function XhrHttpClient() {
}
XhrHttpClient.prototype.sendRequest = function (request) {
var xhr = new XMLHttpRequest();
if (request.agentSettings) {
throw new Error("HTTP agent settings not supported in browser environment");
}
if (request.proxySettings) {
throw new Error("HTTP proxy is not supported in browser environment");
}
var abortSignal = request.abortSignal;
if (abortSignal) {
var listener_1 = function () {
xhr.abort();
};
abortSignal.addEventListener("abort", listener_1);
xhr.addEventListener("readystatechange", function () {
if (xhr.readyState === XMLHttpRequest.DONE) {
abortSignal.removeEventListener("abort", listener_1);
}
});
}
addProgressListener(xhr.upload, request.onUploadProgress);
addProgressListener(xhr, request.onDownloadProgress);
if (request.formData) {
var formData = request.formData;
var requestForm_1 = new FormData();
var appendFormValue = function (key, value) {
if (value && value.hasOwnProperty("value") && value.hasOwnProperty("options")) {
requestForm_1.append(key, value.value, value.options);
}
else {
requestForm_1.append(key, value);
}
};
for (var _i = 0, _a = Object.keys(formData); _i < _a.length; _i++) {
var formKey = _a[_i];
var formValue = formData[formKey];
if (Array.isArray(formValue)) {
for (var j = 0; j < formValue.length; j++) {
appendFormValue(formKey, formValue[j]);
}
}
else {
appendFormValue(formKey, formValue);
}
}
request.body = requestForm_1;
request.formData = undefined;
var contentType = request.headers.get("Content-Type");
if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
// browser will automatically apply a suitable content-type header
request.headers.remove("Content-Type");
}
}
xhr.open(request.method, request.url);
xhr.timeout = request.timeout;
xhr.withCredentials = request.withCredentials;
for (var _b = 0, _c = request.headers.headersArray(); _b < _c.length; _b++) {
var header = _c[_b];
xhr.setRequestHeader(header.name, header.value);
}
xhr.responseType = request.streamResponseBody ? "blob" : "text";
// tslint:disable-next-line:no-null-keyword
xhr.send(request.body === undefined ? null : request.body);
if (request.streamResponseBody) {
return new Promise(function (resolve, reject) {
xhr.addEventListener("readystatechange", function () {
// Resolve as soon as headers are loaded
if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
var blobBody = new Promise(function (resolve, reject) {
xhr.addEventListener("load", function () {
resolve(xhr.response);
});
rejectOnTerminalEvent(request, xhr, reject);
});
resolve({
request: request,
status: xhr.status,
headers: parseHeaders(xhr),
blobBody: blobBody,
});
}
});
rejectOnTerminalEvent(request, xhr, reject);
});
}
else {
return new Promise(function (resolve, reject) {
xhr.addEventListener("load", function () {
return resolve({
request: request,
status: xhr.status,
headers: parseHeaders(xhr),
bodyAsText: xhr.responseText,
});
});
rejectOnTerminalEvent(request, xhr, reject);
});
}
};
return XhrHttpClient;
}());
export { XhrHttpClient };
function addProgressListener(xhr, listener) {
if (listener) {
xhr.addEventListener("progress", function (rawEvent) {
return listener({
loadedBytes: rawEvent.loaded,
});
});
}
}
// exported locally for testing
export function parseHeaders(xhr) {
var responseHeaders = new HttpHeaders();
var headerLines = xhr
.getAllResponseHeaders()
.trim()
.split(/[\r\n]+/);
for (var _i = 0, headerLines_1 = headerLines; _i < headerLines_1.length; _i++) {
var line = headerLines_1[_i];
var index = line.indexOf(":");
var headerName = line.slice(0, index);
var headerValue = line.slice(index + 2);
responseHeaders.set(headerName, headerValue);
}
return responseHeaders;
}
function rejectOnTerminalEvent(request, xhr, reject) {
xhr.addEventListener("error", function () {
return reject(new RestError("Failed to send request to " + request.url, RestError.REQUEST_SEND_ERROR, undefined, request));
});
xhr.addEventListener("abort", function () {
return reject(new RestError("The request was aborted", RestError.REQUEST_ABORTED_ERROR, undefined, request));
});
xhr.addEventListener("timeout", function () {
return reject(new RestError("timeout of " + xhr.timeout + "ms exceeded", RestError.REQUEST_SEND_ERROR, undefined, request));
});
}
//# sourceMappingURL=xhrHttpClient.js.map