From 5fdcc50451b5a9fdc5e2fad62d263c61a1df6412 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 22 Oct 2026 14:39:59 +0400 Subject: [PATCH] =?UTF-8?q?API:=20MIME=20=D0=B2=D0=BB=D0=BE=D0=B6=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20ASC?= =?UTF-8?q?II,=20=D0=B8=D0=BD=D0=B0=D1=87=D0=B5=20octet-stream=20(#83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- src/jira_hub/api.py | 2 +- tests/test_api.py | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/jira_hub/api.py b/src/jira_hub/api.py index 080b978..25b364d 100644 --- a/src/jira_hub/api.py +++ b/src/jira_hub/api.py @@ -31,7 +31,7 @@ ASSET_CACHE = {"Cache-Control": "public, max-age=31536000, immutable"} # им NOT_BUILT = ("Хаб Jira

Веб-приложение не собрано: выполните " "make web в каталоге jira-hub и перезапустите хаб.

").encode("utf-8") SOCKET_TIMEOUT = 60 # чтение запроса; ожидание долгого claim идёт уже после чтения тела и сокет не держит -MIME_RE = re.compile(r"[\w!#$&^.+-]+/[\w!#$&^.+-]+") # тип/подтип без параметров и пробелов: заголовок не внушить +MIME_RE = re.compile(r"[\w!#$&^.+-]+/[\w!#$&^.+-]+", re.ASCII) # тип/подтип без параметров, пробелов и не-ASCII: заголовок не внушить SWEEP_EVERY = 24 * 3600 # уборка files/ не чаще раза в сутки (hub-api «Хранилище файлов вложений») diff --git a/tests/test_api.py b/tests/test_api.py index 932fe32..59c234a 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1130,6 +1130,13 @@ def test_attachment_content_bad_mime(hub): assert _content(hub, "/attachments/31337/content").headers["Content-Type"] == "application/octet-stream" +def test_attachment_content_non_ascii_mime(hub): + """Кириллический mime_type не должен ронять send_header (UnicodeEncodeError → 500): \w в MIME_RE — только ASCII.""" + _seed_attachment(hub, mime="текст/простой") + _fetch_done(hub) + assert _content(hub, "/attachments/31337/content").headers["Content-Type"] == "application/octet-stream" + + def test_attachment_fetch_twice_same_command(hub): _seed_attachment(hub) a = hub["client"].post("/attachments/31337/fetch", {})