Files
contracts-flask/History/drhider-utf8-zip-2026-07-07.md
naeel e128b2614a
Deploy contracts-flask / validate (push) Successful in 0s
fix: drhider multipart UTF-8 filename decode (v1.8)
2026-07-07 15:50:43 +04:00

44 lines
1.6 KiB
Markdown

# DrHider — Cyrillic filenames in ZIP fix (2026-07-07)
## Проблема
Кириллические имена файлов в выходном ZIP отображаются кракозябрами
(CP437 вместо UTF-8). Содержимое файлов — OK.
## Причина (двойная)
1. **Мультипарт-парсер** в `drhider_server.py` декодирует HTTP-заголовки как `latin-1`,
но браузеры/curl шлют имена файлов в UTF-8. Результат — Mojibake.
2. **`_build_zip`** в `drhider.py``zipfile.ZipFile` в режиме записи кодирует
имена в CP437, флаг UTF-8 не ставится.
## Решение
### Часть 1: мультипарт (drhider_server.py)
```python
name = os.path.basename(m.group(1))
try:
name = name.encode('latin-1').decode('utf-8')
except (UnicodeDecodeError, UnicodeEncodeError):
pass
```
### Часть 2: ZIP (drhider.py)
```python
# Было:
zf.writestr(fname, content)
# Стало:
info = zipfile.ZipInfo(fname)
info.flag_bits |= 0x800
zf.writestr(info, content)
```
## Затронутые файлы
- ВМ: `/home/naeel/contracts/drhider/drhider.py``_build_zip`
- ВМ: `/home/naeel/contracts/drhider/drhider_server.py` → multipart parser
- `contracts-flask/deploy/drhider/drhider.py`
- `contracts-flask/deploy/drhider/drhider_server.py`
- `contracts-flask/site/services/drhider.py`
## Важно
- `metadata_encoding='utf-8'` НЕ РАБОТАЕТ в Python 3.12.3 на запись
- После правки `.py``rm -rf __pycache__` перед перезапуском