Skip to content
mobius1qwe edited this page Oct 7, 2026 · 1 revision

Home > HTTP/2

HTTP/2

Important

Em desenvolvimento (1.2). Ainda não está numa versão lançada e pode mudar.

Em uma frase: com HTTP/2, vários pedidos andam ao mesmo tempo numa conexão só, em vez de um por vez por conexão.

Você vai precisar: HTTPS funcionando (HTTPS). HTTP/2 só acontece dentro de HTTPS: num http:// é sempre HTTP/1.1.

Quem fala HTTP/2

O RAL não implementa HTTP/2: ele pede à biblioteca por baixo do motor.

Lado Motor HTTP/2
cliente netHTTP no Windows sim
cliente OkHttp no Android sim (Android)
cliente Indy, mORMot2, fpHTTP não
servidor mORMot2 com Mode := smHttpSys (Windows) sim
servidor mORMot2 smThreads/smAsync, Indy, fpHTTP, Sagui, CGI, UniGUI não

Cliente

Cliente.EngineType := 'netHTTP';          // ou 'OkHttp' no Android
Cliente.BaseURL.Text := 'https://servidor:9988';
Cliente.HTTPVersion := rhv2;              // pede HTTP/2
Cliente.ShareConnection := True;          // já é o padrão: clientes iguais dividem a conexão
HTTPVersion O que pede
rhvDefault o que o motor fizer (padrão)
rhv11 força HTTP/1.1
rhv2 HTTP/2; se o servidor não tiver, vem 1.1 sem erro

Pedir não é conseguir: o que aconteceu de fato está em Resposta.ProtocolVersion (rhv2 ou rhv11). rhv2 num motor que não sabe falar HTTP/2 dá erro (emHTTP2Unsupported) no primeiro pedido, em vez de fingir.

KeepAliveInterval (ms) faz o cliente perceber em segundos uma conexão morta (Wi-Fi caiu), em vez de esperar o RequestTimeout. Vale no OkHttp e no netHTTP (Windows 11). Um bom começo: metade do ConnectTimeout.

Servidor (mORMot2 + http.sys, Windows)

Servidor.Mode := smHttpSys;          // o Windows atende as conexões
Servidor.HttpSysDomain := '+';       // '+' qualquer endereço; 'localhost' só a máquina
Servidor.SSL.Enabled := True;
Servidor.Active := True;

No smHttpSys o certificado não vem de arquivo: ele fica no repositório de certificados do Windows, ligado à porta. Uma vez, num prompt como administrador:

certutil -f -p minhasenha -importpfx My cert.pfx
netsh http add sslcert ipport=0.0.0.0:9988 certhash=<impressão SHA-1> appid={00112233-4455-6677-8899-AABBCCDDEEFF}
netsh http add urlacl url=https://+:9988/ user=DOMINIO\usuario
  • certhash: a impressão SHA-1 do certificado, sem : (openssl x509 -in cert.pem -noout -fingerprint -sha1).
  • appid: qualquer GUID (no Delphi, Ctrl+Shift+G gera um).
  • Na 1.3 🚧, o certificado automático faz os dois primeiros comandos sozinho (precisa rodar como administrador).

Conferir no servidor: ARequest.ProtocolVersion = rhv2.

Os três modos do mORMot2

Mode Quem cuida das conexões HTTP/2 Conexão parada custa Sistema
smThreads (padrão) uma thread por conexão não uma thread todos
smAsync laço de eventos (IOCP/epoll) não só o socket todos
smHttpSys o próprio Windows (http.sys) sim só o socket Windows

Erros comuns

O que acontece Causa O que fazer
ProtocolVersion volta rhv11 URL http://, ou o servidor não tem HTTP/2 use https:// e o servidor em smHttpSys
emHttpSysAddUrl, código 5 a URL não foi reservada netsh http add urlacl ... como administrador
http.sys sempre em 1.1 sem certificado ligado à porta, ou HTTP/2 desligado no registro (EnableHttp2Tls) netsh http show sslcert ipport=0.0.0.0:9988
emHttpSysWindowsOnly smHttpSys fora do Windows use smAsync
emHTTP2Unsupported rhv2 num motor sem HTTP/2 troque para netHTTP/OkHttp ou volte rhvDefault

Manual completo (inglês): src/engine/HTTP2.md no repositório.

Veja também

Clone this wiki locally