horse-octet-stream icon indicating copy to clipboard operation
horse-octet-stream copied to clipboard

Erro com form-data no lazarus

Open mbertolani opened this issue 2 years ago • 5 comments

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;

mbertolani avatar Dec 29 '23 11:12 mbertolani

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

mbertolani avatar Dec 29 '23 13:12 mbertolani

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

viniciussanchez avatar Dec 29 '23 13:12 viniciussanchez

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 avatar Mar 03 '24 20:03 adilsonmiro

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)

adilsonmiro avatar Mar 03 '24 21:03 adilsonmiro

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.

viniciussanchez avatar May 08 '24 16:05 viniciussanchez