UNPKG

6.34 kBJavaScriptView Raw
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the MIT License. See License.txt in the project root for license information.
3import { HttpHeaders } from "./httpHeaders";
4import { RestError } from "./restError";
5/**
6 * A HttpClient implementation that uses XMLHttpRequest to send HTTP requests.
7 */
8var XhrHttpClient = /** @class */ (function () {
9 function XhrHttpClient() {
10 }
11 XhrHttpClient.prototype.sendRequest = function (request) {
12 var xhr = new XMLHttpRequest();
13 if (request.agentSettings) {
14 throw new Error("HTTP agent settings not supported in browser environment");
15 }
16 if (request.proxySettings) {
17 throw new Error("HTTP proxy is not supported in browser environment");
18 }
19 var abortSignal = request.abortSignal;
20 if (abortSignal) {
21 var listener_1 = function () {
22 xhr.abort();
23 };
24 abortSignal.addEventListener("abort", listener_1);
25 xhr.addEventListener("readystatechange", function () {
26 if (xhr.readyState === XMLHttpRequest.DONE) {
27 abortSignal.removeEventListener("abort", listener_1);
28 }
29 });
30 }
31 addProgressListener(xhr.upload, request.onUploadProgress);
32 addProgressListener(xhr, request.onDownloadProgress);
33 if (request.formData) {
34 var formData = request.formData;
35 var requestForm_1 = new FormData();
36 var appendFormValue = function (key, value) {
37 if (value && value.hasOwnProperty("value") && value.hasOwnProperty("options")) {
38 requestForm_1.append(key, value.value, value.options);
39 }
40 else {
41 requestForm_1.append(key, value);
42 }
43 };
44 for (var _i = 0, _a = Object.keys(formData); _i < _a.length; _i++) {
45 var formKey = _a[_i];
46 var formValue = formData[formKey];
47 if (Array.isArray(formValue)) {
48 for (var j = 0; j < formValue.length; j++) {
49 appendFormValue(formKey, formValue[j]);
50 }
51 }
52 else {
53 appendFormValue(formKey, formValue);
54 }
55 }
56 request.body = requestForm_1;
57 request.formData = undefined;
58 var contentType = request.headers.get("Content-Type");
59 if (contentType && contentType.indexOf("multipart/form-data") !== -1) {
60 // browser will automatically apply a suitable content-type header
61 request.headers.remove("Content-Type");
62 }
63 }
64 xhr.open(request.method, request.url);
65 xhr.timeout = request.timeout;
66 xhr.withCredentials = request.withCredentials;
67 for (var _b = 0, _c = request.headers.headersArray(); _b < _c.length; _b++) {
68 var header = _c[_b];
69 xhr.setRequestHeader(header.name, header.value);
70 }
71 xhr.responseType = request.streamResponseBody ? "blob" : "text";
72 // tslint:disable-next-line:no-null-keyword
73 xhr.send(request.body === undefined ? null : request.body);
74 if (request.streamResponseBody) {
75 return new Promise(function (resolve, reject) {
76 xhr.addEventListener("readystatechange", function () {
77 // Resolve as soon as headers are loaded
78 if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {
79 var blobBody = new Promise(function (resolve, reject) {
80 xhr.addEventListener("load", function () {
81 resolve(xhr.response);
82 });
83 rejectOnTerminalEvent(request, xhr, reject);
84 });
85 resolve({
86 request: request,
87 status: xhr.status,
88 headers: parseHeaders(xhr),
89 blobBody: blobBody,
90 });
91 }
92 });
93 rejectOnTerminalEvent(request, xhr, reject);
94 });
95 }
96 else {
97 return new Promise(function (resolve, reject) {
98 xhr.addEventListener("load", function () {
99 return resolve({
100 request: request,
101 status: xhr.status,
102 headers: parseHeaders(xhr),
103 bodyAsText: xhr.responseText,
104 });
105 });
106 rejectOnTerminalEvent(request, xhr, reject);
107 });
108 }
109 };
110 return XhrHttpClient;
111}());
112export { XhrHttpClient };
113function addProgressListener(xhr, listener) {
114 if (listener) {
115 xhr.addEventListener("progress", function (rawEvent) {
116 return listener({
117 loadedBytes: rawEvent.loaded,
118 });
119 });
120 }
121}
122// exported locally for testing
123export function parseHeaders(xhr) {
124 var responseHeaders = new HttpHeaders();
125 var headerLines = xhr
126 .getAllResponseHeaders()
127 .trim()
128 .split(/[\r\n]+/);
129 for (var _i = 0, headerLines_1 = headerLines; _i < headerLines_1.length; _i++) {
130 var line = headerLines_1[_i];
131 var index = line.indexOf(":");
132 var headerName = line.slice(0, index);
133 var headerValue = line.slice(index + 2);
134 responseHeaders.set(headerName, headerValue);
135 }
136 return responseHeaders;
137}
138function rejectOnTerminalEvent(request, xhr, reject) {
139 xhr.addEventListener("error", function () {
140 return reject(new RestError("Failed to send request to " + request.url, RestError.REQUEST_SEND_ERROR, undefined, request));
141 });
142 xhr.addEventListener("abort", function () {
143 return reject(new RestError("The request was aborted", RestError.REQUEST_ABORTED_ERROR, undefined, request));
144 });
145 xhr.addEventListener("timeout", function () {
146 return reject(new RestError("timeout of " + xhr.timeout + "ms exceeded", RestError.REQUEST_SEND_ERROR, undefined, request));
147 });
148}
149//# sourceMappingURL=xhrHttpClient.js.map
\No newline at end of file