From d0411591f134a50824c6d7f6695749e059ae3cef Mon Sep 17 00:00:00 2001 From: Kimmo Jyrinki <101572218+kjyrinki-unikie@users.noreply.github.com> Date: Tue, 12 Mar 2024 11:58:35 +0200 Subject: [PATCH] Fix single port RRQ with options fail (#17) --- src/server.rs | 18 +----------------- src/worker.rs | 27 ++++++++++++++++++++++----- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/src/server.rs b/src/server.rs index e241a17..4705703 100644 --- a/src/server.rs +++ b/src/server.rs @@ -184,7 +184,7 @@ impl Server { worker_options.window_size, self.duplicate_packets + 1, ); - worker.send() + worker.send(!options.is_empty()) } _ => Err("Unexpected error code when checking file".into()), } @@ -349,9 +349,6 @@ fn accept_request( ) -> Result<(), Box> { if !options.is_empty() { socket.send(&Packet::Oack(options.to_vec()))?; - if let RequestType::Read(_) = request_type { - check_response(socket)?; - } } else if request_type == RequestType::Write { socket.send(&Packet::Ack(0))?; } @@ -359,19 +356,6 @@ fn accept_request( Ok(()) } -fn check_response(socket: &T) -> Result<(), Box> { - if let Packet::Ack(received_block_number) = socket.recv()? { - if received_block_number != 0 { - socket.send(&Packet::Error { - code: ErrorCode::IllegalOperation, - msg: "invalid oack response".to_string(), - })?; - } - } - - Ok(()) -} - fn check_file_exists(file: &Path, directory: &PathBuf) -> ErrorCode { if !validate_file_path(file, directory) { return ErrorCode::AccessViolation; diff --git a/src/worker.rs b/src/worker.rs index 50163de..82bd952 100644 --- a/src/worker.rs +++ b/src/worker.rs @@ -1,4 +1,4 @@ -use crate::{Packet, Socket, Window}; +use crate::{ErrorCode, Packet, Socket, Window}; use std::{ error::Error, fs::{self, File}, @@ -26,6 +26,7 @@ const DEFAULT_DUPLICATE_DELAY: Duration = Duration::from_millis(1); /// // Send a file, responding to a read request. /// let socket = UdpSocket::bind("127.0.0.1:0").unwrap(); /// socket.connect(SocketAddr::from_str("127.0.0.1:12345").unwrap()).unwrap(); +/// let has_options = false; /// /// let worker = Worker::new( /// Box::new(socket), @@ -36,7 +37,7 @@ const DEFAULT_DUPLICATE_DELAY: Duration = Duration::from_millis(1); /// 1, /// ); /// -/// worker.send().unwrap(); +/// worker.send(has_options).unwrap(); /// ``` pub struct Worker { socket: Box, @@ -69,13 +70,13 @@ impl Worker { /// Sends a file to the remote [`SocketAddr`] that has sent a read request using /// a random port, asynchronously. - pub fn send(self) -> Result<(), Box> { + pub fn send(self, check_response: bool) -> Result<(), Box> { let file_name = self.file_name.clone(); let remote_addr = self.socket.remote_addr().unwrap(); thread::spawn(move || { let handle_send = || -> Result<(), Box> { - self.send_file(File::open(&file_name)?)?; + self.send_file(File::open(&file_name)?, check_response)?; Ok(()) }; @@ -130,10 +131,13 @@ impl Worker { Ok(()) } - fn send_file(self, file: File) -> Result<(), Box> { + fn send_file(self, file: File, check_response: bool) -> Result<(), Box> { let mut block_number = 1; let mut window = Window::new(self.windowsize, self.blk_size, file); + if check_response { + self.check_response()?; + } loop { let filled = window.fill()?; @@ -251,4 +255,17 @@ impl Worker { Ok(()) } + + fn check_response(&self) -> Result<(), Box> { + if let Packet::Ack(received_block_number) = self.socket.recv()? { + if received_block_number != 0 { + self.socket.send(&Packet::Error { + code: ErrorCode::IllegalOperation, + msg: "invalid oack response".to_string(), + })?; + } + } + + Ok(()) + } }