| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- // 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.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
|