Skip to content

Keep legacy connector JSON valid on broken UTF-8 - #691

Open
Ibochkarev wants to merge 2 commits into
betafrom
fix/issue-689-legacy-utf8
Open

Keep legacy connector JSON valid on broken UTF-8#691
Ibochkarev wants to merge 2 commits into
betafrom
fix/issue-689-legacy-utf8

Conversation

@Ibochkarev

Copy link
Copy Markdown
Member

Описание

Легаси-процессоры через connector.php уходили в xPDO::toJSON() без UTF-8 fallback и при битой последовательности отдавали пустое тело с кодом 200.

Решение: одна точка выхода. connector.php ставит Utf8SafeConnectorResponse до handleRequest(). Все процессоры, в том числе новые, проходят Response::encodeConnectorJson(): невалидный UTF-8 заменяется на U+FFFD, иначе ASCII-конверт 500. Процессоры поштучно не трогаем.

Маршрутизируемый путь (ProcessesManagerConnectorRouteTrait, #676) не убирали.

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

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

Связанные Issues

Closes #689

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

cd core/components/minishop3
php -l src/Router/Response.php
php -l src/Router/Utf8SafeConnectorResponse.php
php tests/ConnectorUtf8SafeResponseTest.php
php tests/ProcessorPermissionsSmokeTest.php
vendor/bin/phpunit tests/Unit/Router/ResponseJsonEncodeTest.php
composer test:smoke

Все команды завершились с кодом 0. PHPUnit: 12 tests, 57 assertions. composer test:smoke: 100 скриптов.

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

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

  • MiniShop3: ветка fix/issue-689-legacy-utf8
  • MODX: не требовался для unit/smoke (класс ответа наследует modConnectorResponse только в живом connector)
  • PHP: 8.2+

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

До После

Чеклист

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

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

Конверт success / message / total / data / object совпадает с тем, что modConnectorResponse передаёт в toJSON().

Не покрыто: живой outputContent с ядром MODX (auth + runProcessor). Двойная sanitize на routed manager path (#676 + этот слой) идемпотентна.

@Ibochkarev Ibochkarev added priority: low Низкий приоритет, когда будет время bug Something isn't working labels Sep 9, 2026
@Ibochkarev
Ibochkarev requested a review from biz87 September 9, 2026 10:49
Legacy processors died with an empty body because xPDO::toJSON has no UTF-8 fallback. Install one connector response so every processor on connector.php shares the same sanitize-or-fail-closed path.
Superglobals always exist, so isset() on $_POST/$_GET/$_FILES is dead. json_encode does not return an empty string when it succeeds.
@Ibochkarev
Ibochkarev force-pushed the fix/issue-689-legacy-utf8 branch from 938e807 to fad2564 Compare September 9, 2026 13:34
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: low Низкий приоритет, когда будет время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Легаси-процессоры отдают пустое тело при битом UTF-8

1 participant