Leia em English ou Português (BR).
O Horse mantém um core pequeno. Quase tudo que você associaria a um "framework web" — parsing JSON, CORS, JWT, compressão, logging — fica em pacotes de middleware separados e opt-in. Esta página cataloga os oficiais (mantidos pela HashLoad) e a lista da comunidade.
Para como o middleware realmente funciona, veja Middleware.
Para um ecossistema mais sustentável, os middlewares oficiais ficam em repositórios separados, não no core do Horse. Instale com o Boss:
boss install <repo>| Middleware | O que faz | Delphi | Lazarus |
|---|---|---|---|
| horse/jhonson | Parseia bodies JSON de requisição, serializa respostas JSON | ✔️ | ✔️ |
| horse/basic-auth | Autenticação HTTP Basic | ✔️ | ✔️ |
| horse/cors | Headers de Cross-Origin Resource Sharing + preflight | ✔️ | ✔️ |
| horse/stream | Tratamento de body application/octet-stream |
✔️ | ✔️ |
| horse/jwt | Autenticação por JSON Web Token | ✔️ | ✔️ |
| horse/exception | Converte exceptions lançadas em respostas JSON de erro consistentes | ✔️ | ✔️ |
| horse/logger | Log de acesso por requisição | ✔️ | ✔️ |
| horse/compression | Compressão gzip / deflate de resposta | ✔️ | ✔️ |
uses
Horse,
Horse.Jhonson,
Horse.CORS,
Horse.HandleException,
Horse.Logger,
Horse.JWT;
begin
THorse
.Use(Horse.HandleException.New) // mais externo — erros viram respostas limpas
.Use(Horse.Logger.New) // logar toda requisicao
.Use(CORS) // headers CORS + preflight OPTIONS
.Use(Jhonson) // parsear bodies JSON
.Use(JWT('secret')); // exigir token valido (mais interno)
// rotas …
THorse.Listen(9000);
end.A ordem de registro importa — veja Middleware.
Estes não são mantidos pela HashLoad mas estão listados aqui por serem usados com frequência. A lista cresce com o tempo — abra um PR contra este doc se o seu deveria estar aqui.
| Middleware | Descrição | Delphi | Lazarus |
|---|---|---|---|
| bittencourtthulio/etag | Geração de ETag | ✔️ | ✔️ |
| bittencourtthulio/paginate | Paginação de resposta de listagem | ✔️ | ✔️ |
| bittencourtthulio/cachecontrol | Headers Cache-Control | ✔️ | ❌ |
| gabrielbaltazar/gbswagger | Geração Swagger / OpenAPI | ✔️ | ❌ |
| willhubner/socketIO | Servidor Socket.IO | ✔️ | ❌ |
| dliocode/ratelimit | Rate limiting | ✔️ | ❌ |
| dliocode/slowdown | Atraso progressivo de requisição | ✔️ | ❌ |
| giorgiobazzo/upload | Helpers de upload de arquivo | ✔️ | ❌ |
| dliocode/query | DSL de query string | ✔️ | ❌ |
| CarlosHe/healthcheck | Endpoint /healthz |
✔️ | ❌ |
| CarlosHe/staticfiles | Serviço de arquivos estáticos | ✔️ | ❌ |
| CachopaWeb/horse-server-static | Serviço de arquivos estáticos (alternativa) | ✔️ | ✔️ |
| arvanus/horse-exception-logger | Log de exceptions | ✔️ | ✔️ |
| claudneysessa/Horse-CSResponsePagination | Paginação de resposta | ✔️ | ❌ |
| claudneysessa/Horse-XSuperObjects | Integração com XSuperObject | ✔️ | ❌ |
| andre-djsystem/horse-bearer-auth | Autenticação por Bearer token | ✔️ | ✔️ |
| andre-djsystem/horse-manipulate-request | Helpers de mutação de requisição | ✔️ | ✔️ |
| andre-djsystem/horse-manipulate-response | Helpers de mutação de resposta | ✔️ | ✔️ |
| antoniojmsjr/Horse-IPGeoLocation | Geolocalização de IP | ✔️ | ❌ |
| antoniojmsjr/Horse-XMLDoc | Geração de documentação XML | ✔️ | ❌ |
| isaquepinheiro/horse-jsonbr | Helpers JSON | ✔️ | ❌ |
| IagooCesaar/Horse-JsonInterceptor | Interceptor de JSON em requisição/resposta | ✔️ | ❌ |
| dliocode/horse-datalogger | Logger de dados estruturado | ✔️ | ❌ |
| weslleycapelari/horse-documentation | Geração automática de docs de API | ✔️ | ❌ |
| weslleycapelari/horse-validator | Validação de payload de requisição | ✔️ | ❌ |
| regyssilveira/horse-rate-limit | Controle de limite de requisições (Rate Limiting) com suporte a múltiplos storages | ✔️ | ✔️ |
| regyssilveira/horse-compression-v2 | Compressão de alta performance com suporte a Gzip, Deflate e Brotli | ✔️ | ✔️ |
| regyssilveira/horse-static | Servidor de arquivos estáticos de alta performance com suporte a Range, Cache e SPA Fallback | ✔️ | ✔️ |
| regyssilveira/horse-dto | Middleware de auto-binding e validação declarativa de dados | ✔️ | ✔️ |
| regyssilveira/horse-rbac | Controle de acesso baseado em funções (RBAC) e escopos (scopes) | ✔️ | ✔️ |
| regyssilveira/horse-schema-validation | Middleware de validação de esquemas (schemas) de payload de requisições | ✔️ | ✔️ |
| regyssilveira/horse-multipart | Middleware para processamento e parsing de corpos de requisição multipart/form-data | ✔️ | ✔️ |
| regyssilveira/horse-helmet | Middleware de segurança para proteção e configuração de cabeçalhos HTTP | ✔️ | ✔️ |
| regyssilveira/horse-ssl-redirect | Redirecionamento automático de requisições HTTP inseguras para HTTPS | ✔️ | ✔️ |
| regyssilveira/horse-crud | Middleware para o framework Horse voltado à geração automática e dinâmica de rotas CRUD a partir de entidades decoradas | ✔️ | ✔️ |
| regyssilveira/horse-request-id | Middleware de geração e rastreamento de Request ID (Correlation ID) para o ecossistema do framework Horse | ✔️ | ✔️ |
| regyssilveira/horse-sanitize | Middleware para sanitizar parâmetros de requisições do ecossistema Horse contra XSS e injeções nocivas | ✔️ | ✔️ |
Estes são middlewares focados em observabilidade, métricas e rastreamento de aplicações:
| Middleware | Descrição | Delphi | Lazarus |
|---|---|---|---|
| marcobreveglieri/horse-prometheus-metrics | Endpoint de métricas Prometheus | ✔️ | ❌ |
| regyssilveira/horse-opentelemetry | Integração com OpenTelemetry para rastreamento distribuído | ✔️ | ✔️ |
| regyssilveira/horse-prometheus | Integração com Prometheus para coleta de métricas | ✔️ | ✔️ |
Além de middleware, a comunidade produziu Providers de transporte alternativos — a camada que o Horse usa para ser dono do socket e parsear HTTP. Este é um eixo separado da lista de middlewares acima (veja Providers e Tipos de aplicação para o modelo conceitual completo). Os Providers de terceiros ativamente mantidos são:
| Provider | Descrição | Licença | Repositório |
|---|---|---|---|
| horse-provider-crosssocket | Transporte assíncrono IOCP / epoll / kqueue. Substitui o Provider padrão Indy pelo Delphi-Cross-Socket. A instalação é manual (espelha o mORMot2): clone winddriver/Delphi-Cross-Socket + cnpack/cnvcl e adicione os search paths. Alternativa suportada para usuários de mTLS ou que querem uma dependência única: freitasjca/Delphi-Cross-Socket v1.0.3 (embute o CnPack + APIs de mTLS). Ativado por HORSE_PROVIDER_CROSSSOCKET. Exige Delphi 10.2+ / FPC 3.2+. Baseline de teste: 80 passados / 1 falho (a limitação documentada de Set-Cookie multi-valor do core do Horse). |
MIT | freitasjca/horse-provider-crosssocket |
| horse-provider-mormot | Transporte assíncrono IOCP / epoll. Substitui o Provider padrão Indy pelo THttpServer do mORMot2 — pure Pascal, sem deps em C compilado para HTTP padrão. Troca opcional para THttpApiServer para HTTP em modo kernel via http.sys no Windows. Ativado por HORSE_PROVIDER_MORMOT. Compatível com Delphi 7 até 12.3 Athens e FPC 3.2+. Inclui units de conveniência cross-product para Console, VCL, Daemon (TService Windows + runner POSIX), LCL Lazarus, e HTTPApplication FPC. |
MIT | freitasjca/horse-provider-mormot |
Os dois Providers usam a mesma arquitetura de interface híbrida (IHorseRawRequest / IHorseRawResponse), então todo middleware do Horse funciona sem alterações em qualquer um. Os dois defines de Provider são mutuamente exclusivos — exatamente um transporte por build.
Veja Providers e Tipos de aplicação para quando trocar o transporte Indy padrão, a matriz de compatibilidade vs. cada Tipo de aplicação, e como combinar as duas escolhas.
- Publique seu pacote com um
boss.jsoncompatível com Boss. - Abra um PR contra
doc/middleware-ecosystem.pt-BR.md(e/oudoc/middleware-ecosystem.md) adicionando uma linha na tabela apropriada. - Confirme que compila na matriz que você está alegando (Delphi / Lazarus).
Não há exclusividade — qualquer pessoa pode publicar um pacote compatível com Horse sem coordenação.
- Middleware — o modelo, como criar o seu, ordem de registro.
- Providers — middleware funciona entre todos os transportes; por isso.