HTTP/2ではサーバプッシュと呼ばれる機能があります。サーバはクライアントからのリクエストを受信しなくても先んじてレスポンスを返すことができる仕組みになります。
たとえば、HTTP/1.1においてリソースをインライン化していた部分をサーバプッシュとして置き換えることで同様の最適化を行うことが出来ます。
このサーバプッシュですが、クライアントからサーバプッシュを制御するのは「SETTINGS_ENABLE_PUSHパラメータ」でHTTP/2コネクションで有効・無効の設定しかできません。
場合によってはクライアントの状況に合わせてリクエストごとにサーバプッシュを制御できたほうが好ましい場合があります。
そこで、「Accept-Push-Policyヘッダ」を新しく定義し、クライアント側からの制御を可能にする「Accept-Push-Policy Header Field」という仕様が提案されています。
(例のごとく間違いとうあるかもしれません、、、)
Accept-Push-Policy Header Field
この仕様では、まず幾つかのユースケースが紹介されています
- Webサイトを巡回し、リソースをキャッシュできておりプッシュを受けるる必要が無いケース
- リソースをキャッシュ出来ているので、メタデータのみ欲しいケース(HEADメソッドに該当)
- ロードバランサがバックエンドサーバでHTTP/2で通信するケース(ロードバランサは、クライアントがHTTP/1だったら、プッシュ出来ないのでバックエンドからのプッシュは必要ない。クライアントがHTTP/2であればプッシュ出来るので、バックエンドからのプッシュは受け付ける。)
- MPEG-DASHにおいて、コンテンツの最初のセグメントをプッシュしてもらいたいケース
- 非常にレイテンシがあるので、全てのサブリソースをプッシュしてもらいたいケース
そこで、クライアントは状況に合わせてHTTPリクエストに以下の値(ポリシー)をセットしたAccept-Push-Policyヘッダを付加することで、望むサーバにプッシュのポリシーを伝えることが出来ます。
- none:このHTTPリクエストを処理する際、サーバプッシュを行わない
- head:このHTTPリクエストを処理する際、メタ情報のみプッシュする(HEADメソッドへのレスポンス)
- default:このHTTPリクエストを処理する際、通常のサーバの挙動どおりプッシュする
- fast-load:このHTTPリクエストを処理する際、このHTTPリクエストのメインリソースをレンダリングするのに必要なサブリソースをプッシュする
以下のように例になる
:method = GET :scheme = https :path = /index.html host = example.org accept = text/html accept-push-policy = fast-load
サーバは同様に、使用したポリシーを「Push-Policy」ヘッダを用いることでクライアントに通知することが出来ます。