Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Na versão Seattle o Body do Request não esta reconhecendo caracteres especiais #364

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

ds-sampaio
Copy link

Utilizando o windows, postman e Delphi Seattle.
Conteúdo do Body:
{ "nome": "TIPOSEPARACAO", "descricao": "Tipo de separação" }

Na api, na chegada do Request.Body:
{ "nome": "TIPOSEPARACAO",'#$D#$A' "descricao": "Tipo de separação"'}

Sugestão de correção no metodo Body do Horse.Request
function THorseRequest.Body: string; begin {$IF CompilerVersion <= 31.0} Result := TEncoding.UTF8.GetString(BytesOf(FWebRequest.RawContent)); {$ELSE} Result := FWebRequest.Content; {$ENDIF} end;

@viniciussanchez viniciussanchez added the bug Something isn't working label Nov 17, 2023
@viniciussanchez
Copy link
Member

@ds-sampaio chegou a testar esse código no Lazarus?

@ds-sampaio
Copy link
Author

@viniciussanchez No lazarus não cheguei a testar

@antoniojmsjr
Copy link
Contributor

Eu acho que essa alteração não é tão simples assim, desta forma está limitando a codificação em UTF-8, e por algum motivo pode estar sendo enviado no body um text com encoding ASCII que pode gera erro de codificação.

O problema não está no Horse, é sim na unit Web.HTTPApp.pas que faz o parse do body, verifica como está na tua versão do Delphi, estou usando o Delphi RIO 10.3.3.

image

@viniciussanchez
Copy link
Member

Sim... eu vejo alguns reclamando de problemas de encode mas realmente usamos aqui e até hoje sem problemas com acentuação. Pode realmente ser algum problema na versão do Delphi mesmo.

@antoniojmsjr
Copy link
Contributor

Sim... eu vejo alguns reclamando de problemas de encode mas realmente usamos aqui e até hoje sem problemas com acentuação. Pode realmente ser algum problema na versão do Delphi mesmo.

Uma alternativa é criar um overload da função Body passando um TEncoding, assim não fica engessado a codificação, por exemplo:

function Body(const Encoding: TEncoding): string; overload; virtual;

function THorseRequest.Body(const Encoding: TEncoding): string;
begin
  {$IF DEFINED(FPC)}
  Result := Body; // Tem que ver no Lazarus qual a classe de Encoding disponível, como default está retornando o Body
  {$ELSE}
  {$IF CompilerVersion <= 31.0}
  Result := Encoding.GetString(BytesOf(FWebRequest.RawContent));
  {$ELSE}
  Result := Encoding.GetString(FWebRequest.RawContent);
  {$ENDIF}
  {$ENDIF}
end;

@ds-sampaio
Copy link
Author

Então na minha versão do delphi que é o Seatlle ta diferente do teu Delphi Rio.
Veja:
image

@ds-sampaio ds-sampaio closed this Jan 16, 2024
@ds-sampaio ds-sampaio reopened this Jan 16, 2024
@ds-sampaio
Copy link
Author

ds-sampaio commented Jan 16, 2024

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual;
atende ao que preciso, posso realizar a alteração e enviar o PR?

@antoniojmsjr
Copy link
Contributor

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual; atende ao que preciso, posso realizar a alteração e enviar o PR?

O bom seria a gente identificar a classe de Encoding que tem disponível no Lazarus para implementar essa alteração também, no momento estou de férias e não vou consegui te ajudar agora, só na volta.

@antoniojmsjr
Copy link
Contributor

antoniojmsjr Essa solução de criar um overload function Body(const Encoding: TEncoding): string; overload; virtual; atende ao que preciso, posso realizar a alteração e enviar o PR?

Fiz um teste aqui no Lazarus e achei uma maneira de fazer o enconding:

function THorseRequest.Body(const Encoding: TEncoding): string;
{$IF DEFINED(FPC)}
var
  lContent: TStringStream;
{$ENDIF}
begin
  {$IF DEFINED(FPC)}
  try
    lContent := TStringStream.Create(FWebRequest.Content, Encoding);
    Result := lContent.DataString;
  finally
    lContent.Free;
  end;
  {$ELSE}
  {$IF CompilerVersion <= 31.0}
  Result := Encoding.GetString(BytesOf(FWebRequest.RawContent));
  {$ELSE}
  Result := Encoding.GetString(FWebRequest.RawContent);
  {$ENDIF}
  {$ENDIF}
end;

Compilado com sucesso Lazarus: ✅
Compilado com sucesso Delphi Rio: ✅
Compilado com sucesso Delphi Seatlle: ⁉️ - Consegue testar @ds-sampaio?

@ds-sampaio
Copy link
Author

@antoniojmsjr Realizei o teste e funcionou perfeitamente no Delphi Seatlle

@antoniojmsjr
Copy link
Contributor

@antoniojmsjr Realizei o teste e funcionou perfeitamente no Delphi Seatlle

Blz, altera os fontes e faz o commit.

@ds-sampaio
Copy link
Author

@antoniojmsjr Acabei de realizar o commit
@viniciussanchez

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

None yet

3 participants