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).