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

Erro com form-data no lazarus #15

Open
mbertolani opened this issue Dec 29, 2023 · 5 comments
Open

Erro com form-data no lazarus #15

mbertolani opened this issue Dec 29, 2023 · 5 comments
Labels
bug Something isn't working

Comments

@mbertolani
Copy link

quando a requisicao é feita via form-data a condição do "if MatchText" da falso e dispara o raise.

if (Req.MethodType in [mtPost, mtPut, mtPatch]) then
begin
if (MatchText(Req.RawWebRequest.ContentType, THorseOctetStreamConfig.GetInstance.AcceptContentType.ToArray)) then
begin
LContentType := Req.RawWebRequest.ContentType;
LContent := TMemoryStream.Create;
LContentTMemoryStream := TMemoryStream(LContent);
GetAllDataAsStream(Req, LContentTMemoryStream);
Req.Body(LContent);
end
else
raise EHorseException.New.Error('Unknown Content-Type: ' + Req.RawWebRequest.ContentType).Status(THTTPStatus.BadRequest);
end;

@viniciussanchez viniciussanchez moved this to Todo in Horse Dec 29, 2023
@viniciussanchez viniciussanchez added the bug Something isn't working label Dec 29, 2023
@mbertolani
Copy link
Author

fazendo mais testes, verifiquei q o problema ocorre de forma geral, nao funciona com nenhuma requisicao no lazarus

@viniciussanchez
Copy link
Member

Poderia montar algum exemplo? Porque eu peguei a pasta samples, e testei... aparentemente está normal no Delphi / Lazarus

@adilsonmiro
Copy link

Quando você faz um request utilizando o form-data e na sua função, você não está usando octet-stream, como no código abaixo, ele dá o raise mencionado pelo @mbertolani.

Ao usar o octet-stream, ele funciona. Acredito que seja necessário incluir uma configuração se queremos usar o octet-stream na função ou não. Acredito que isso resolveria o problema.

function TFile.Upload(aFileName: string; aFile: TStream): string;
var
vMStream: TMemoryStream;
vFileName: string;
begin
try
if aFileName.Trim.IsEmpty then
raise Exception.Create('File Name not found!');

if (not(Assigned(aFile))) and (not(aFile.Size > 0)) then
  raise Exception.Create('File invalid!');

vMStream := TMemoryStream.Create;
try
  vFileName := TLib.New.AddPrefixFileName(aFileName);

  aFile.Position := 0;
  vMStream.LoadFromStream(aFile);
  vMStream.SaveToFile(Format('%s%s',[GetDir,vFileName]));
finally
  vMStream.DisposeOf;
end;

result := vFileName;

except
on e: exception do
begin
raise Exception.Create(e.Message);
end;
end;
end;

@adilsonmiro
Copy link

Criei um Middleware para resolver esse erro da seguinte forma:
THorseOctetStreamConfig.GetInstance.AcceptContentType.Add(Req.RawWebRequest.ContentType);

E adicionei o Middleware antes do Octet-stream:
THorse
.Use(CORS)
.Use(MrLibera('vitacon')) // Middleware criado
.Use(OctetStream)

@viniciussanchez
Copy link
Member

O que você pode fazer também, é aplicar o middleware de OctetStream apenas nas rotas específicas no qual o mesmo seria necessário. Assim acredito que não precisaria criar seu próprio middleware.

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: Todo
Development

No branches or pull requests

3 participants