{"action":"created","comment":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/131287765","pull_request_review_id":54246728,"id":131287765,"diff_hunk":"@@ -583,12 +673,34 @@ server to client, as in HTTP/2.  It defines no flags.\n \n The payload consists of:\n \n-  Promised Stream ID:\n-  : A 32-bit Stream ID indicating the QUIC stream on which the response will be\n-    sent\n+Push ID:\n+: A 32-bit identifier for the server push request.  A push ID is used in push\n+  stream header ({{server-push}}), CANCEL_PUSH frames ({{frame-cancel-push}}),\n+  and PRIORITY frames ({{frame-priority}}).\n+\n+Header Block:\n+: HPACK-compressed request headers for the promised response.\n \n-  Payload:\n-  : HPACK-compressed request headers for the promised response.\n+A server MAY use the same Push ID in multiple PUSH_PROMISE frames.  This allows\n+the server to use the same server push in response to multiple concurrent\n+requests.  Referencing the same server push ensures that a PUSH_PROMISE can be\n+made in relation to every response in which server push might be needed without\n+causing duplicating pushes.","path":"draft-ietf-quic-http.md","position":264,"original_position":264,"commit_id":"794d9146bc132b558fe8d510cb06f2b612943f84","original_commit_id":"794d9146bc132b558fe8d510cb06f2b612943f84","user":{"login":"janaiyengar","id":11067604,"avatar_url":"https://avatars2.githubusercontent.com/u/11067604?v=4","gravatar_id":"","url":"https://api.github.com/users/janaiyengar","html_url":"https://github.com/janaiyengar","followers_url":"https://api.github.com/users/janaiyengar/followers","following_url":"https://api.github.com/users/janaiyengar/following{/other_user}","gists_url":"https://api.github.com/users/janaiyengar/gists{/gist_id}","starred_url":"https://api.github.com/users/janaiyengar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janaiyengar/subscriptions","organizations_url":"https://api.github.com/users/janaiyengar/orgs","repos_url":"https://api.github.com/users/janaiyengar/repos","events_url":"https://api.github.com/users/janaiyengar/events{/privacy}","received_events_url":"https://api.github.com/users/janaiyengar/received_events","type":"User","site_admin":false},"body":"\"causing duplicating pushes\" --> \"duplicating pushes\"","created_at":"2017-08-04T00:07:22Z","updated_at":"2017-08-04T00:15:51Z","html_url":"https://github.com/quicwg/base-drafts/pull/701#discussion_r131287765","pull_request_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/701","_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/131287765"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/701#discussion_r131287765"},"pull_request":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/701"}}},"pull_request":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/701","id":132673582,"html_url":"https://github.com/quicwg/base-drafts/pull/701","diff_url":"https://github.com/quicwg/base-drafts/pull/701.diff","patch_url":"https://github.com/quicwg/base-drafts/pull/701.patch","issue_url":"https://api.github.com/repos/quicwg/base-drafts/issues/701","number":701,"state":"open","locked":false,"title":"Push ID","user":{"login":"martinthomson","id":67641,"avatar_url":"https://avatars1.githubusercontent.com/u/67641?v=4","gravatar_id":"","url":"https://api.github.com/users/martinthomson","html_url":"https://github.com/martinthomson","followers_url":"https://api.github.com/users/martinthomson/followers","following_url":"https://api.github.com/users/martinthomson/following{/other_user}","gists_url":"https://api.github.com/users/martinthomson/gists{/gist_id}","starred_url":"https://api.github.com/users/martinthomson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martinthomson/subscriptions","organizations_url":"https://api.github.com/users/martinthomson/orgs","repos_url":"https://api.github.com/users/martinthomson/repos","events_url":"https://api.github.com/users/martinthomson/events{/privacy}","received_events_url":"https://api.github.com/users/martinthomson/received_events","type":"User","site_admin":false},"body":"As requested, I split this out of the unidirectional PR (#643).\r\n\r\nThere is a change here, that needs to be highlighted.  @kazuho points out that without inter-stream ordering guarantees, requests might be triggered on multiple streams.  The server then has an awkward choice: either push multiple times, or risk the client triggering requests when streams arrive out of order.  This contains a fix for that bug.\r\n\r\nThe fix is to allow the same push ID to be used in multiple PUSH_PROMISE frames.  Then, fulfillment happens at most once.\r\n\r\nI think that this is a neat fix, but it creates two more problems:\r\n\r\n1. How does a client know when the server will stop referencing a push ID in PUSH_PROMISE?  With reordering, the pushed response might arrive and be consumed before a PUSH_PROMISE that references it.  I think that it might be possible to add a counter to the push stream header that says how many times the server promised this response.  The problem with that is that if a stream that carries the PUSH_PROMISE is reset, then that counter will be too high.  I've decided to just explain the issue and add some weasel wording rather than provide a direct fix.\r\n\r\n2. What if the server provides different headers for the same Push ID?  I've chosen to fix this by simply forbidding variations in the content of the header block.  I considered only allowing the headers to appear once, but then you have to deal with that stream being reset.  Repetition should be rare enough, and header compression might be able to help with the extra bytes.\r\n\r\nI think that those problems are both less serious than the bug this fixes.  Besides, the first is really only an generalized form of a problem we have already: the stream carrying a PUSH_PROMISE can be reset.  What currently happens is that the server more or less has to send a push stream anyway, even though it can't know whether the client got the PUSH_PROMISE.  With this, a server can use CANCEL_REQUEST.\r\n\r\nCloses #702, #281.","created_at":"2017-07-27T06:23:37Z","updated_at":"2017-08-04T00:15:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a24904fa81f36bbda980e8ff6f771f896924d210","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/701/commits","review_comments_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/701/comments","review_comment_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/issues/701/comments","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/794d9146bc132b558fe8d510cb06f2b612943f84","head":{"label":"quicwg:push-id","ref":"push-id","sha":"794d9146bc132b558fe8d510cb06f2b612943f84","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2017-08-03T16:41:34Z","pushed_at":"2017-08-03T23:41:52Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":19678,"stargazers_count":121,"watchers_count":121,"language":"Makefile","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":28,"mirror_url":null,"open_issues_count":147,"forks":28,"open_issues":147,"watchers":121,"default_branch":"master"}},"base":{"label":"quicwg:master","ref":"master","sha":"6dc5578ed248fe661a528dcd2b6fbe119185411b","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2017-08-03T16:41:34Z","pushed_at":"2017-08-03T23:41:52Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":19678,"stargazers_count":121,"watchers_count":121,"language":"Makefile","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":28,"mirror_url":null,"open_issues_count":147,"forks":28,"open_issues":147,"watchers":121,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/701"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/701"},"issue":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/701"},"comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/701/comments"},"review_comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/701/comments"},"review_comment":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/701/commits"},"statuses":{"href":"https://api.github.com/repos/quicwg/base-drafts/statuses/794d9146bc132b558fe8d510cb06f2b612943f84"}}}}
{"actor":{"display_login":"janaiyengar"}}