feat(app-lib): send file hash (#7266)

This commit is contained in:
Sychic
2026-08-21 19:40:16 +00:00
committed by GitHub
parent 797ec2ec3c
commit 871a161327
2 changed files with 21 additions and 10 deletions
@@ -823,7 +823,8 @@ pub(super) async fn send_bytes_request(
) -> crate::Result<reqwest::Response> { ) -> crate::Result<reqwest::Response> {
let base_url = service_base_url(); let base_url = service_base_url();
let url = service_url(base_url, path); let url = service_url(base_url, path);
send_bytes_request_to_url(operation, method, path, &url, body, state).await send_bytes_request_to_url(operation, method, path, &url, body, None, state)
.await
} }
pub(super) async fn send_bytes_request_to_url( pub(super) async fn send_bytes_request_to_url(
@@ -832,6 +833,7 @@ pub(super) async fn send_bytes_request_to_url(
path: &str, path: &str,
url: &str, url: &str,
body: Vec<u8>, body: Vec<u8>,
file_sha512: Option<&str>,
state: &State, state: &State,
) -> crate::Result<reqwest::Response> { ) -> crate::Result<reqwest::Response> {
let service_origin = url::Url::parse(service_base_url()) let service_origin = url::Url::parse(service_base_url())
@@ -872,18 +874,20 @@ pub(super) async fn send_bytes_request_to_url(
"Sending shared instances API request" "Sending shared instances API request"
); );
let response = shared_instances_client(url) let mut request = shared_instances_client(url)
.request(method.clone(), url) .request(method.clone(), url)
.bearer_auth(credentials.session) .bearer_auth(credentials.session)
.header(reqwest::header::CONTENT_TYPE, "application/octet-stream") .header(reqwest::header::CONTENT_TYPE, "application/octet-stream")
.body(body) .body(body);
.send() if let Some(file_sha512) = file_sha512 {
.await request = request.header("x-file-sha512", file_sha512);
.map_err(|error| { }
crate::ErrorKind::SharedInstancesApiError(
error.without_url().to_string(), let response = request.send().await.map_err(|error| {
) crate::ErrorKind::SharedInstancesApiError(
})?; error.without_url().to_string(),
)
})?;
if response.status().is_success() { if response.status().is_success() {
let request_id = response_request_id(&response); let request_id = response_request_id(&response);
@@ -6,6 +6,7 @@ use super::*;
use async_walkdir::WalkDir; use async_walkdir::WalkDir;
use async_zip::{Compression, ZipEntryBuilder}; use async_zip::{Compression, ZipEntryBuilder};
use futures::StreamExt; use futures::StreamExt;
use sha2::Digest;
use std::collections::BTreeMap; use std::collections::BTreeMap;
#[tracing::instrument] #[tracing::instrument]
@@ -1018,12 +1019,18 @@ pub(super) async fn upload_external_files(
"Invalid shared instance external file upload URL: {error}" "Invalid shared instance external file upload URL: {error}"
)) ))
})?; })?;
let (bytes, file_sha512) = tokio::task::spawn_blocking(move || {
let hash = format!("{:x}", sha2::Sha512::digest(&bytes));
(bytes, hash)
})
.await?;
let response = send_bytes_request_to_url( let response = send_bytes_request_to_url(
"upload_external_file", "upload_external_file",
Method::PUT, Method::PUT,
upload_url.path(), upload_url.path(),
&upload.url, &upload.url,
bytes, bytes,
Some(&file_sha512),
state, state,
) )
.await?; .await?;