feat(protocol): add initial parser for common message header

This commit is contained in:
Stanislav N Mikhailov
2026-07-18 21:58:32 +03:00
parent 359337bc10
commit 9f2d7f635e
5 changed files with 223 additions and 38 deletions
+59 -2
View File
@@ -2,5 +2,62 @@
## 📌 Текущее состояние
* **Где остановился:** Сервер успешно запускается и слушает сетевой сокет.
* **Проблема:** Не удалось проверить эхо-ответ через PowerShell.
* **Следующий шаг:** Найти рабочий способ отправки тестового запроса в PowerShell или использовать альтернативный инструмент.
Проверочная строка: smikhai@DebHOME:~$ printf '\x4E\x43\x4C\x44\x01\x01\x00\x00\x00\x00\x00\x11\x00\x00\x00\x00\x00\x00\x03\xFB' \
> | nc 192.168.1.213 32768
выдаёт ошибку парсера:
Сервер слушает 192.168.1.213:32768
Обработчик 1 создан для 192.168.1.170:50978
Обработчик 1: Критическая ошибка! Неверный формат заголовка.
Обработчик 1: ошибка: Invalid header format
что радует.
* **Проблема:**
* **Следующий шаг:**
## Чек-лист: исправление парсера общего заголовка
* [ ] Исправить имя функции `parce_header``parse_header`.
* [ ] Убрать `async` у `parse_header`: функция не выполняет ввод-вывод.
* [ ] Убрать `.await` при вызове `parse_header`.
* [ ] Исправить порядок полей согласно протоколу:
* `bytes[0..4]``magic`;
* `bytes[4]``version`;
* `bytes[5]``command`.
* [ ] Проверять `magic` как четыре байта `NCLD`.
* [ ] Проверять версию как число `1`, а не ASCII-символ `b'1'`.
* [ ] Пока разрешать только версию протокола `1`.
* [ ] Исправить команды `80 | 81` на `0x80 | 0x81`.
* [ ] Записывать в `Header.version` значение из `bytes[4]`.
* [ ] Для первого теста отправлять заголовок с `body_size = 0`.
## Проверка исправлений
* [ ] Отправить корректный заголовок.
* [ ] Убедиться, что сервер вывел:
```text
Header {
version: 1,
command: 1,
flags: 0,
request_id: 17,
body_size: 0,
}
```
* [ ] Отправить заголовок с неправильным `magic`.
* [ ] Убедиться, что сервер вернул `InvalidFormat`.
* [ ] Отправить заголовок с неподдерживаемой версией.
* [ ] Убедиться, что сервер вернул `InvalidFormat`.
* [ ] Отправить заголовок с неизвестной командой.
* [ ] Убедиться, что сервер вернул `InvalidFormat`.
* [ ] Отправить заголовок с запрещённым флагом, например `0x0008`.
* [ ] Убедиться, что сервер вернул `InvalidFormat`.
## Следующая итерация — пока не выполнять
* [ ] Ограничить допустимый `body_size`.
* [ ] Не выделять буфер размером со всё тело сообщения.
* [ ] Начать отдельный разбор тела команды `UPLOAD`.
* [ ] Читать данные файла порциями, а не целиком в память.