HashLoad / horse

Fast, opinionated, minimalist web framework for Delphi
MIT License
1.17k stars 217 forks source link

Erro de execução com Lazarus 3.0, FPC 3.2.2, Ubuntu 23.10 e Horse Trunk #360

Open edsontmarques opened 1 year ago

edsontmarques commented 1 year ago

Criei um projeto simples de teste com o código de exemplo que encontra-se em https://github.com/HashLoad/horse. Configurei o Project Options definindo os Build Modes padrões criados pelo Lazarus (Project Options > Compiler Options > Botão '...' no topo do form). Com isso o Lazarus cria os Build Modes "Release" e "Debug". Ajustei o Build Mode para Debug e Rodei a API básica com o Lazarus. Entrei no Firefox e enviei a requisição "localhost:9000/ping".

O Lazarus levantou uma exceção de "Invalid Typecast" na unit Horse.Core.RouterTree.NextCaller linha 89. Deixei continuar a execução e o firefox me mostrou o seguinte retorno:

`The application encountered the following error:

Error: Invalid type cast
Stack trace:
$00000000005DE23D Next, line 89 of ../../../../../frameworks/fpc/horse/src/Horse.Core.RouterTree.NextCaller.pas
$00000000004E566F ExecuteInternal, line 187 of ../../../../../frameworks/fpc/horse/src/Horse.Core.RouterTree.pas
$00000000004E5401 Execute, line 149 of ../../../../../frameworks/fpc/horse/src/Horse.Core.RouterTree.pas
$00000000005E050A HandlerAction, line 94 of ../../../../../frameworks/fpc/horse/src/Horse.WebModule.pas
$00000000005E03CB DoOnRequest, line 79 of ../../../../../frameworks/fpc/horse/src/Horse.WebModule.pas
$00000000005E13A4`

Fazendo alguns testes na configuração do Build Mode Debug gerado pelo Lazarus, percebi que se Desligarmos o parâmetro Project Options > Compiler Options > Debugging > Checks and assertion > Verify method calls (-CR) , o erro acima não acontece e o retorno para requisição é "Pong", como esperado.

Valmadson commented 1 year ago

Aproveitando a observação do Edson, gostaria também de relatar que utilizando o lazarus 3.99 trunk , um simples ping/pong apresenta a seguinte mensagem abaixo :  

SOs: Manjaro e Pop! OS

This binary has no thread support compiled in. Recompile the application with a thread-driver in the program uses clause before other units using thread. Runtime error 232 at $000000000041B2C3 $000000000041B2C3 $000000000046A8DE  LISTEN,  line 142 of ../horse/src/Horse.Provider.FPC.HTTPApplication.pas

viniciussanchez commented 6 months ago

@edsontmarques @Valmadson acharam alguma solução para o problema? Não tivemos mais relatos quanto a esse tipo de situação...

edsontmarques commented 6 months ago

Vinícius, Infelizmente estive envolvido com vários problemas fora da área de programação e precisei deixar o desenvolvimento da API no ponto que estava. Não tive como voltar a verificar se o problema continua acontecendo ou se mudou com as novas versões do Lazarus e FPC.

josedachao commented 5 months ago

Edson, vc está rodando em Linux, não é? Verifique como está declarada a unit CThreads na Unit principal do seu projeto. Veja se está como abaixo e ela tem que vir antes da declaração da Unit do horse: tente adicionar essa unit antes do horse:

{$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Horse;

Além do -CR

edsontmarques commented 5 months ago

Então... O meu dpr está assim:

program project1;

{$MODE DELPHI}{$H+}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  Horse;

procedure GetPing(Req: THorseRequest; Res: THorseResponse);
begin
  Res.Send('Pong');
end;

begin
  THorse.Get('/ping', GetPing);
  THorse.Listen(9000);
end.   

E como expliquei antes, quando a gente ajusta a configuração do Lazarus para ele criar automaticamente os "build mode", o -CR é já vem setado para o mode debug.

Aproveito para responder ao Vinicius ... Acabei de refazer o mesmo teste do início deste post (tomando o cuidado de atualizar o meu repositório do horse com o da hashload) e o caso relatado continua acontecendo.

" Project project1 raiser exception class 'EInvalidCast'. In file 'Horse.Core.RouterTree.NextCaller.pas'at line 89: else if (FPath.Count = 0) and Assigned(FCallBack) then "

Confirmo também que basta entrar nas configurações do projeto e remover o -CR que a issue não ocorre.

Infelizmente não estou com condições de aprofundar a pesquisa por uma solução no momento.