Repository navigation
http2
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ãoHTTPVersion |
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.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+Ggera um). - Na
1.3 🚧, o certificado automático faz os dois primeiros comandos sozinho (precisa rodar como administrador).
Conferir 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.
Começar
Servidor
- Rotas e parâmetros
- Ler o pedido e responder
- Plugins 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- Swagger e Postman
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
Cliente
Motores
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar