メインコンテンツまでスキップ

6. 購読に対するプッシュメッセージの受信

6. 購読に対するプッシュメッセージの受信​

ユーザエージェント (user agent) はプッシュメッセージ購読リソースへ GET リクエストを行うことで新しいプッシュメッセージの配信を要求する. プッシュサービスはこのリクエストに応答せず, 代わりに HTTP/2 サーバプッシュ [RFC7540] を用いてアプリケーションサーバがプッシュメッセージを送ると同時にその内容を送る.

ユーザエージェントはリクエストに Urgency ヘッダフィールドを含めてもよい (MAY). プッシュサービスは表 1 (説明的な緊急度の値) で定義されるとおりヘッダフィールドの値より低い緊急度のメッセージを配信してはならない (MUST NOT).

各プッシュメッセージは PUSH_PROMISE で送られた合成 GET リクエストへの応答としてプッシュされる. この GET リクエストは, アプリケーションサーバがメッセージ配信を要求したときにプッシュサービスが作成したプッシュメッセージリソースに対して行われる. レスポンスヘッダは型 urn:ietf:params:push のリンク関係でプッシュメッセージ購読に対応するプッシュリソースの URI を提供すべきである (SHOULD). レスポンスボディはアプリケーションサーバがプッシュリソースへ送った最新リクエストのエンティティボディである.

次の例のリクエストは HTTP/2 上で行われる:

HEADERS      [stream 7] +END_STREAM +END_HEADERS
:method = GET
:path = /subscription/LBhhw0OohO-Wl4Oi971UG
:authority = push.example.net

プッシュサービスはリクエストを未処理のまま許可する. アプリケーションサーバがプッシュメッセージを送ると, 初期リクエストに関連付けてサーバプッシュが生成される. サーバプッシュのレスポンスにプッシュメッセージが含まれる.

PUSH_PROMISE [stream 7; promised stream 4] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 4] +END_HEADERS
:status = 200
date = Thu, 11 Dec 2014 23:56:56 GMT
last-modified = Thu, 11 Dec 2014 23:56:55 GMT
cache-control = private
link = </push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV>;
rel="urn:ietf:params:push"
content-type = text/plain;charset=utf8
content-length = 36

DATA [stream 4] +END_STREAM
iChYuI3jMzt3ir20P8r_jgRR-dSuN182x7iB

HEADERS [stream 7] +END_STREAM +END_HEADERS
:status = 200

ユーザエージェントは Prefer ヘッダフィールド [RFC7240] に wait 選好を 0 に設定して含めることで, プッシュメッセージ購読リソースの内容を直ちに要求してもよい. このリクエストに対してプッシュサービスは, まだ配信されていないすべてのプッシュメッセージについてサーバプッシュを生成しなければならない (MUST).

関連するサーバプッシュのない 204 (No Content) ステータスコードは, 現在利用可能なメッセージがないことを示す. プッシュメッセージが期限切れになったためかもしれない.

6.1. Receiving Push Messages for a Subscription Set (購読集合に対するプッシュメッセージの受信)​

購読と購読集合に対するプッシュメッセージ受信にはわずかな違いがある. 購読集合が利用可能な場合, ユーザエージェントは個々のプッシュメッセージ購読ではなく購読集合を用いてプッシュメッセージを監視すべきである (SHOULD).

ユーザエージェントはプッシュメッセージ購読集合リソースへ GET リクエストを行うことで, プッシュメッセージ購読の集合に対する新しいプッシュメッセージの配信を要求する. プッシュサービスはこのリクエストに応答せず, 代わりに HTTP/2 サーバプッシュ [RFC7540] を用いてアプリケーションサーバがプッシュメッセージを送ると同時にその内容を送る.

ユーザエージェントはリクエストに Urgency ヘッダフィールドを含めてもよい (MAY). プッシュサービスは表 1 (説明的な緊急度の値) で定義されるとおりヘッダフィールドの値より低い緊急度のメッセージを配信してはならない (MUST NOT).

各プッシュメッセージは PUSH_PROMISE で送られた合成 GET リクエストへの応答としてプッシュされる. この GET リクエストは, アプリケーションサーバがメッセージ配信を要求したときにプッシュサービスが作成したプッシュメッセージリソースに対して行われる. 合成リクエストは型 urn:ietf:params:push のリンク関係でプッシュメッセージ購読に対応するプッシュリソースの URI を提供しなければならない (MUST). これによりユーザエージェントはメッセージの発信元を区別できる. レスポンスボディはアプリケーションサーバがプッシュリソースへ送った最新リクエストのエンティティボディである.

次の例のリクエストは HTTP/2 上で行われる.

HEADERS      [stream 7] +END_STREAM +END_HEADERS
:method = GET
:path = /subscription-set/4UXwi2Rd7jGS7gp5cuutF8ZldnEuvbOy
:authority = push.example.net

プッシュサービスはリクエストを未処理のまま許可する. アプリケーションサーバがプッシュメッセージを送ると, 初期リクエストに関連付けてサーバプッシュが生成される. サーバプッシュのレスポンスにプッシュメッセージが含まれる.

PUSH_PROMISE [stream 7; promised stream 4] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 4] +END_HEADERS
:status = 200
date = Thu, 11 Dec 2014 23:56:56 GMT
last-modified = Thu, 11 Dec 2014 23:56:55 GMT
link = </push/JzLQ3raZJfFBR0aqvOMsLrt54w4rJUsV>;
rel="urn:ietf:params:push"
cache-control = private
content-type = text/plain;charset=utf8
content-length = 36

DATA [stream 4] +END_STREAM
iChYuI3jMzt3ir20P8r_jgRR-dSuN182x7iB

HEADERS [stream 7] +END_STREAM +END_HEADERS
:status = 200

ユーザエージェントは Prefer ヘッダフィールド [RFC7240] に wait 選好を 0 に設定して含めることで, プッシュメッセージ購読集合リソースの内容を直ちに要求できる. このリクエストに対してプッシュサービスは, まだ配信されていないすべてのプッシュメッセージについてサーバプッシュを生成しなければならない (MUST).

関連するサーバプッシュのない 204 (No Content) ステータスコードは, 現在利用可能なメッセージがないことを示す. プッシュメッセージが期限切れになったためかもしれない.

6.2. Acknowledging Push Messages (プッシュメッセージの確認応答)​

プッシュメッセージが少なくとも一度ユーザエージェントに正しく配信されたことを保証するため, ユーザエージェントはプッシュメッセージリソースに対して HTTP DELETE を実行してメッセージの受領を確認しなければならない (MUST).

DELETE /message/qDIYHNcfAIPP_5ITvURr-d6BGt HTTP/1.1
Host: push.example.net

プッシュサービスが確認を受信し, アプリケーションが配信受領を要求していた場合, プッシュサービスは受領購読を監視しているアプリケーションサーバに 204 (No Content) レスポンスを返さなければならない (MUST).

プッシュサービスが合理的な時間内に確認を受信しない場合, メッセージはまだ配信されていないとみなされる. プッシュサービスは告知された期限までメッセージの配信再試行を続けるべきである (SHOULD).

プッシュサービスは, 無応答のユーザエージェントや運用上の制約などのシナリオにより, 告知された期限より前にメッセージの再試行配信を中止してもよい (MAY). アプリケーションが配信受領を要求していた場合, プッシュサービスは受領購読を監視しているアプリケーションサーバに 410 (Gone) レスポンスを返さなければならない (MUST).

6.3. Receiving Push Message Receipts (プッシュメッセージ受領の受信)​

アプリケーションサーバは受領購読リソースへ HTTP GET リクエストを行うことでプッシュサービスから受領の配信を要求する. プッシュサービスはこのリクエストに応答せず, 代わりに HTTP/2 サーバプッシュ [RFC7540] を用いてユーザエージェントがメッセージを確認 (第 6.2 節) したときにプッシュ受領を送る.

各受領は PUSH_PROMISE で送られた合成 GET リクエストへの応答としてプッシュされる. この GET リクエストは, アプリケーションサーバがメッセージ配信を要求したときにプッシュサービスが作成したのと同じプッシュメッセージリソースに対して行われる. レスポンスはメッセージ配信の結果を示すステータスコードを含み, データは運ばない.

次の例のリクエストは HTTP/2 上で行われる.

HEADERS      [stream 13] +END_STREAM +END_HEADERS
:method = GET
:path = /receipt-subscription/3ZtI4YVNBnUUZhuoChl6omUvG4ZM
:authority = push.example.net

プッシュサービスはリクエストを未処理のまま許可する. ユーザエージェントがメッセージを確認すると, プッシュサービスはアプリケーションサーバへ配信受領をプッシュする. 204 (No Content) ステータスコードはメッセージが配信され確認されたことを示す.

PUSH_PROMISE [stream 13; promised stream 82] +END_HEADERS
:method = GET
:path = /message/qDIYHNcfAIPP_5ITvURr-d6BGt
:authority = push.example.net

HEADERS [stream 82] +END_STREAM
+END_HEADERS
:status = 204
date = Thu, 11 Dec 2014 23:56:56 GMT

ユーザエージェントがプッシュメッセージの受領確認に失敗し, プッシュサービスが告知された期限より前にメッセージの再試行配信を中止した場合, プッシュサービスはステータスコード 410 (Gone) の失敗レスポンスをプッシュしなければならない (MUST).