diff --git a/src/connection.rs b/src/connection.rs index ea1f98d..5aa8570 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -9,7 +9,7 @@ use tokio::{ }; use crate::{protocol::{ - Command, HEADER_SIZE, Header, MAX_BODY_SIZE, decode_header, + Command, HEADER_SIZE, Header, decode_header, }, upload}; struct IncomingMessage { @@ -75,7 +75,7 @@ impl Connection { format!("Ошибка UPLOAD:{error:}") ) } - ); + )?; } Command::Download => { @@ -116,8 +116,8 @@ impl Connection { return Ok(None); } - // Читаем остальную часть буфера от 1 до конца - self.stream.read_exact(&mut buffer[1..]).await?; + // Читаем остальную часть буфера от 1 до конца общего заголовка + self.stream.read_exact(&mut buffer[1..=HEADER_SIZE]).await?; //Парсим скачанный заголовок через nocloud_core::protocol parse_header let header = diff --git a/src/main.MD b/src/main.MD index 2387009..d843946 100644 --- a/src/main.MD +++ b/src/main.MD @@ -60,18 +60,18 @@ pub async fn handle( ### 3. Убрать чтение всего тела в `Vec` - [✔] Не вызывать текущий `read_body()` для команды `UPLOAD`. -- [ ] Не создавать: +- [✔] Не создавать: ```rust vec![0_u8; header.body_size() as usize] ``` -- [ ] Удалить или временно оставить `read_body()` только для будущих небольших команд. -- [ ] Убедиться, что `UPLOAD` получает поток, стоящий точно перед первым байтом тела. +- [✔] Удалить или временно оставить `read_body()` только для будущих небольших команд. +- [✔] Убедиться, что `UPLOAD` получает поток, стоящий точно перед первым байтом тела. ### 4. Описать метаданные загрузки -- [ ] В `protocol.rs` создать структуру: +- [✔] В `protocol.rs` создать структуру: ```rust pub struct UploadMetadata { diff --git a/src/protocol.rs b/src/protocol.rs index 2548f82..49ba0fe 100644 --- a/src/protocol.rs +++ b/src/protocol.rs @@ -1,6 +1,5 @@ // Парсим заголовок на базе Nom pub const HEADER_SIZE: usize = 20; -pub const MAX_BODY_SIZE: u64 = 1024 * 1024; use nom::{ bytes::complete::tag, diff --git a/src/upload.rs b/src/upload.rs index 62eb13d..00517bb 100644 --- a/src/upload.rs +++ b/src/upload.rs @@ -1,11 +1,16 @@ -use tokio::{io, net::TcpStream, stream}; +use tokio::{io::{self, AsyncReadExt}, net::TcpStream, stream}; use crate::protocol::Header; -pub async fn handle( - stream: &mut TcpStream, - header: Header, -) -> io::Result<()> { - println!("Обработчик UPLOAD получил заголовок: {header:?}"); - Ok(()) -} \ No newline at end of file +struct UploadMetadata { + file_size: u64, + file_name: String, +} + +impl UploadMetadata { + pub async fn handle(stream: &mut TcpStream, header: Header) -> io::Result<()> { + println!("Обработчик UPLOAD получил заголовок: {header:?}"); + let filename_read=stream.read(&mut ) + Ok(()) + } +}