feat(upload): read fixed-size upload prefix

This commit is contained in:
Stanislav N Mikhailov
2026-08-11 21:39:50 +03:00
parent 46f2721570
commit 9bc62acbc3
3 changed files with 44 additions and 16 deletions
+1 -1
View File
@@ -117,7 +117,7 @@ impl Connection {
} }
// Читаем остальную часть буфера от 1 до конца общего заголовка // Читаем остальную часть буфера от 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 //Парсим скачанный заголовок через nocloud_core::protocol parse_header
let header = let header =
+8 -8
View File
@@ -80,14 +80,14 @@ pub struct UploadMetadata {
} }
``` ```
- [ ] Добавить геттеры для `file_size` и `file_name`. - [✔] Добавить геттеры для `file_size` и `file_name`.
- [ ] Добавить константу максимальной длины имени: - [✔] Добавить константу максимальной длины имени:
```rust ```rust
MAX_FILENAME_SIZE MAX_RELATIVE_PATH_BYTES
``` ```
- [ ] Пока не добавлять в структуру содержимое файла. - [✔] Пока не добавлять в структуру содержимое файла.
### 5. Прочитать фиксированную часть метаданных ### 5. Прочитать фиксированную часть метаданных
@@ -98,10 +98,10 @@ file_size: 8 байт
name_size: 2 байта name_size: 2 байта
``` ```
- [ ] В `upload::handle()` создать буфер размером 10 байт. - [✔] В `upload::handle()` создать буфер размером 10 байт.
- [ ] Прочитать в него ровно 10 байт через `read_exact()`. - [✔] Прочитать в него ровно 10 байт через `read_exact()`.
- [ ] Пока вывести полученные байты. - [✔] Пока вывести полученные байты.
- [ ] Проверить обрыв соединения внутри этих десяти байт. - [✔] Проверить обрыв соединения внутри этих десяти байт.
Ожидаемый результат: Ожидаемый результат:
+33 -5
View File
@@ -2,15 +2,43 @@ use tokio::{io::{self, AsyncReadExt}, net::TcpStream, stream};
use crate::protocol::Header; use crate::protocol::Header;
const UPLOAD_PREFIX_SIZE: usize = 10; //Размер префикса в UPLOAD
pub const MAX_RELATIVE_PATH_BYTES: usize = 128 * 1024; //Размер пути с именем
struct UploadMetadata { struct UploadMetadata {
file_size: u64, path_size: u64,
file_name: String, file_name: String,
} }
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 { impl UploadMetadata {
pub async fn handle(stream: &mut TcpStream, header: Header) -> io::Result<()> { pub(crate) fn new(
println!("Обработчик UPLOAD получил заголовок: {header:?}"); file_size: u64,
let filename_read=stream.read(&mut ) relative_path: String,
Ok(()) ) -> Self {
Self {
file_size,
relative_path,
}
}
pub fn file_size(&self) -> u64 {
self.file_size
}
pub fn relative_path(&self) -> &str {
&self.relative_path
} }
} }