TsgcWebSocketHTTPServer | HTTP/2 Server Push

O HTTP geralmente funciona com um padrão de Requisição/Resposta, onde o cliente envia uma REQUEST por um recurso ao SERVER, e o SERVER envia uma RESPONSE com o recurso solicitado ou um erro. Normalmente o cliente, como um navegador, faz uma série de requisições por recursos que são fornecidos pelo servidor.

 

 

O principal problema com essa abordagem é que o cliente deve primeiro enviar uma requisição para obter o recurso (por exemplo, index.html), aguardar até que o servidor envie a resposta, ler o conteúdo e então fazer todas as outras requisições (por exemplo, styles.css).

 

O server push do HTTP/2 tenta resolver esse problema. Quando o cliente requisita um arquivo, se o servidor determinar que esse arquivo requer arquivos adicionais, esses arquivos serão ENVIADOS (PUSHED) automaticamente ao cliente.

 

 

Na captura de tela acima, o cliente primeiro requisita index.html. O servidor lê esta requisição e envia 2 arquivos como resposta: index.html e styles.css, evitando assim uma segunda requisição para obter styles.css.

 

Configurar Server Push

Seguindo as capturas de tela acima, você pode configurar seu servidor para que, toda vez que houver uma nova requisição para o arquivo /index.html, o servidor envie index.html e styles.css.

 

Use o método PushPromiseAddPreLoadLinks para associar cada requisição a uma lista de push promise.

 


server := TsgcWebSocketHTTPServer.Create(nil);
oLinks := TStringList.Create;
Try
  oLinks.Add('/styles.css');
  server.PushPromiseAddPreLoadLinks('/index.html', oLinks);
Finally
  oLinks.Free;
End;
      
      procedure OnCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo:
TIdHTTPResponseInfo);
begin
  if ARequestInfo.Document = '/index.html' then
  begin
    AResponseInfo.ContentText := '';
    AResponseInfo.ContentType := 'text/html';
    AResponseInfo.ResponseNo := 200;
  end
  else if ARequestInfo.Document = '/styles.css' then
  begin
    AResponseInfo.ContentText := '';
    AResponseInfo.ContentType := 'text/css';
    AResponseInfo.ResponseNo := 200;
  end;
end;

Utilizando a ferramenta de desenvolvedor do Chrome, você pode ver como o arquivo styles.css é enviado ao cliente.