Home > 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.
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.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.
| Motor | Como testa | Mínimo |
|---|---|---|
| OkHttp | um PING a cada intervalo; derruba se a resposta não vem no mesmo intervalo | nenhum |
| netHTTP | um PING depois de um intervalo sem uso | 5000: um valor menor vira 5000 ao ser atribuído |
No Windows 10 o netHTTP não tem a opção: o pedido vai em HTTP/2, sem o teste. Num
celular, cada teste gasta bateria.
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).2.0 🚧, o certificado automático faz os doisConferir no servidor: ARequest.ProtocolVersion = rhv2.
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 |
| 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.
Wiki: Home
Wiki: _Sidebar
Wiki: android
Wiki: cliente
Wiki: desempenho
Wiki: https
Wiki: problemas comuns
Wiki: qual motor
Wiki: recursos
Wiki: roadmap