Cliente & servidor HTTP/2 Delphi — multiplexado, streaming, push

Uma implementação Pascal nativa do RFC 9113 HTTP/2 — multiplexação de streams, compressão de cabeçalhos HPACK, controle de fluxo, server push e a extensão WebSocket-sobre-HTTP/2 (RFC 8441). Mesmo componente, cliente ou servidor, do Delphi 7 ao Delphi 13.

Uma stack HTTP/2 em Pascal puro

Não é um wrapper fino sobre WinHTTP ou libcurl — uma implementação do zero que dá controle em nível de frame.

Um cliente HTTP/2 Delphi não é mais opcional: HTTP/2 é o formato de fio que toda a web moderna fala. Apple Push Notifications exigem HTTP/2. APIs do Google negociam HTTP/2. AWS, Azure e CloudFront usam HTTP/2 como padrão. E os ganhos são reais: uma única conexão TCP/TLS multiplexa dezenas de requisições em andamento, conjuntos de cabeçalhos são comprimidos com HPACK e o servidor pode empurrar recursos que o cliente ainda não pediu. O sgcWebSockets entrega TsgcHTTP2Client (cliente) e suporte HTTP/2 dentro de TsgcWebSocketHTTPServer (servidor) — ambos em Pascal puro, ambos rodando em cada plataforma que o compilador Delphi suporta.

Um servidor HTTP/2 Delphi na mesma biblioteca consegue hospedar APIs REST, empurrar eventos para clientes de longa duração e aceitar upgrades de WebSocket sobre HTTP/2 (RFC 8441) — a forma padrão como a infraestrutura moderna camada WebSocket sobre HTTP/2 / HTTP/3.

Cliente

TsgcHTTP2Client

Servidor

TsgcWebSocketHTTPServer com HTTP/2 habilitado

Padrões

RFC 9113 (HTTP/2), RFC 7541 (HPACK), RFC 8441 (WS-sobre-H2)

TLS

OpenSSL, SChannel, HTTP.sys — negociado por ALPN

Por que HTTP/2 importa

Os quatro grandes ganhos sobre HTTP/1.1 — e os detalhes operacionais que os fazem funcionar.

Multiplexação de streams

Até SETTINGS_MAX_CONCURRENT_STREAMS requisições em andamento sobre uma única conexão TCP+TLS — sem head-of-line blocking, sem pool de conexão para tunar.

Compressão HPACK

Tabela estática + dinâmica de cabeçalhos por conexão elimina os quilobytes de cabeçalhos repetidos (cookies, user-agent, accept) que incham o tráfego HTTP/1.1.

Server push

O servidor pode enviar preventivamente recursos que o cliente vai precisar (CSS, JS, sub-recursos JSON) antes de o cliente pedir — corta uma rodada de requisição.

Prioridades de stream

Peso por stream e árvore de dependências permitem dizer ao servidor para entregar o documento index antes do blob de analytics.

Controle de fluxo

WINDOW_UPDATE por stream e por conexão impede que um consumidor lento afogue o emissor — back-pressure embutido no formato de fio.

Negociação ALPN

O ALPN na camada TLS negocia h2 automaticamente — cliente e servidor concordam em HTTP/2 antes da primeira requisição, com fallback HTTP/1.1 se o par não o falar.

WebSocket-sobre-HTTP/2

RFC 8441: tunela uma sessão WebSocket dentro de um stream HTTP/2 — passa por todo load balancer HTTP/2-aware (Envoy, nginx, ALB, GCLB).

Trailers & gRPC-friendly

Trailers HTTP (conforme RFC 7230) são de primeira classe — a base para os metadados de status / mensagem do gRPC.

Requisições GET multiplexadas

Dispare 10 GETs concorrentes em uma única conexão — HPACK e multiplexação tornam isso rotineiro.

uses
  sgcHTTP2_Client, sgcHTTP_Classes;

var
  HTTP2: TsgcHTTP2Client;
  i: Integer;
begin
  HTTP2 := TsgcHTTP2Client.Create(nil);
  HTTP2.Host := 'api.example.com';
  HTTP2.Port := 443;
  HTTP2.TLS  := True;
  HTTP2.TLSOptions.ALPNProtocols.Add('h2');
  HTTP2.OnResponse := DoResponse;

  HTTP2.Connect;

  // 10 concurrent GETs on ONE connection, ONE TLS handshake
  for i := 1 to 10 do
    HTTP2.Get(Format('/items/%d', [i]));
end;

procedure TForm1.DoResponse(Sender: TObject;
  const aStreamId: Cardinal;
  aHeaders: TsgcHTTP2Headers;
  aData: TBytes);
begin
  Memo1.Lines.Add(Format('stream %d  status %s  bytes %d',
    [aStreamId, aHeaders.Status, Length(aData)]));
end;

Empurre um sub-recurso antes do cliente pedir

Dentro de um handler OnCommandGet, chame PushPromise para enviar preventivamente /style.css junto com /index.html.

uses
  sgcWebSocket, sgcHTTP_Classes;

procedure TForm1.WSServerCommandGet(Sender: TObject;
  aContext: TsgcWSConnection;
  ARequestInfo: TsgcWSRequestInfo;
  AResponseInfo: TsgcWSResponseInfo);
begin
  if ARequestInfo.URI = '/index.html' then
  begin
    // Push the CSS so the browser doesn’t round-trip for it
    AResponseInfo.PushPromise('/style.css');
    AResponseInfo.PushPromise('/app.js');

    AResponseInfo.ContentType := 'text/html; charset=utf-8';
    AResponseInfo.ContentText :=
      '<!doctype html><link rel="stylesheet" href="/style.css">' +
      '<script src="/app.js" defer></script>' +
      '<h1>HTTP/2 from Delphi</h1>';
  end;
end;

Onde HTTP/2 é obrigatório, não opcional

Apple Push Notifications

APNs só aceita HTTP/2 — uma conexão persistente, milhares de streams por segundo, auth por JWT ou certificado. Veja a página Apple Push.

Google FCM v1

A API HTTP v1 do FCM roda em HTTP/2. Veja a página Google FCM.

Serviços gRPC

gRPC é HTTP/2 com protobuf e trailers. A stack HTTP/2 aqui é a fundação sobre a qual um cliente gRPC em Pascal é construído.

WebSocket-sobre-HTTP/2

A forma mais limpa de implantar WebSocket através de load balancers modernos e CDNs que preferem HTTP/2 upstream.

Clientes REST de alto throughput

Uma conexão, centenas de requisições em andamento — ideal para crawlers, ingestores de market data e workers de fan-out.

Substituto de long-poll

Faça stream de uma resposta JSON-lines ou estilo SSE em um único stream HTTP/2 — back-pressure incluído.

Mergulhos mais fundos

Referência HTTP/2

Referência completa de componentes para cliente e servidor HTTP/2.

Cliente HTTP/2

Página dedicada do componente cliente.

Servidor HTTP/2

Página dedicada do componente servidor.

Componente WebSocket

WebSocket sobre HTTP/2 (RFC 8441) e sobre HTTP/1.1 (RFC 6455).

Blog: suporte inicial a servidor HTTP/2

Anúncio original e notas de design.

Blog: desempenho HTTP/2 vs HTTP/1

Números de benchmark para os ganhos de multiplexação e HPACK.

Blog: testes de conformidade HTTP/2

Rodando a suite h2spec contra o servidor.

Blog: APNs sobre HTTP/2

Exemplo prático de HTTP/2: notificações APNs.

Multiplexe suas requisições hoje

Baixe o trial — tanto a demo do cliente quanto a do servidor HTTP/2 compilam de fábrica.