Fast, opinionated, minimalist web framework for Delphi
⭐ https://github.com/HashLoad/horse/commit/e52a0b20793976492d22aa755e51048e9bfe8329 Adicionado o "detail" em EHorseException.ToJSONObject Added "detail" on EHorseException.ToJSONObject
⭐ https://github.com/HashLoad/horse/commit/95ed98c2197c040e052c71ad40999ce1d7300dae Adicionado o middleware Horse-XMLDoc Add new middleware Horse-XMLDoc
⭐ https://github.com/HashLoad/horse/commit/2679601129d1f2ae9bd6b724ce08c5ba7c0bdc7d Adicionado MaxConnections no módulo Apache Added MaxConnections on Apache mode
⭐ https://github.com/HashLoad/horse/commit/815933af7de790b46c583de5f8bcdf766222246b Adicionado métodos virtuais Added virtual methods
🔺https://github.com/HashLoad/horse/commit/fbe902589aa431834c10b2426ed23e4e1e5fc47a Correção de memory leaks Bug fix: memory leak
🔺https://github.com/HashLoad/horse/commit/e53c4850253818df6879baee478dad1113bdd6d6 Correção na opção Apache Module Bug fix: Apache module option
🔺https://github.com/HashLoad/horse/commit/abf8c10e1d84475682fa59ad74a382cac9a8d616 Correção de erro mime types Bug fix: horse mime types
⭐ 26ca310c08efd96b1600e74bc793fad46f23db9f Overload do método construtor com opção para informar o erro Created a overload constructor with string parameter
⭐ 24dc9b2667e399448a27d0d90e3ecf5da933f5bc 3589a8d16184eb9b648d8307aa397b291449d4bd Adicionado Contains, StartsWith e EndsWith no LHS Brackets Add new LHS Brackets: Contains, StartsWith and EndsWith
⭐ 5b7065a2cfc65ad495dabac3b165d502a874ad24 Adicionado a property Detail e adicionado o método ToJsonObject Added Detail property and ToJsonObject method
✔ f3088cdd4394a58569d3c135376bdc1a80ba1e7b 897108df7f2dbf5f91138f02e1d76c58be876aec Melhorias no código Code improvements
🔺 a63094cae39b8dc3e86ea292b824fef525f99a76 Hotfix Correção do Get Environment Variables usando Delphi para Linux Get Environment Variables using Delphi for Linux
🔺 0d839f9fec3721a388fe03903cb73d1c66d019a3 Correção de erro no provider VCL (Alexandre Magno) Bug fix VCL provider (Alexandre Magno)
🔺 8e266969324c506e0ea43e7e3089581c5f9fc1fc Correção do uses na unit Horse.Exception para FPC Fix uses clause of Horse.Exception when FPC is defined
🔺 f1fc61e00e2dd07a5d453f0ea9cf941c3792849d Bug na compilação para Lazarus Bug fix: lazarus build
✔ 30c0e2e5dd4b41081de00e04dea0bc4272e136bf KeepConnectionAlive como padrão será True KeepConnectionAlive default is true
🔺 cb824bcc45f30840ee8dcd3f6aae8e5b8ab4b8d5 Correção de erro: query params com espaços em branco Bug fix: Query params field with blank space
🔺 c73c237f64914f3aa4570c47601c68e2dc082a00 Correção de erro: ao acessar um endpoint que não existe Bug fix: not found
⭐ b0bea0f1e1c2aed3bf260dfa53469d8e637bfabb #330 Horse.Exception - Preencher propriedade Message Horse.Exception - Populate Message property
✔ 5b412a5e6b32e8ca9278c7254c01ac8cf1858a31 1f1859ec83941385f436210233609e7c90af9e04 Alteração do README.md Updated README.md
🔺 e99d380e195cbbcbd6bfc9d47060608155cf6d75 #332 - Alterando a comparação de String.IsEmpty para igual a EmptyStr, para compatibilidade com Delphi 10 Seattle Changing comparison of String.IsEmpty to equal EmptyStr, for compatibility with Delphi 10 Seattle
⭐ b9171261455d067847789317a1a112ae2fe6f4ab Nova unit Horse.Mime que implementa a classe THorseMimeTypes responsável por retornar o tipo MIME associado à extensão de um arquivo New Horse.Mime unit that implements the THorseMimeTypes class responsible for returning the MIME type associated with a file extension
⭐ 7d2e174950913f89925e9d403d78b1c8ae0ca425 Adicionado a opção de poder trabalhar com regex nas rotas Added the option to work with regex on routes
THorse.Get('/(discussion|page)/:id',
procedure(Req: THorseRequest; Res: THorseResponse)
begin
Res.Send('Hello - ID: ' + Req.Params.Items['id']);
end);
THorse.Get('/(\d{5})',
procedure(Req: THorseRequest; Res: THorseResponse)
begin
Res.Send('Hello - ID: ' + Req.RawWebRequest.PathInfo);
end);
THorse.KeepConnectionAlive := True;
THorse.IOHandleSSL
.DHParamsFile('')
.CipherList('');
raise EHorseException.New.Hint('');
Res.RemoveHeader('');
THorse.All('*',
procedure(Req: THorseRequest; Res: THorseResponse)
begin
Res.Send(Req.PathInfo);
end);
Req.Host;
Req.PathInfo;
Req.ContentType;
✔ f29a9f9f778d75b2b5a26c3f6a056b54241ba9a3 Refatoração da unit Horse.Core.Files para utilização da classe THorseMimeTypes da unit Horse.Mime Refactoring of the Horse.Core.Files unit to use the THorseMimeTypes class of the Horse.Mime unit
✔ 73b6bd0c8886344d92bf52eab6fb12a7aaf218f8 Refatoração da unit Horse.Response para utilização da classe THorseMimeTypes da unit Horse.Mime Refactoring of the Horse.Response unit to use the THorseMimeTypes class of the Horse.Mime unit
✔ 378af0a7b0d84ba18fc124f3fc3070bce796618e Melhorias no código Code improvements
✔ dcb1b6392412c864273c5549d59fdcd498755c13 Agora o Horse vai definir o position igual a zero por padrão na função SendFile e a passagem do nome do arquivo se tornou opcional Now Horse will set position equal to zero by default in the SendFile function and passing the file name has become optional
✔ b15e33373afdd39f3ac348b23400972e7aea0bef Agora o Horse vai definir o position igual a zero por padrão na função Download Now Horse will set the position equal to zero by default in the Download function
✔ 6c6be4f31417be4e639b3c06d31576435483570a Implementação da interface IHorseProviderIOHandleSSL e refatoração do código Implementing the IHorseProviderIOHandleSSL interface and refactoring the code
// Antes / Old
THorse.IOHandleSSL.KeyFile := leKey.Text;
THorse.IOHandleSSL.CertFile := leCrt.Text;
THorse.IOHandleSSL.OnGetPassword := Self.OnGetPassword;
THorse.IOHandleSSL.SSLVersions := [sslvTLSv1_2];
THorse.IOHandleSSL.Active := True;
// Agora / New
THorse.IOHandleSSL
.KeyFile(leKey.Text)
.CertFile(leCrt.Text)
.OnGetPassword(Self.OnGetPassword)
.SSLVersions([sslvTLSv1_2])
.Active(True);
✔ 14e88c6525c7f71621b9d34ae00dbe0f189e94e4 Adicionado um atalho para a classe THorseMimeTypes na unit principal do Horse Added a shortcut for the THorseMimeTypes class in the main Horse unit
✔ b0bea0f1e1c2aed3bf260dfa53469d8e637bfabb Preenchimento da propriedade Message ao definir o erro de uma exceção do Horse Completion of the Message property when defining the error of a Horse exception
✔ 8794e0f466b188731abc9bce484033612ab3a1e1 Ajustes dos exemplos e remoção de hints e warnings do Horse no lazarus Example tweaks and removal of Horse hints and warnings in lazarus
✔ be629fbe3dc7124ec582fd04e3bdfb830651319d Remoção de Hints Removing Hints
✔ 86846502b56c9a3327ac6bc3f42d56129ef37622 Remoção do parâmetro no callback do THorse.Listen Removal of the parameter in the THorse.Listen callback
// Antes / Old
THorse.Listen(9000,
procedure(Horse: THorse)
begin
Writeln(Format('Server is runing on %s:%d', [Horse.Host, Horse.Port]));
Readln;
end);
// Agora / New
THorse.Listen(9000,
procedure
begin
Writeln(Format('Server is runing on %s:%d', [THorse.Host, THorse.Port]));
Readln;
end);
✔ ee33a2ab922c4a5172b387758db1bb268c959e37 eb995d470112fa7d1ee97a7c1007eddb37b0c958 Alterações referentes ao novo FPC Changes related to the new FPC
🔺 9678960c4ac6cab1ab25a957e76b4b2e040fa14c Ajustes na unit Horse.Provider.FPC.LCL para não congelar a tela quando executar (Contribuição do Alexandre Magno) Adjustments in the Horse.Provider.FPC.LCL unit to not freeze the screen when running (Contributed by Alexandre Magno)
🔺 76dc02edc369a6031a6054cb7da85fbb125b364f Correção da falha ao ler os headers no Apache com Delphi Fixed crash when reading headers in Apache with Delphi
🔺 d69190ed2d46f3971a1c050fc32ddfef6ab092c9 Ajustes para compilação no Lazarus Lazarus build tweaks
🔺 cc35d4dc61fe0aaa58ae8b37cb8c6368e5be684b Correção do erro ao ler os parâmetros do formulário no Delphi Seattle Fixed error when reading form parameters in Delphi Seattle
🔺 039bbe0ccceba1e7e2df75726cb00b3f7e4dce5c 118dcc1893be37d7ac5dde7e970390f1e1385d79 Correção no exemplo para definição das rotas Correction in the example for defining routes
🔺 be376bceedf03daec8eb90b7fbb0de5c3c776308 5d43ba692e82b804bbec6c248f47777bc1411e58 Correção do erro ao ler os headers no CGI Fixed error when reading headers in CGI
🔺 b6e3ea5284a8ae043082546292c670267868cefb f63e3db46c151cd047d1dfd375bbf85ce81aeb61 22519149cc48b8465fdb93001fe8f8ac672f8a28 Correção na leitura do PathInfo com CGI quando o PathInfo estiver vazio Fix for reading PathInfo with CGI when PathInfo is empty
⭐ 3849b9ca43ca3373b81809e98a43a35bf3780cb8 Exemplo do Lazarus para criar assinatura JWT Lazarus sample to create JWT signature
⭐ 24f1f43166291f08e1c2cf02000ec9b93680bfbf 2e45888efa022fac5a554c1eab0d46c74ef67311 JWT com multichamada JWT with multicall
⭐ 14f5b7f130938b5bb36883459622dc6354cdade8 Compatibilidade com o novo FPC Mode switch function references for new FPC
⭐ c70f3fb358211a5b53f1bbacfcddc18ac29a9159 edb53ec107d2f6028a350367b3da3e8d781eccea Validação para várias rotas Validation for multiples routes
✔ 5d34226ce6f0cbd64908db892a47b8fd6870bb08 37daa990f44720d4b32de130affcc3fa81191e6f 450a4572c8008b6774cdac34e22d9bfca0a32b45 be02a6d5ad127251b9c54037bfebbcb980f90a19 dddd919f246ba473783171f4dae54033ed4aa517 Refatoração Refactoring
✔ 4dcd37abf53d5568a47b35c38db84a26ba8197e2 b1ecfa5e588e3a5b0ad1cd5b703543567c360f45 Remoção de linhas em branco Removing some blank lines
✔ aa5d3f9c3d600234b2fae471d6a26584e9e4d69a Exemplo de sessão Session example
🔺 2b457baa4d614e8ef67332029e77ed1c6081cfff Revertendo o código-fonte para compatibilidade com Lazarus, correção de vazamento e refatoração de código Rolling back source code for lazarus compatibility, leak fix and code refactoring
✔ c2186f9d78310aa8ebb864401ac8ead008d85bb2 Refatoração do código de geração do JSON da classe de erro EHorseException, para utilizar o método ToJSON da classe EHorseException Refactoring of the JSON generation code of the EHorseException error class, to use the ToJSON method of the EHorseException class
🔺 567f8d763d4d9ecd66325c6dd41f7364727e0841 Ajuste para compilação Lazarus Tweak for Lazarus build
✔ adf80d0dcbcdb68cab8ee14af6b2e9fded9c19b0 Conteúdo como hex Content as hex
✔ ad8d6006ffdfbdac0be1cf4f6dc3ee5de64fdb2d f5fb61fddcd687ce2fb733899bfca42bc685eb7d Compatibilidade com o Lazarus Lazarus compatibility
🔺 422fde83076056a24fb9ba06a259ee342cb181a6 Exceção ao receber solicitação com binário Exception on receive request with binary
🔺 aab7bfc1c847712296632a918d524f7567de0075 Não cria as pastas com mais de um nível Do not create folders with more than one level
🔺 8ba032277b05165da7c3f480fb1e2100ae2647af Diretório personalizado de log não funciona Custom directory of log not works
🔺 0e9f773946613684935bd5fe122730b1396a38fb 9d0288deb1db1a11ca73d6b89d6c197fa8191bd4 Correção de bug: arquivo de log no servidor de aplicativos IIS Bug fix: log file on IIS application server
Example: http://localhost:9000/ping?test[eq]=1234&test[lt]=321&test[ne]=111
procedure GetPing(Req: THorseRequest; Res: THorseResponse);
var
LPong: TJSONArray;
LLhsBracketType: TLhsBracketsType;
LJson: TJSONObject;
begin
THorseCoreParamConfig.GetInstance.CheckLhsBrackets(True);
LPong := TJSONArray.Create;
for LLhsBracketType in Req.Query.Field('test').LhsBrackets.Types do
begin
LJson := TJSONObject.Create;
LJson.Add(Format('test %s =', [LLhsBracketType.ToString]) , Req.Query.Field('test').LhsBrackets.GetValue(LLhsBracketType));
LPong.Add(LJson);
end;
Res.Send(LPong.AsJSON);
end;
Req.ContentFields.Field('paramName').AsStream;
Req.ContentFields.Field('paramName').SaveToFile('C:\file.txt');
// before
Res.RawWebResponse.SetCustomHeader('', '');
// after
Res.AddHeader('', '');
procedure GetPing(Req: THorseRequest; Res: THorseResponse; Next: TNextProc);
begin
Res.Send('Req, Res, Next');
end;
procedure GetPing1(Req: THorseRequest; Res: THorseResponse);
begin
Res.Send('Req, Res');
end;
procedure GetPing2(Req: THorseRequest);
begin
WriteLn('Req');
end;
begin
THorse.Get('/ping', GetPing);
THorse.Get('/ping1', GetPing1);
THorse.Get('/ping2', GetPing2);
THorse.Listen(9000);
end.
THorse.All('/users', DoUsers);
Res.SendFile('E:\temp\foto.jpg');
Res.Download('E:\temp\foto.jpg');
Res.Render('E:\Temp\Client.html');
THorse.Version;
THorse
.AddCallbacks([Callback1, Callback2, Callback3])
.Get('/users', DoListUsers);
Live de lançamento em português: Youtube Launch live in Portuguese: Youtube
THorse.Get('/headers',
procedure(Req: THorseRequest; Res: THorseResponse; Next: TProc)
var
LData: TJSONObject;
LHeader: TPair<string, string>;
begin
LData := TJSONObject.Create;
for LHeader in Req.Headers.ToArray do
LData.AddPair(LHeader.Key, LHeader.Value);
Res.Send(LData);
end);
THorse.Get('/requests',
procedure(Req: THorseRequest)
begin
// default status code 204 NoContent
end);
THorse.Get('/responses',
procedure(Res: THorseResponse)
begin
Res.Send('ok');
end);
THorse.Get('/requests/responses',
procedure(Req: THorseRequest; Res: THorseResponse)
begin
Res.Send('ok');
end);
http://localhost:9000/ping?nome=vinicius&nome=sanchez