TsgcHTTPServer | HTTP/2 Server Push

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 := TsgcHTTPServer.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ファイルがどのようにクライアントへプッシュされるかを確認できます。