Skip to content

fix(api): не отдавать пустое тело менеджерского API при битом UTF-8 - #676

Merged
biz87 merged 1 commit into
betafrom
fix/issue-671-manager-utf8-json
Sep 9, 2026
Merged

biz87 merged 1 commit into
betafrom
fix/issue-671-manager-utf8-json

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Менеджерский connector путь (ProcessesManagerConnectorRouteTrait → success()/failure() → xPDO::toJSON) при невалидном UTF-8 отдавал пустое тело: json_encode без флагов возвращал false, die(false) печатал пустую строку.

До передачи в процессор данные проходят через Response::sanitizeUtf8ForJson() (тот же log + JSON_INVALID_UTF8_SUBSTITUTE, что у витринного #662). При невозможности кодирования (например NAN) — fail-closed 500 с непустым JSON.

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #671

Связано: #654, #662, #618, #619

Как это было протестировано?

cd core/components/minishop3
php -l src/Router/Response.php
php -l src/Processors/Api/ProcessesManagerConnectorRouteTrait.php
# exit 0

./vendor/bin/phpunit tests/Unit/Router/ResponseJsonEncodeTest.php
# OK (9 tests, 41 assertions), exit 0

php tests/RouterRoutePlansTest.php
# OK: RouterRoutePlansTest, exit 0

Покрыто: substitute битого UTF-8, identity для валидных данных, null на NAN, путь respondFromRouter → bare json_encode как у xPDO::toJSON, fail-closed 500.

  • Ручное тестирование
  • Автоматические тесты (composer ci:php / composer test, npm run lint:ci, composer stan / GitHub Actions CI)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-671-manager-utf8-json
  • MODX: n/a (unit)
  • PHP: 8.4.23

Скриншоты (если применимо)

До После
n/a n/a

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок (composer stan / CI job PHPStan)
  • ESLint проходит без ошибок (npm run lint:ci для Vue)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Лексиконы и Vue не затронуты. CHANGELOG оставляем на релиз. Витринный путь (encodeJsonBody / api.php) без изменений контракта, общая логика вынесена в encodeJsonSubstitutingUtf8.

Prevent empty connector bodies when xPDO::toJSON hits invalid UTF-8 by
reusing Response substitute/logging before success()/failure().
@Ibochkarev Ibochkarev added priority: medium Средний приоритет bug Something isn't working labels Sep 9, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 September 9, 2026 01:47
@biz87
biz87 merged commit a75d1dc into beta Sep 9, 2026
3 checks passed
@biz87
biz87 deleted the fix/issue-671-manager-utf8-json branch September 9, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: medium Средний приоритет

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Менеджерский API отдаёт пустое тело при битом UTF-8

2 participants