Skip to content

Feature/websocket - #532

Merged
regyssilveira merged 3 commits into
HashLoad:masterfrom
regyssilveira:feature/websocket
Jul 15, 2026
Merged

Feature/websocket#532
regyssilveira merged 3 commits into
HashLoad:masterfrom
regyssilveira:feature/websocket

Conversation

@regyssilveira

Copy link
Copy Markdown
Contributor

feat: Add native WebSocket support (RFC 6455) across all core providers

Este Pull Request introduz o suporte nativo e thread-safe a conexões bidirecionais WebSocket (especificação RFC 6455) no núcleo e provedores do ecossistema do framework Horse, com total compatibilidade retroativa e comportamento Fail-Fast estruturado.


🎯 Objetivos da Implementação

  • Upgrade de Protocolo Limpo: Elevação dinâmica de conexões HTTP para WebSocket de forma fluida através de Res.UpgradeToWebSocket.
  • Zero Overhead & Thread-Safety: Manipulação concorrente protegida por seções críticas internas e thread dedicada para gerenciamento de Heartbeat/Keep-Alive (Ping/Pong) a nível de socket.
  • Desacoplamento por IoC: Injeção e resolução de adaptadores de I/O específicos dos provedores através do container de escopo de request nativo do Horse (Req.Services).
  • Multiplataforma Nativo: Suporte validado em compiladores Delphi (Windows/Linux) e Lazarus/FPC (Windows/Linux via Docker).

🛠️ Detalhes das Alterações

1. Núcleo de WebSocket

  • Horse.Core.WebSocket.pas:
    • Handshake RFC 6455 unificado (THorseWebSocketHandshake) calculando chaves baseadas em SHA-1 de forma compatível com FPC e Delphi clássicos.
    • Parser e Enquadrador (THorseWebSocketParser) que gerencia fragmentação de payloads, máscaras XOR e controle de frames (texto, binário, ping, pong, close).
    • Gerenciador de conexões (THorseWebSocketManager) que agrupa conexões ativas por rotas e realiza broadcasts inteligentes e thread-safe.

2. Modificações na API Core do Horse

  • Horse.Request.pas e Horse.Response.pas:
    • Adicionados métodos auxiliares para handshake: IsWebSocket e WebSocketKey.
    • Método UpgradeToWebSocket que resolve o adaptador do provedor ativo e eleva o socket.
    • Mecanismo Fail-Fast: Caso o handshake falhe ou o provedor ativo seja incompatível (ex: HttpSys, Apache, CGI), o servidor responde imediatamente com status 400 ou 501 e interrompe o pipeline de forma limpa.

3. Integração com Provedores Físicos

Implementamos adaptadores de I/O específicos para os principais motores de transporte do Horse:

  • Indy (Horse.Provider.Indy.WebSocket.pas): Adaptador de socket integrado ao TIdContext da Indy.
  • Sockets Puros (Horse.Provider.Socket.WebSocket.pas): Adaptador multiplataforma de I/O em sockets brutos (WinSock2/POSIX) injetado com sucesso nos seguintes provedores:
    • IOCP (Windows I/O Completion Ports)
    • Epoll (Linux nativo)
    • FPC Daemon e FPC LCL (Servidores Lazarus)

🧪 Matriz de Validação e Testes Multiplataforma

A suíte de testes de integração do DUnitX foi estendida com a unit Tests.Integration.WebSocket.pas cobrindo:

  1. Conformidade de handshake.
  2. Comportamento sob requisições de elevação inválidas (retorno 400).
  3. Comportamento em provedores incompatíveis (retorno 501).

Resultados obtidos:

  • Delphi 10 Seattle até Delphi 13 Florence (Windows): Compilação e testes concluídos com sucesso. Correções de retrocompatibilidade de loop inline aplicadas.
  • Delphi Linux (Linux 64-bit ELF): Compilação cruzada com o compilador dcclinux64.exe gerada com sucesso total.
  • Lazarus/FPC Linux (Docker): Dockerfile de testes do FPC no Ubuntu compilado com sucesso, garantindo estabilidade multiplataforma em ambientes conteinerizados.

🎥 Aplicação de Demonstração & APM Dashboard

Para demonstrar visualmente o poder da latência ultra-baixa dos WebSockets, criamos um projeto exemplo independente na pasta d:\horse-websockets contendo:

  • Um servidor Horse APM que coleta uso de memória e RPS.
  • Um dashboard cyberpunk moderno em HTML5/ApexCharts neon alimentado via WebSocket.
  • Simulador de teste de stress de carga HTTP que demonstra a atualização dos gráficos em tempo real via WebSocket com latência imperceptível.

(Uma prévia animada da execução do dashboard foi integrada localmente ao README.md do projeto exemplo).

@regyssilveira
regyssilveira merged commit ea6cb24 into HashLoad:master Jul 15, 2026
@regyssilveira
regyssilveira deleted the feature/websocket branch July 15, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant