HTTP は通常、リクエスト/レスポンスパターンで動作します。クライアントがサーバーにリソースの REQUEST を送信し、サーバーがリクエストされたリソースまたはエラーを含む RESPONSE を返します。通常、ブラウザなどのクライアントはサーバーが提供するアセットに対して一連のリクエストを行います。

このアプローチの主な問題は、クライアントがまずリソース(たとえばindex.html)を取得するリクエストを送信し、サーバーがレスポンスを送信するまで待機し、コンテンツを読み取り、その後他のすべてのリクエスト(たとえばstyles.css)を行わなければならないことです。
HTTP/2 サーバープッシュはこの問題を解決しようとします。クライアントがファイルをリクエストすると、サーバーがそのファイルに追加のファイルが必要と判断した場合、それらのファイルは自動的にクライアントにプッシュされます。

上記のスクリーンショットでは、クライアントが最初にindex.htmlをリクエストしています。サーバーはこのリクエストを読み取り、レスポンスとして2つのファイル(index.htmlとstyles.css)を送信します。これにより、styles.cssを取得するための2回目のリクエストが不要になります。
上記のスクリーンショットに従って、/index.html ファイルへの新しいリクエストがあるたびに、サーバーが index.html と styles.css を送信するようにサーバーを設定できます。
各リクエストをプッシュプロミスリストと関連付けるために PushPromiseAddPreLoadLinks メソッドを使用してください。
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;
Chromeデベロッパーツールを使用すると、styles.cssファイルがどのようにクライアントへプッシュされるかを確認できます。
