aboutsummaryrefslogtreecommitdiff
path: root/editors/code/src/net.ts
diff options
context:
space:
mode:
Diffstat (limited to 'editors/code/src/net.ts')
-rw-r--r--editors/code/src/net.ts25
1 files changed, 22 insertions, 3 deletions
diff --git a/editors/code/src/net.ts b/editors/code/src/net.ts
index d39dc1baf..07ebc615c 100644
--- a/editors/code/src/net.ts
+++ b/editors/code/src/net.ts
@@ -1,4 +1,6 @@
1import fetch from "node-fetch"; 1import fetch from "node-fetch";
2var HttpsProxyAgent = require('https-proxy-agent');
3
2import * as vscode from "vscode"; 4import * as vscode from "vscode";
3import * as stream from "stream"; 5import * as stream from "stream";
4import * as crypto from "crypto"; 6import * as crypto from "crypto";
@@ -17,6 +19,7 @@ const REPO = "rust-analyzer";
17export async function fetchRelease( 19export async function fetchRelease(
18 releaseTag: string, 20 releaseTag: string,
19 githubToken: string | null | undefined, 21 githubToken: string | null | undefined,
22 httpProxy: string | null | undefined,
20): Promise<GithubRelease> { 23): Promise<GithubRelease> {
21 24
22 const apiEndpointPath = `/repos/${OWNER}/${REPO}/releases/tags/${releaseTag}`; 25 const apiEndpointPath = `/repos/${OWNER}/${REPO}/releases/tags/${releaseTag}`;
@@ -30,7 +33,14 @@ export async function fetchRelease(
30 headers.Authorization = "token " + githubToken; 33 headers.Authorization = "token " + githubToken;
31 } 34 }
32 35
33 const response = await fetch(requestUrl, { headers: headers }); 36 const response = await (() => {
37 if (httpProxy) {
38 log.debug(`Fetching release metadata via proxy: ${httpProxy}`);
39 return fetch(requestUrl, { headers: headers, agent: new HttpsProxyAgent(httpProxy) });
40 }
41
42 return fetch(requestUrl, { headers: headers });
43 })();
34 44
35 if (!response.ok) { 45 if (!response.ok) {
36 log.error("Error fetching artifact release info", { 46 log.error("Error fetching artifact release info", {
@@ -73,6 +83,7 @@ interface DownloadOpts {
73 dest: string; 83 dest: string;
74 mode?: number; 84 mode?: number;
75 gunzip?: boolean; 85 gunzip?: boolean;
86 httpProxy?: string;
76} 87}
77 88
78export async function download(opts: DownloadOpts) { 89export async function download(opts: DownloadOpts) {
@@ -91,7 +102,7 @@ export async function download(opts: DownloadOpts) {
91 }, 102 },
92 async (progress, _cancellationToken) => { 103 async (progress, _cancellationToken) => {
93 let lastPercentage = 0; 104 let lastPercentage = 0;
94 await downloadFile(opts.url, tempFile, opts.mode, !!opts.gunzip, (readBytes, totalBytes) => { 105 await downloadFile(opts.url, tempFile, opts.mode, !!opts.gunzip, opts.httpProxy, (readBytes, totalBytes) => {
95 const newPercentage = Math.round((readBytes / totalBytes) * 100); 106 const newPercentage = Math.round((readBytes / totalBytes) * 100);
96 if (newPercentage !== lastPercentage) { 107 if (newPercentage !== lastPercentage) {
97 progress.report({ 108 progress.report({
@@ -113,9 +124,17 @@ async function downloadFile(
113 destFilePath: fs.PathLike, 124 destFilePath: fs.PathLike,
114 mode: number | undefined, 125 mode: number | undefined,
115 gunzip: boolean, 126 gunzip: boolean,
127 httpProxy: string | null | undefined,
116 onProgress: (readBytes: number, totalBytes: number) => void 128 onProgress: (readBytes: number, totalBytes: number) => void
117): Promise<void> { 129): Promise<void> {
118 const res = await fetch(url); 130 const res = await (() => {
131 if (httpProxy) {
132 log.debug(`Downloading ${url} via proxy: ${httpProxy}`);
133 return fetch(url, { agent: new HttpsProxyAgent(httpProxy) });
134 }
135
136 return fetch(url);
137 })();
119 138
120 if (!res.ok) { 139 if (!res.ok) {
121 log.error("Error", res.status, "while downloading file from", url); 140 log.error("Error", res.status, "while downloading file from", url);