Repository navigation
fix(router): permite tratar exceções nos middlewares antes do fallback do core - #616
Merged
regyssilveira merged 4 commits intoOct 14, 2026
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
Os roteadores Tree e Radix capturavam as exceções durante a execução dos callbacks e encerravam o tratamento dentro do core. Assim, uma rota que lançasse
EHorseExceptionouExceptionnão permitia que oexceptde um middleware envolvendoNextrecebesse o erro, mesmo com um middleware de tratamento de exceções registrado.Correção
EHorseExceptiongera JSON com o status da exceção eapplication/json; charset=UTF-8; outras exceções acionamOnError, quando configurado, ou geram a resposta padrão 500 se ainda não houver um status de erro.EHorseCallbackInterruptede as respostas de erro já definidas.Com isso, o middleware pode personalizar a resposta de ambos os tipos de exceção. Se relançar a exceção ou não houver middleware para tratá-la, o core continua fornecendo o fallback.
Testes e validação
Foram adicionados 36 casos DUnitX, 18 para cada roteador, e 34 casos de regressão específicos para FPC (detalhados abaixo). A cobertura DUnitX inclui:
ExceptioneEHorseExceptionpelo middleware.OnError.OnErrornem executar os callbacks seguintes.Antes da correção, oito casos iniciais reproduziram o defeito: o middleware não recebia a exceção.
Validação das suítes dos dois roteadores, API HTTP e lifecycle hooks:
Validação adicional no FPC
Foi adicionado um teste de regressão independente em
tests/fpc-exception-propagation, com 34 casos (17 para Tree e 17 para Radix) e callbacks procedurais compatíveis com FPC.O teste foi compilado e executado em Linux x86_64, via Docker, com Free Pascal 3.2.2. Foram usados
-Bpara recompilar todos os fontes,-ghpara verificar memória e-glpara diagnóstico.heaptrc)HORSE_PROVIDER_EPOLLA validação cobre captura dos dois tipos de exceção pelo middleware, callbacks posteriores, middlewares internos, prioridade sobre
OnError, fallback sem middleware e após relançamento, JSON/status/Content-Type, preservação de respostas de erro e interrupção com e semOnError.Reprodução antes da correção: executando o mesmo teste com os três arquivos dos roteadores do commit base
31697a4, houve 18 falhas e 16 aprovações, com saída 1. As falhas apontam que a exceção não chegou ao middleware. Com a correção, foram 34/34 aprovações em cada configuração, com saída 0.Para reproduzir na raiz do repositório em Linux com FPC/FCL:
Esses testes FPC exercitam diretamente os dois roteadores, sem abrir servidor HTTP. A configuração Epoll confirma a compilação e execução com esse define; não constitui um teste do transporte HTTP. Os testes de API HTTP e lifecycle hooks da tabela anterior foram executados em Delphi.
git diff --checktambém passou.Antes de iniciar a correção, foi confirmado que o
masterlocal,origin/masterdo fork eupstream/masterdo Horse estavam sincronizados.CI e manutenção da cobertura
As duas configurações da regressão FPC foram integradas ao workflow
tests. Durante a reativação do CI, o job legado falhou porque o endereço antigo do Boss retornavaNot Found; uma compilação de controle confirmou também queConsole.dprdepende de Delphi/DUnitX, indisponível no ambiente FPC do job.O job Linux passou a executar as suítes portáveis existentes: propagação de exceções (padrão e Epoll), WebSocket EAGAIN, lifetime de roteadores, decodificação de URL, factory de streaming e configuração de providers. A suíte Delphi/DUnitX continua validada pelo script
tests/run_delphi_tests.ps1, com os resultados locais registrados acima. O job de keep-alive em FPC trunk permanece no workflow.