basant307/AI_Governance_Project
048
1import utils from '../utils.js';2import settle from '../core/settle.js';3import transitionalDefaults from '../defaults/transitional.js';4import AxiosError from '../core/AxiosError.js';5import CanceledError from '../cancel/CanceledError.js';6import parseProtocol from '../helpers/parseProtocol.js';7import platform from '../platform/index.js';8import AxiosHeaders from '../core/AxiosHeaders.js';9import { progressEventReducer } from '../helpers/progressEventReducer.js';10import resolveConfig from '../helpers/resolveConfig.js';11 12const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';13 14export default isXHRAdapterSupported &&15 function (config) {16 return new Promise(function dispatchXhrRequest(resolve, reject) {17 const _config = resolveConfig(config);18 let requestData = _config.data;19 const requestHeaders = AxiosHeaders.from(_config.headers).normalize();20 let { responseType, onUploadProgress, onDownloadProgress } = _config;21 let onCanceled;22 let uploadThrottled, downloadThrottled;23 let flushUpload, flushDownload;24 25 function done() {26 flushUpload && flushUpload(); // flush events27 flushDownload && flushDownload(); // flush events28 29 _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);30 31 _config.signal && _config.signal.removeEventListener('abort', onCanceled);32 }33 34 let request = new XMLHttpRequest();35 36 request.open(_config.method.toUpperCase(), _config.url, true);37 38 // Set the request timeout in MS39 request.timeout = _config.timeout;40 41 function onloadend() {42 if (!request) {43 return;44 }45 // Prepare the response46 const responseHeaders = AxiosHeaders.from(47 'getAllResponseHeaders' in request && request.getAllResponseHeaders()48 );49 const responseData =50 !responseType || responseType === 'text' || responseType === 'json'51 ? request.responseText52 : request.response;53 const response = {54 data: responseData,55 status: request.status,56 statusText: request.statusText,57 headers: responseHeaders,58 config,59 request,60 };61 62 settle(63 function _resolve(value) {64 resolve(value);65 done();66 },67 function _reject(err) {68 reject(err);69 done();70 },71 response72 );73 74 // Clean up request75 request = null;76 }77 78 if ('onloadend' in request) {79 // Use onloadend if available80 request.onloadend = onloadend;81 } else {82 // Listen for ready state to emulate onloadend83 request.onreadystatechange = function handleLoad() {84 if (!request || request.readyState !== 4) {85 return;86 }87 88 // The request errored out and we didn't get a response, this will be89 // handled by onerror instead90 // With one exception: request that using file: protocol, most browsers91 // will return status as 0 even though it's a successful request92 if (93 request.status === 0 &&94 !(request.responseURL && request.responseURL.indexOf('file:') === 0)95 ) {96 return;97 }98 // readystate handler is calling before onerror or ontimeout handlers,99 // so we should call onloadend on the next 'tick'100 setTimeout(onloadend);101 };102 }103 104 // Handle browser request cancellation (as opposed to a manual cancellation)105 request.onabort = function handleAbort() {106 if (!request) {107 return;108 }109 110 reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));111 112 // Clean up request113 request = null;114 };115 116 // Handle low level network errors117 request.onerror = function handleError(event) {118 // Browsers deliver a ProgressEvent in XHR onerror119 // (message may be empty; when present, surface it)120 // See https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/error_event121 const msg = event && event.message ? event.message : 'Network Error';122 const err = new AxiosError(msg, AxiosError.ERR_NETWORK, config, request);123 // attach the underlying event for consumers who want details124 err.event = event || null;125 reject(err);126 request = null;127 };128 129 // Handle timeout130 request.ontimeout = function handleTimeout() {131 let timeoutErrorMessage = _config.timeout132 ? 'timeout of ' + _config.timeout + 'ms exceeded'133 : 'timeout exceeded';134 const transitional = _config.transitional || transitionalDefaults;135 if (_config.timeoutErrorMessage) {136 timeoutErrorMessage = _config.timeoutErrorMessage;137 }138 reject(139 new AxiosError(140 timeoutErrorMessage,141 transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,142 config,143 request144 )145 );146 147 // Clean up request148 request = null;149 };150 151 // Remove Content-Type if data is undefined152 requestData === undefined && requestHeaders.setContentType(null);153 154 // Add headers to the request155 if ('setRequestHeader' in request) {156 utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {157 request.setRequestHeader(key, val);158 });159 }160 161 // Add withCredentials to request if needed162 if (!utils.isUndefined(_config.withCredentials)) {163 request.withCredentials = !!_config.withCredentials;164 }165 166 // Add responseType to request if needed167 if (responseType && responseType !== 'json') {168 request.responseType = _config.responseType;169 }170 171 // Handle progress if needed172 if (onDownloadProgress) {173 [downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true);174 request.addEventListener('progress', downloadThrottled);175 }176 177 // Not all browsers support upload events178 if (onUploadProgress && request.upload) {179 [uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress);180 181 request.upload.addEventListener('progress', uploadThrottled);182 183 request.upload.addEventListener('loadend', flushUpload);184 }185 186 if (_config.cancelToken || _config.signal) {187 // Handle cancellation188 // eslint-disable-next-line func-names189 onCanceled = (cancel) => {190 if (!request) {191 return;192 }193 reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);194 request.abort();195 request = null;196 };197 198 _config.cancelToken && _config.cancelToken.subscribe(onCanceled);199 if (_config.signal) {200 _config.signal.aborted201 ? onCanceled()202 : _config.signal.addEventListener('abort', onCanceled);203 }204 }205 206 const protocol = parseProtocol(_config.url);207 208 if (protocol && platform.protocols.indexOf(protocol) === -1) {209 reject(210 new AxiosError(211 'Unsupported protocol ' + protocol + ':',212 AxiosError.ERR_BAD_REQUEST,213 config214 )215 );216 return;217 }218 219 // Send the request220 request.send(requestData || null);221 });222 };223 