fix: keep frame decoding alive on non-dict payload#67
Conversation
Some inbound frames carry a bare scalar payload instead of a map (e.g. an error response comes as a numeric code). `InboundFrame.payload` is typed `dict | None`, so constructing the frame raised a `ValidationError` right in the receive loop, which tore down the connection and triggered a reconnect loop. Keep `payload` as `dict | None` (consumers read it that way) and store the original decoded value in `raw` (now `Any`) so such frames no longer crash frame decoding. Add a regression test for a scalar payload. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
📝 WalkthroughWalkthrough
ChangesNon-dict TCP payload handling
Estimated code review effort🎯 2 (Simple) | ⏱️ ~8 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Проблема была в декодере PyMax. |
Описание
Некоторые входящие фреймы несут payload не в виде map, а голым значением —
например, ответ-ошибка приходит числовым кодом. Поле
InboundFrame.payloadтипизировано как
dict | None, поэтому создание фрейма падало сValidationErrorпрямо в цикле приёма (_recv_loop). Это исключениеобрабатывается как фатальная ошибка соединения → разрыв и реконнект, а тот же
фрейм приходит снова → цикл реконнектов.
Изменения:
payloadостаётсяdict | None(консьюмеры читают его именно так и ужегуардят
None);raw(теперьAny), чтобы нетерять данные (тот самый код ошибки) и не ронять приём кадров.
Обратной несовместимости нет: для обычных dict-фреймов
payloadиrawведут себя как раньше; поле
InboundFrame.rawв коде нигде не читается.Тип изменений
Связанные задачи / Issue
Ссылка на issue, если есть: #
Тестирование
Добавлен регрессионный тест
test_tcp_protocol_keeps_non_dict_payload_in_rawв
tests/protocol/test_protocols.py:Запуск:
Summary by CodeRabbit