diff --git a/Cargo.lock b/Cargo.lock index 0d77b5a93949320ea48c4457d38f83a5636b1e54..aabd50a8c955d95e42a14d475c7ac9fc011b4dd8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3507,6 +3507,7 @@ dependencies = [ "fs", "futures 0.3.28", "gpui", + "isahc", "language", "log", "lsp", diff --git a/crates/extension/Cargo.toml b/crates/extension/Cargo.toml index df02174e1e410301df2efdd9a7ef3299d96036af..7d6713729af3087d6becb66c7fdc2db4e5f73866 100644 --- a/crates/extension/Cargo.toml +++ b/crates/extension/Cargo.toml @@ -23,6 +23,7 @@ collections.workspace = true fs.workspace = true futures.workspace = true gpui.workspace = true +isahc.workspace = true language.workspace = true log.workspace = true lsp.workspace = true diff --git a/crates/extension/src/extension_store.rs b/crates/extension/src/extension_store.rs index 72001a0f73eaef040dcb6ace3ccc2a4af8eeb918..d2cfe660dbaf5058649c2c5e341a03e94bf71049 100644 --- a/crates/extension/src/extension_store.rs +++ b/crates/extension/src/extension_store.rs @@ -605,7 +605,23 @@ impl ExtensionStore { ) .await?; - let decompressed_bytes = GzipDecoder::new(BufReader::new(response.body_mut())); + let content_length = response + .headers() + .get(isahc::http::header::CONTENT_LENGTH) + .and_then(|value| value.to_str().ok()?.parse::().ok()); + + let mut body = BufReader::new(response.body_mut()); + let mut tgz_bytes = Vec::new(); + body.read_to_end(&mut tgz_bytes).await?; + + if let Some(content_length) = content_length { + let actual_len = tgz_bytes.len(); + if content_length != actual_len { + bail!("downloaded extension size {actual_len} does not match content length {content_length}"); + } + } + let decompressed_bytes = GzipDecoder::new(BufReader::new(tgz_bytes.as_slice())); + // let decompressed_bytes = GzipDecoder::new(BufReader::new(tgz_bytes)); let archive = Archive::new(decompressed_bytes); archive.unpack(extension_dir).await?; this.update(&mut cx, |this, cx| {