summaryrefslogtreecommitdiff
path: root/crates/utils/tcp_connection/src/instance.rs
diff options
context:
space:
mode:
authorWeicao-CatilGrass <1992414357@qq.com>2025-12-18 00:41:26 +0800
committerWeicao-CatilGrass <1992414357@qq.com>2025-12-18 00:41:26 +0800
commitbff0cb9b4226385962a2967a82064e0633b4d402 (patch)
tree48a7df6aa41a21f22850be280fbc0b325768f59b /crates/utils/tcp_connection/src/instance.rs
parent3158e5726f3f72247a76626a69764ab05d12ba80 (diff)
Handle zero-size files in TCP file transfer
Skip content transfer and verification for empty files, sending immediate confirmation from receiver.
Diffstat (limited to 'crates/utils/tcp_connection/src/instance.rs')
-rw-r--r--crates/utils/tcp_connection/src/instance.rs25
1 files changed, 25 insertions, 0 deletions
diff --git a/crates/utils/tcp_connection/src/instance.rs b/crates/utils/tcp_connection/src/instance.rs
index dc49591..8e6886c 100644
--- a/crates/utils/tcp_connection/src/instance.rs
+++ b/crates/utils/tcp_connection/src/instance.rs
@@ -351,6 +351,28 @@ impl ConnectionInstance {
self.stream.write_all(&file_crc.to_be_bytes()).await?;
+ // If file size is 0, skip content transfer
+ if file_size == 0 {
+ self.stream.flush().await?;
+
+ // Wait for receiver confirmation
+ let mut ack = [0u8; 1];
+ tokio::time::timeout(
+ Duration::from_secs(self.config.timeout_secs),
+ self.stream.read_exact(&mut ack),
+ )
+ .await
+ .map_err(|_| TcpTargetError::Timeout("Ack timeout".to_string()))??;
+
+ if ack[0] != 1 {
+ return Err(TcpTargetError::Protocol(
+ "Receiver verification failed".to_string(),
+ ));
+ }
+
+ return Ok(());
+ }
+
// Transfer file content
let mut reader = BufReader::with_capacity(self.config.chunk_size, &mut file);
let mut bytes_sent = 0;
@@ -434,6 +456,9 @@ impl ConnectionInstance {
.truncate(true)
.open(path)
.await?;
+ // Send confirmation
+ self.stream.write_all(&[1u8]).await?;
+ self.stream.flush().await?;
return Ok(());
}