diff --git a/src/connection.rs b/src/connection.rs index 5aa8570..de2833c 100644 --- a/src/connection.rs +++ b/src/connection.rs @@ -117,7 +117,7 @@ impl Connection { } // Читаем остальную часть буфера от 1 до конца общего заголовка - self.stream.read_exact(&mut buffer[1..=HEADER_SIZE]).await?; + 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 d843946..c3db0e3 100644 --- a/src/main.MD +++ b/src/main.MD @@ -80,14 +80,14 @@ pub struct UploadMetadata { } ``` -- [ ] Добавить геттеры для `file_size` и `file_name`. -- [ ] Добавить константу максимальной длины имени: +- [✔] Добавить геттеры для `file_size` и `file_name`. +- [✔] Добавить константу максимальной длины имени: ```rust -MAX_FILENAME_SIZE +MAX_RELATIVE_PATH_BYTES ``` -- [ ] Пока не добавлять в структуру содержимое файла. +- [✔] Пока не добавлять в структуру содержимое файла. ### 5. Прочитать фиксированную часть метаданных @@ -98,10 +98,10 @@ file_size: 8 байт name_size: 2 байта ``` -- [ ] В `upload::handle()` создать буфер размером 10 байт. -- [ ] Прочитать в него ровно 10 байт через `read_exact()`. -- [ ] Пока вывести полученные байты. -- [ ] Проверить обрыв соединения внутри этих десяти байт. +- [✔] В `upload::handle()` создать буфер размером 10 байт. +- [✔] Прочитать в него ровно 10 байт через `read_exact()`. +- [✔] Пока вывести полученные байты. +- [✔] Проверить обрыв соединения внутри этих десяти байт. Ожидаемый результат: diff --git a/src/upload.rs b/src/upload.rs index 00517bb..7918167 100644 --- a/src/upload.rs +++ b/src/upload.rs @@ -2,15 +2,43 @@ use tokio::{io::{self, AsyncReadExt}, net::TcpStream, stream}; use crate::protocol::Header; +const UPLOAD_PREFIX_SIZE: usize = 10; //Размер префикса в UPLOAD +pub const MAX_RELATIVE_PATH_BYTES: usize = 128 * 1024; //Размер пути с именем + struct UploadMetadata { - file_size: u64, + path_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(()) - } + +pub async fn handle(stream: &mut TcpStream, header: Header) -> io::Result<()> { + println!("Обработчик UPLOAD получил заголовок: {header:?}"); + + let mut prefix_buffer = [0_u8; UPLOAD_PREFIX_SIZE]; + stream.read_exact(&mut buffer).await?; + + println!( + "Получены {UPLOAD_PREFIX_SIZE} байт метаданных UPLOAD: {buffer:?}" + ); + Ok(()) } + +impl UploadMetadata { + pub(crate) fn new( + file_size: u64, + relative_path: String, + ) -> Self { + Self { + file_size, + relative_path, + } + } + + pub fn file_size(&self) -> u64 { + self.file_size + } + + pub fn relative_path(&self) -> &str { + &self.relative_path + } +} \ No newline at end of file