UNPKG

sussudio

Version:

An unofficial VS Code Internal API

69 lines (68 loc) 2.62 kB
/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { bufferToStream, VSBuffer } from "../../../common/buffer.mjs"; import { canceled } from "../../../common/errors.mjs"; import { OfflineError } from "../common/request.mjs"; export function request(options, token) { if (!navigator.onLine) { throw new OfflineError(); } if (options.proxyAuthorization) { options.headers = { ...(options.headers || {}), 'Proxy-Authorization': options.proxyAuthorization }; } const xhr = new XMLHttpRequest(); return new Promise((resolve, reject) => { xhr.open(options.type || 'GET', options.url || '', true, options.user, options.password); setRequestHeaders(xhr, options); xhr.responseType = 'arraybuffer'; xhr.onerror = e => reject(new Error(xhr.statusText && ('XHR failed: ' + xhr.statusText) || 'XHR failed')); xhr.onload = (e) => { resolve({ res: { statusCode: xhr.status, headers: getResponseHeaders(xhr) }, stream: bufferToStream(VSBuffer.wrap(new Uint8Array(xhr.response))) }); }; xhr.ontimeout = e => reject(new Error(`XHR timeout: ${options.timeout}ms`)); if (options.timeout) { xhr.timeout = options.timeout; } xhr.send(options.data); // cancel token.onCancellationRequested(() => { xhr.abort(); reject(canceled()); }); }); } function setRequestHeaders(xhr, options) { if (options.headers) { outer: for (const k in options.headers) { switch (k) { case 'User-Agent': case 'Accept-Encoding': case 'Content-Length': // unsafe headers continue outer; } xhr.setRequestHeader(k, options.headers[k]); } } } function getResponseHeaders(xhr) { const headers = Object.create(null); for (const line of xhr.getAllResponseHeaders().split(/\r\n|\n|\r/g)) { if (line) { const idx = line.indexOf(':'); headers[line.substr(0, idx).trim().toLowerCase()] = line.substr(idx + 1).trim(); } } return headers; }