Skip to content

Commit 1e10847

Browse files
authored
Merge pull request microsoft#165963 from microsoft/cli/local-download-fallback
cli: implement local download fallback
2 parents dc790e9 + 446be2c commit 1e10847

File tree

8 files changed

+584
-85
lines changed

8 files changed

+584
-85
lines changed

cli/src/commands/update.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,16 @@ use indicatif::ProgressBar;
88
use crate::{
99
self_update::SelfUpdate,
1010
update_service::UpdateService,
11-
util::{errors::AnyError, input::ProgressBarReporter},
11+
util::{errors::AnyError, http::ReqwestSimpleHttp, input::ProgressBarReporter},
1212
};
1313

1414
use super::{args::StandaloneUpdateArgs, CommandContext};
1515

1616
pub async fn update(ctx: CommandContext, args: StandaloneUpdateArgs) -> Result<i32, AnyError> {
17-
let update_service = UpdateService::new(ctx.log.clone(), ctx.http.clone());
17+
let update_service = UpdateService::new(
18+
ctx.log.clone(),
19+
ReqwestSimpleHttp::with_client(ctx.http.clone()),
20+
);
1821
let update_service = SelfUpdate::new(&update_service)?;
1922

2023
let current_version = update_service.get_current_release().await?;

cli/src/tunnels/code_server.rs

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::util::command::{capture_command, kill_tree};
1212
use crate::util::errors::{
1313
wrap, AnyError, ExtensionInstallFailed, MissingEntrypointError, WrappedError,
1414
};
15-
use crate::util::http;
15+
use crate::util::http::{self, SimpleHttp};
1616
use crate::util::io::SilentCopyProgress;
1717
use crate::util::machine::process_exists;
1818
use crate::{debug, info, log, span, spanf, trace, warning};
@@ -170,14 +170,22 @@ impl ResolvedServerParams {
170170
}
171171

172172
impl ServerParamsRaw {
173-
pub async fn resolve(self, log: &log::Logger) -> Result<ResolvedServerParams, AnyError> {
173+
pub async fn resolve(
174+
self,
175+
log: &log::Logger,
176+
http: impl SimpleHttp + Send + Sync + 'static,
177+
) -> Result<ResolvedServerParams, AnyError> {
174178
Ok(ResolvedServerParams {
175-
release: self.get_or_fetch_commit_id(log).await?,
179+
release: self.get_or_fetch_commit_id(log, http).await?,
176180
code_server_args: self.code_server_args,
177181
})
178182
}
179183

180-
async fn get_or_fetch_commit_id(&self, log: &log::Logger) -> Result<Release, AnyError> {
184+
async fn get_or_fetch_commit_id(
185+
&self,
186+
log: &log::Logger,
187+
http: impl SimpleHttp + Send + Sync + 'static,
188+
) -> Result<Release, AnyError> {
181189
let target = match self.headless {
182190
true => TargetKind::Server,
183191
false => TargetKind::Web,
@@ -193,7 +201,7 @@ impl ServerParamsRaw {
193201
});
194202
}
195203

196-
UpdateService::new(log.clone(), reqwest::Client::new())
204+
UpdateService::new(log.clone(), http)
197205
.get_latest_commit(self.platform, target, self.quality)
198206
.await
199207
}
@@ -285,6 +293,7 @@ async fn install_server_if_needed(
285293
log: &log::Logger,
286294
paths: &ServerPaths,
287295
release: &Release,
296+
http: impl SimpleHttp + Send + Sync + 'static,
288297
) -> Result<(), AnyError> {
289298
if paths.executable.exists() {
290299
info!(
@@ -298,7 +307,7 @@ async fn install_server_if_needed(
298307
let tar_file_path = spanf!(
299308
log,
300309
log.span("server.download"),
301-
download_server(&paths.server_dir, release, log)
310+
download_server(&paths.server_dir, release, log, http)
302311
)?;
303312

304313
span!(
@@ -314,28 +323,21 @@ async fn download_server(
314323
path: &Path,
315324
release: &Release,
316325
log: &log::Logger,
326+
http: impl SimpleHttp + Send + Sync + 'static,
317327
) -> Result<PathBuf, AnyError> {
318-
let response = UpdateService::new(log.clone(), reqwest::Client::new())
328+
let response = UpdateService::new(log.clone(), http)
319329
.get_download_stream(release)
320330
.await?;
321331

322332
let mut save_path = path.to_owned();
323-
324-
let fname = response
325-
.url()
326-
.path_segments()
327-
.and_then(|segments| segments.last())
328-
.and_then(|name| if name.is_empty() { None } else { Some(name) })
329-
.unwrap_or("tmp.zip");
333+
save_path.push("archive");
330334

331335
info!(
332336
log,
333-
"Downloading VS Code server {} -> {}",
334-
response.url(),
337+
"Downloading VS Code server -> {}",
335338
save_path.display()
336339
);
337340

338-
save_path.push(fname);
339341
http::download_into_file(
340342
&save_path,
341343
log.get_download_logger("server download progress:"),
@@ -402,18 +404,20 @@ async fn do_extension_install_on_running_server(
402404
}
403405
}
404406

405-
pub struct ServerBuilder<'a> {
407+
pub struct ServerBuilder<'a, Http: SimpleHttp + Send + Sync + Clone> {
406408
logger: &'a log::Logger,
407409
server_params: &'a ResolvedServerParams,
408410
last_used: LastUsedServers<'a>,
409411
server_paths: ServerPaths,
412+
http: Http,
410413
}
411414

412-
impl<'a> ServerBuilder<'a> {
415+
impl<'a, Http: SimpleHttp + Send + Sync + Clone + 'static> ServerBuilder<'a, Http> {
413416
pub fn new(
414417
logger: &'a log::Logger,
415418
server_params: &'a ResolvedServerParams,
416419
launcher_paths: &'a LauncherPaths,
420+
http: Http,
417421
) -> Self {
418422
Self {
419423
logger,
@@ -422,6 +426,7 @@ impl<'a> ServerBuilder<'a> {
422426
server_paths: server_params
423427
.as_installed_server()
424428
.server_paths(launcher_paths),
429+
http,
425430
}
426431
}
427432

@@ -476,8 +481,13 @@ impl<'a> ServerBuilder<'a> {
476481
pub async fn setup(&self) -> Result<(), AnyError> {
477482
debug!(self.logger, "Installing and setting up VS Code Server...");
478483
check_and_create_dir(&self.server_paths.server_dir).await?;
479-
install_server_if_needed(self.logger, &self.server_paths, &self.server_params.release)
480-
.await?;
484+
install_server_if_needed(
485+
self.logger,
486+
&self.server_paths,
487+
&self.server_params.release,
488+
self.http.clone(),
489+
)
490+
.await?;
481491
debug!(self.logger, "Server setup complete");
482492

483493
match self.last_used.add(self.server_params.as_installed_server()) {

0 commit comments

Comments
 (0)