fix(routing): fix parameter tag overwriting and add configurable case… - #538
Merged
regyssilveira merged 1 commit intoJul 31, 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.
Pull Request: Correção de Sobrescrita de Parâmetros e Roteamento Case-Sensitive Configurável
📑 Descrição
Esta Pull Request resolve dois problemas críticos relacionados ao roteamento do Horse:
/ping/:id/testee/ping/:id2/teste2), a tag (nome) do parâmetro era sobrescrita pela primeira rota registrada devido à normalização interna dos parâmetros simples para:_parame ao uso de uma propriedade literalFTagestática no nó. Isso impedia que a segunda rota extraísse os parâmetros usando a chave correta.mastertornou as rotas estritamente case-sensitive para fins de performance. No entanto, para manter a retrocompatibilidade com versões anteriores que operavam por padrão como case-insensitive, foi introduzida a propriedade globalCaseSensitive(desativada por padrão).🛠️ Alterações Realizadas
1. Configuração Global de Sensibilidade de Caixa
THorseCore(src/Horse.Core.pas):FCaseSensitivee a propriedade de classeCaseSensitive: Boolean.FCaseSensitive := False(Case-Insensitive por padrão) na seção deinitialization.THorse(src/Horse.pas):CaseSensitivediretamente na fachada principal delegando ao core.2. Roteador Padrão (
THorseRouterTree)src/Horse.Core.RouterTree.pas:FTag: stringparaFTags: TArray<string>a fim de armazenar todas as tags de parâmetros mapeadas para aquele nó.AddTagpara garantir a unicidade de inclusão de chaves no array de tags.RegisterInternaleRegisterMiddlewareInternal, acumulamos chaves distintas de parâmetros que compartilham o mesmo nó. Além disso, seCaseSensitiveforFalse, os segmentos literais de rota são normalizados para minúsculo.CallNextPath,CountLiteralSegmentseHasNext), foi implementada a comparação opcional de caixa baseada na flagnot THorseCore.CaseSensitive.src/Horse.Core.RouterTree.NextCaller.pas:FTags: TArray<string>.Init(ao extrair os parâmetros dinâmicos), iteramos sobre o array de chaves do nó de parâmetro e injetamos o valor correspondente sob todas as tags registradas no dicionárioParamsda requisição.3. Roteador Radix (
THorseRadixRouter)src/Horse.Core.Router.Radix.pas:InsertRoutepara normalizar segmentos de caminho de forma condicional à configuraçãoCaseSensitive.FindNodepara suportar comparação exata ou insensível de caixa nas chaves de busca.MatchStaticRoute.🧪 Testes e Validação
1. Novos Testes Unitários
Adicionados dois testes de cobertura em
tests/src/tests/Tests.Horse.Core.RouterTree.pas:ExecuteRouteWithDifferentParamNamesAndSharedPrefix: Registra/ping/:id/testee/ping/:id2/teste2em paralelo e valida se a leitura do respectivo parâmetro (idouid2) funciona corretamente para cada uma das rotas.ExecuteRouteCaseSensitivity: Valida as requisições de rotas com a flagCaseSensitiveativada (comportamento estrito) e desativada (comportamento padrão/retrocompatível).2. Matriz de Compilação
Validada a compilação estática de todos os provedores e roteadores no ecossistema através do script
run_compile_matrix.ps1com 100% de sucesso: