Skip to content

Query string: '+' não é decodificado como espaço #587

Description

@willder-root

Descrição

Valores de query string enviados com + no lugar de espaço não são decodificados.
Clientes como o axios serializam params: { name: 'João da Silva' } como
?name=Jo%C3%A3o+da+Silva, mas Req.Query['name'] retorna João+da+Silva
em vez de João da Silva.

Em application/x-www-form-urlencoded (formato usado pela query string), +
significa espaço, e um + literal é enviado como %2B.

Passos para reproduzir

THorse.Get('/hello',
  procedure(Req: THorseRequest; Res: THorseResponse)
  begin
    Res.Send(Req.Query['name']);
  end);
await axios.get('http://localhost:9000/hello', { params: { name: 'João da Silva' } });
// requisição: GET /hello?name=Jo%C3%A3o+da+Silva

Comportamento esperado

Req.Query['name'] retorna João da Silva.
?q=a%2Bb retorna a+b.

Comportamento atual

Req.Query['name'] retorna João+da+Silva.

Causa

THorseRequest.InitializeQuery decodifica com DecodeParam (src/Horse.Utils.pas),
que devolve o valor sem alteração quando não há % nele. Mesmo quando há %,
o TNetEncoding.URL.Decode não trata + como espaço por padrão.

Não dá para alterar o DecodeParam para converter +, porque ele também é usado
nos parâmetros de rota, onde + é um caractere literal (e o Tests.Horse.Utils
garante esse comportamento).

Proposta de correção

Adicionar DecodeQueryParam ao Horse.Utils, usando
TNetEncoding.URL.Decode(AValue, [TURLEncoding.TDecodeOption.PlusAsSpaces])
no Delphi e HTTPDecode no FPC, e usá-lo apenas na decodificação da query
dentro do InitializeQuery.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions