Skip to content

fix(routing): fix parameter tag overwriting and add configurable case… - #538

Merged
regyssilveira merged 1 commit into
HashLoad:masterfrom
regyssilveira:feature/fix-shared-params-routing
Jul 31, 2026
Merged

fix(routing): fix parameter tag overwriting and add configurable case…#538
regyssilveira merged 1 commit into
HashLoad:masterfrom
regyssilveira:feature/fix-shared-params-routing

Conversation

@regyssilveira

Copy link
Copy Markdown
Contributor

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:

  1. Sobrescrita de Tags de Parâmetros com Prefixo Compartilhado: Em rotas que compartilham o mesmo nó do prefixo de parâmetro (por exemplo, /ping/:id/teste e /ping/:id2/teste2), a tag (nome) do parâmetro era sobrescrita pela primeira rota registrada devido à normalização interna dos parâmetros simples para :_param e ao uso de uma propriedade literal FTag estática no nó. Isso impedia que a segunda rota extraísse os parâmetros usando a chave correta.
  2. Case-Sensitivity Configurável nas Rotas: A branch master tornou 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 global CaseSensitive (desativada por padrão).

🛠️ Alterações Realizadas

1. Configuração Global de Sensibilidade de Caixa

  • THorseCore (src/Horse.Core.pas):
    • Adicionado o campo FCaseSensitive e a propriedade de classe CaseSensitive: Boolean.
    • Inicializado FCaseSensitive := False (Case-Insensitive por padrão) na seção de initialization.
  • THorse (src/Horse.pas):
    • Exposta a propriedade CaseSensitive diretamente na fachada principal delegando ao core.

2. Roteador Padrão (THorseRouterTree)

  • src/Horse.Core.RouterTree.pas:
    • Alterado o campo interno FTag: string para FTags: TArray<string> a fim de armazenar todas as tags de parâmetros mapeadas para aquele nó.
    • Implementado o método auxiliar AddTag para garantir a unicidade de inclusão de chaves no array de tags.
    • Em RegisterInternal e RegisterMiddlewareInternal, acumulamos chaves distintas de parâmetros que compartilham o mesmo nó. Além disso, se CaseSensitive for False, os segmentos literais de rota são normalizados para minúsculo.
    • Nos métodos de busca e resolução (CallNextPath, CountLiteralSegments e HasNext), foi implementada a comparação opcional de caixa baseada na flag not THorseCore.CaseSensitive.
  • src/Horse.Core.RouterTree.NextCaller.pas:
    • Alterado o tipo interno para FTags: TArray<string>.
    • No método 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ário Params da requisição.

3. Roteador Radix (THorseRadixRouter)

  • src/Horse.Core.Router.Radix.pas:
    • Atualizado InsertRoute para normalizar segmentos de caminho de forma condicional à configuração CaseSensitive.
    • Atualizado FindNode para suportar comparação exata ou insensível de caixa nas chaves de busca.
    • Ajustada a compilação cruzada para FPC/Lazarus no Linux com suporte a comparação de bytes case-insensitive em 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/teste e /ping/:id2/teste2 em paralelo e valida se a leitura do respectivo parâmetro (id ou id2) funciona corretamente para cada uma das rotas.
  • ExecuteRouteCaseSensitivity: Valida as requisições de rotas com a flag CaseSensitive ativada (comportamento estrito) e desativada (comportamento padrão/retrocompatível).
  • Resultado: Ambas as asserções de testes passaram com sucesso!

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.ps1 com 100% de sucesso:

  • Delphi 10 Seattle: SUCESSO (16/16 cenários)
  • Delphi 11 Alexandria: SUCESSO (16/16 cenários)
  • Delphi 12 Athens: SUCESSO (16/16 cenários)
  • Delphi 13 Florence: SUCESSO (16/16 cenários)
  • FPC / Lazarus (Linux Docker): SUCESSO (10/10 cenários)

@regyssilveira
regyssilveira merged commit da4eb9a into HashLoad:master Jul 31, 2026
@regyssilveira
regyssilveira deleted the feature/fix-shared-params-routing branch July 31, 2026 20:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant