Subject: [quicwg/base-drafts] DUPLICATE_PUSH instead of multiple PUSH_PROMISE frames (#2072)

From: Mike Bishop <[email-masked]>
Date: Thu, 29 Nov 2018 13:58:07 -0800

Fixes #1864, by only sending the request headers once and having a separate frame to pick them up by reference.  Also fixes #1959 along the way, as an added bonus.

However, this is not an unmitigated improvement.  The point of the ordering requirement for PUSH_PROMISE frames is that the client knows that a push is coming before they see references to a dependent resource and initiate their own requests.  If reordering (or blocking QPACK references) places a DUPLICATE_PUSH ahead of the corresponding PUSH_PROMISE, knowing that the resource is on the way can no longer be guaranteed.
You can view, comment on, or merge this pull request online at:

  https://github.com/quicwg/base-drafts/pull/2072

-- Commit Summary --

  * DUPLICATE_PUSH

-- File Changes --

    M draft-ietf-quic-http.md (104)

-- Patch Links --

https://github.com/quicwg/base-drafts/pull/2072.patch
https://github.com/quicwg/base-drafts/pull/2072.diff

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072

---

From: Mike Bishop <[email-masked]>
Date: Thu, 29 Nov 2018 13:59:25 -0800

@MikeBishop pushed 1 commit.

fc9a95d  Don't specify frame name

-- 
You are receiving this because you are subscribed to this thread.
View it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072/files/b5b557e05cbcb873b42a769b8a76fc4400dabcd5..fc9a95d7b5c66c6f83192f5d55400ecef6d82cbd

---

From: Martin Thomson <[email-masked]>
Date: Thu, 29 Nov 2018 15:03:46 -0800

martinthomson commented on this pull request.

I think that this is a net gain.  It's going to be annoying to implement, but hopefully not *too* annoying.

> +
+A client MUST NOT send a DUPLICATE_PUSH frame.  A server MUST treat the receipt
+of a DUPLICATE_PUSH frame as a connection error of type HTTP_MALFORMED_FRAME.
+
+~~~~~~~~~~  drawing
+ 0                   1                   2                   3
+ 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                          Push ID (i)                        ...
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+~~~~~~~~~~
+{: #fig-duplicate-push title="DUPLICATE_PUSH frame payload"}
+
+The DUPLICATE_PUSH frame carries a single variable-length integer that
+identifies the Push ID of a resource that the server has previously promised
+(see {{frame-push-promise}}).  A server MUST treat a DUPLICATE_PUSH frame

You should point out that DUPLICATE_PUSH might appear before PUSH_PROMISE.  I know it's obvious, but it's also very important and so should be written down.

-The PRIORITY frame {{frame-priority}} identifies a prioritized element. The
-elements which can be prioritized are:
+When a client request is first sent or a placeholder first allocated, the
+element is dependent on the root of the priority tree. Pushed streams are
+initially dependent on the client request on which the PUSH_PROMISE frame was
+sent. In all cases, elements are assigned an initial weight of 16.

This is a nice side-effect.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072#pullrequestreview-180057119

---

From: Mike Bishop <[email-masked]>
Date: Thu, 29 Nov 2018 16:02:29 -0800

MikeBishop commented on this pull request.

Moved to #2074 so I could do more priority-related changes without blocking on this, but I agree.  :-)

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072#discussion_r237705507

---

From: Dmitri Tikhonov <[email-masked]>
Date: Fri, 30 Nov 2018 06:37:58 -0800

dtikhonov commented on this pull request.

> @@ -1106,6 +1131,13 @@ PUSH_PROMISE in relation to certain parts of the response is important (see
 Section 8.2.1 of {{!RFC7540}}).  Promised requests MUST conform to the
 requirements in Section 8.2 of {{!RFC7540}}.
 
+The same server push can be associated with additional client requests using a
+DUPLICATE_PUSH frame (see {{frame-duplicate-push}}).  Ordering of a
+DUPLICATE_PUSH in relation to certain parts of the response is similarly
+important.  Due to reordering, DUPLICATE_PUSH frames can arrive before the
+corresponding PUSH_PROMISE frame, in which case the request headers of the push
+might not be immediately available.

Why "might not?"  If _DUPLICATE_PUSH_ arrives before the _PUSH_PROMISE_ it references, the request headers **won't** be available.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072#pullrequestreview-180291843

---

From: Dmitri Tikhonov <[email-masked]>
Date: Fri, 30 Nov 2018 06:38:03 -0800

dtikhonov approved this pull request.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072#pullrequestreview-180291893

---

From: Mike Bishop <[email-masked]>
Date: Fri, 30 Nov 2018 09:17:49 -0800

I was thinking conditionally, "might not be available because DP could arrive before PP," but since this is inside the hypothetical, you're correct.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072#discussion_r237936946

---

From: Mike Bishop <[email-masked]>
Date: Fri, 30 Nov 2018 09:19:08 -0800

9f351d8  More declarative

-- 
You are receiving this because you are subscribed to this thread.
View it on GitHub:
https://github.com/quicwg/base-drafts/pull/2072/files/69a825db0fff174d679c08cf312b520a22436d5a..9f351d868c3569031f14816af480d92d66667814