Erro com form-data no lazarus
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;
fazendo mais testes, verifiquei q o problema ocorre de forma geral, nao funciona com nenhuma requisicao no lazarus
Poderia montar algum exemplo? Porque eu peguei a pasta samples, e testei... aparentemente está normal no Delphi / Lazarus
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;
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)
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.