export type RunnableEnvCfg = undefined | Record<string, string> | { mask?: string; env: Record<string, string> }[];
+export class ProxySettings {
+ proxy?: string = undefined;
+ strictSSL: boolean = true;
+}
+
export class Config {
readonly extensionId = "matklad.rust-analyzer";
get channel() { return this.get<UpdatesChannel>("updates.channel"); }
get askBeforeDownload() { return this.get<boolean>("updates.askBeforeDownload"); }
get traceExtension() { return this.get<boolean>("trace.extension"); }
- get httpProxy() {
- const httpProxy = vscode
+ get proxySettings(): ProxySettings {
+ const proxy = vscode
.workspace
.getConfiguration('http')
- .get<null | string>("proxy")!;
+ .get<null | string>("proxy")! || process.env["https_proxy"] || process.env["HTTPS_PROXY"];
+ const strictSSL = vscode.workspace.getConfiguration("http").get<boolean>("proxyStrictSSL") || true;
- return httpProxy || process.env["https_proxy"] || process.env["HTTPS_PROXY"];
- }
- get proxyStrictSSL(): boolean {
- return vscode.workspace.getConfiguration("http").get("proxyStrictSSL") || true;
+ return {
+ proxy: proxy,
+ strictSSL: strictSSL,
+ };
}
get inlayHints() {
}
const latestNightlyRelease = await downloadWithRetryDialog(state, async () => {
- return await fetchRelease("nightly", state.githubToken, config.httpProxy, config.proxyStrictSSL);
+ return await fetchRelease("nightly", state.githubToken, config.proxySettings);
}).catch(async (e) => {
log.error(e);
if (isInitialNightlyDownload) {
url: artifact.browser_download_url,
dest,
progressTitle: "Downloading rust-analyzer extension",
- httpProxy: config.httpProxy,
- proxyStrictSSL: config.proxyStrictSSL,
+ proxySettings: config.proxySettings,
});
});
const releaseTag = config.package.releaseTag;
const release = await downloadWithRetryDialog(state, async () => {
- return await fetchRelease(releaseTag, state.githubToken, config.httpProxy, config.proxyStrictSSL);
+ return await fetchRelease(releaseTag, state.githubToken, config.proxySettings);
});
const artifact = release.assets.find(artifact => artifact.name === `rust-analyzer-${platform}.gz`);
assert(!!artifact, `Bad release: ${JSON.stringify(release)}`);
progressTitle: "Downloading rust-analyzer server",
gunzip: true,
mode: 0o755,
- httpProxy: config.httpProxy,
- proxyStrictSSL: config.proxyStrictSSL,
+ proxySettings: config.proxySettings,
});
});
import { log, assert } from "./util";
import * as url from "url";
import * as https from "https";
+import { ProxySettings } from "./config";
const pipeline = util.promisify(stream.pipeline);
export async function fetchRelease(
releaseTag: string,
githubToken: string | null | undefined,
- httpProxy: string | null | undefined,
- proxyStrictSSL: boolean,
+ proxySettings: ProxySettings,
): Promise<GithubRelease> {
const apiEndpointPath = `/repos/${OWNER}/${REPO}/releases/tags/${releaseTag}`;
}
const response = await (() => {
- if (httpProxy) {
- log.debug(`Fetching release metadata via proxy: ${httpProxy}`);
+ if (proxySettings.proxy) {
+ log.debug(`Fetching release metadata via proxy: ${proxySettings.proxy}`);
}
- let options: any = {};
- if (proxyStrictSSL) {
+ const options: any = {};
+ if (proxySettings.strictSSL) {
options["rejectUnauthorized"] = false;
}
- const agent = makeHttpAgent(httpProxy, options);
+ const agent = makeHttpAgent(proxySettings.proxy, options);
return fetch(requestUrl, { headers: headers, agent: agent });
})();
dest: vscode.Uri;
mode?: number;
gunzip?: boolean;
- httpProxy?: string;
- proxyStrictSSL: boolean;
+ proxySettings: ProxySettings;
}
export async function download(opts: DownloadOpts) {
},
async (progress, _cancellationToken) => {
let lastPercentage = 0;
- await downloadFile(opts.url, tempFilePath, opts.mode, !!opts.gunzip, opts.httpProxy, opts.proxyStrictSSL, (readBytes, totalBytes) => {
+ await downloadFile(opts.url, tempFilePath, opts.mode, !!opts.gunzip, opts.proxySettings, (readBytes, totalBytes) => {
const newPercentage = Math.round((readBytes / totalBytes) * 100);
if (newPercentage !== lastPercentage) {
progress.report({
destFilePath: vscode.Uri,
mode: number | undefined,
gunzip: boolean,
- httpProxy: string | null | undefined,
- proxyStrictSSL: boolean,
+ proxySettings: ProxySettings,
onProgress: (readBytes: number, totalBytes: number) => void
): Promise<void> {
const urlString = url.toString();
const res = await (() => {
- if (httpProxy) {
- log.debug(`Downloading ${urlString} via proxy: ${httpProxy}`);
+ if (proxySettings.proxy) {
+ log.debug(`Downloading ${urlString} via proxy: ${proxySettings.proxy}`);
}
- let options: any = {};
- if (proxyStrictSSL) {
+ const options: any = {};
+ if (proxySettings.strictSSL) {
options["rejectUnauthorized"] = false;
}
- const agent = makeHttpAgent(httpProxy, options);
+ const agent = makeHttpAgent(proxySettings.proxy, options);
return fetch(urlString, { agent: agent });
})();