1 |
|
2 |
|
3 | import { HttpHeaders } from "./httpHeaders";
|
4 | import { RestError } from "./restError";
|
5 |
|
6 |
|
7 |
|
8 | var XhrHttpClient = (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 |
|
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 |
|
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 |
|
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 | }());
|
112 | export { XhrHttpClient };
|
113 | function addProgressListener(xhr, listener) {
|
114 | if (listener) {
|
115 | xhr.addEventListener("progress", function (rawEvent) {
|
116 | return listener({
|
117 | loadedBytes: rawEvent.loaded,
|
118 | });
|
119 | });
|
120 | }
|
121 | }
|
122 |
|
123 | export 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 | }
|
138 | function 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 |
|
\ | No newline at end of file |