Re: [quicwg/base-drafts] VarInt all the HTTP things (#2437)

Lucas Pardue <> Fri, 08 February 2019 11:37 UTC

Return-Path: <>
Received: from localhost (localhost []) by (Postfix) with ESMTP id A4AC112F1AB for <>; Fri, 8 Feb 2019 03:37:42 -0800 (PST)
X-Virus-Scanned: amavisd-new at
X-Spam-Flag: NO
X-Spam-Score: -8.001
X-Spam-Status: No, score=-8.001 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, MAILING_LIST_MULTI=-1, RCVD_IN_DNSWL_HI=-5, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: (amavisd-new); dkim=pass (1024-bit key)
Received: from ([]) by localhost ( []) (amavisd-new, port 10024) with ESMTP id 5TgnUkQtL97t for <>; Fri, 8 Feb 2019 03:37:40 -0800 (PST)
Received: from ( []) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by (Postfix) with ESMTPS id CAF2C130DD6 for <>; Fri, 8 Feb 2019 03:37:39 -0800 (PST)
Date: Fri, 08 Feb 2019 03:37:38 -0800
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;; s=pf2014; t=1549625858; bh=tXHEQuQLLaPe9J0sO1ZFdpKj3uhoDSwGr2vHQpt1yhg=; h=Date:From:Reply-To:To:Cc:In-Reply-To:References:Subject:List-ID: List-Archive:List-Post:List-Unsubscribe:From; b=X0a70N1+fN1JuvQAvSiv/lWfuPefY+NrekRu0ma9WGZQIepEgGYf2s/Nn1Yr2QY7H y42Nr0xxQshK0CQ1mS8q4D0KjRW+P2dh3vt6JVhBfwkAl4a3B27NWeiWeD0cNVmG9u BHk1dDNcrNDxUH44B1MoJTthdBuQZG6x5YbkFadA=
From: Lucas Pardue <>
Reply-To: quicwg/base-drafts <>
To: quicwg/base-drafts <>
Cc: Subscribed <>
Message-ID: <quicwg/base-drafts/pull/2437/review/>
In-Reply-To: <quicwg/base-drafts/pull/>
References: <quicwg/base-drafts/pull/>
Subject: Re: [quicwg/base-drafts] VarInt all the HTTP things (#2437)
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="--==_mimepart_5c5d6a024d16b_2623f7e9e0d45c4626199"; charset="UTF-8"
Content-Transfer-Encoding: 7bit
Precedence: list
X-GitHub-Sender: LPardue
X-GitHub-Recipient: quic-issues
X-GitHub-Reason: subscribed
X-Auto-Response-Suppress: All
Archived-At: <>
X-Mailman-Version: 2.1.29
List-Id: Notification list for GitHub issues related to the QUIC WG <>
List-Unsubscribe: <>, <>
List-Archive: <>
List-Post: <>
List-Help: <>
List-Subscribe: <>, <>
X-List-Received-Date: Fri, 08 Feb 2019 11:37:43 -0000

LPardue requested changes on this pull request.

I requested some changes, but if they are controversial we can move them to separate issues for further discussion.

> @@ -303,15 +303,16 @@ specify a value of zero for the QUIC transport parameter
 ## Unidirectional Streams
 Unidirectional streams, in either direction, are used for a range of purposes.
-The purpose is indicated by a stream type, which is sent as a single byte header
-at the start of the stream. The format and structure of data that follows this
-header is determined by the stream type.
+The purpose is indicated by a stream type, which is sent as a variable-length
+integer at the start of the stream. The format and structure of data that

you've replaced 'byte header' with 'variable-length integer', but the next sentence refers to 'this header'. This might be confusing to the reader? 

> @@ -373,7 +374,7 @@ MUST be treated as a stream error of type HTTP_WRONG_STREAM_DIRECTION.
  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
-|Stream Type (8)|                  Push ID (i)                ...
+|    0x01 (8)   |                  Push ID (i)                ...

The alternative option is to remove it from the figure altogether. It was not great before the change - see #2338 

> @@ -433,12 +437,10 @@ All frames have the following format:
 A frame includes the following fields:
-  : An 8-bit type for the frame.
+  : A variable-length type for the frame.

nit: make this consistent with the frame payload description. e.g.

A variable-length integer that identifies the frame type.

> @@ -671,14 +673,16 @@ treat the presence of the same parameter more than once as a connection error of
 The payload of a SETTINGS frame consists of zero or more parameters, each
-consisting of an unsigned 16-bit setting identifier and a value which uses the
+consisting of a setting identifier and a value, each of which uses the

"both encoded as" would work too

> @@ -881,12 +885,12 @@ the DUPLICATE_PUSH.
 ### Reserved Frame Types {#frame-grease}
-Frame types of the format `0xb + (0x1f * N)` are reserved to exercise the
-requirement that unknown types be ignored ({{extensions}}). These frames have no
-semantic value, and can be sent when application-layer padding is desired. They
-MAY also be sent on connections where no request data is currently being
-transferred. Endpoints MUST NOT consider these frames to have any meaning upon
+Frame types of the format `0x1f * N` for non-zero values of N are reserved to
+exercise the requirement that unknown types be ignored ({{extensions}}). These
+frames have no semantic value, and can be sent when application-layer padding is
+desired. They MAY also be sent on connections where no request data is currently

Not a new problem but I wonder if request data can be simplified to data, which covers all cases such as QPACK instructions, response data, control data etc.

> @@ -1589,15 +1593,9 @@ The entries in the following table are registered by this document.
 | NUM_PLACEHOLDERS             |  0x8   | {{settings-parameters}}   |
 | ---------------------------- | ------ | ------------------------- |

Not a new issue but: RFC 7540 has a column for `Initial Value`. I think it makes sense that HTTP/3 does similar.

> @@ -1868,7 +1861,9 @@ use the full 32-bit space.  Settings ported from HTTP/2 might choose to redefine
 the format of their settings to avoid using the 62-bit encoding.
 Settings need to be defined separately for HTTP/2 and HTTP/3. The IDs of
-settings defined in {{!RFC7540}} have been reserved for simplicity. See
+settings defined in {{!RFC7540}} have been reserved for simplicity.  Note that
+the settings identifier space in HTTP/3 is substantially larger (62 bits versus
+16 bits), so many HTTP/3 settings have no equivalent HTTP/2 code point. See

Unfortunately, `0x1` is reserved by QPACK so it makes a little more difficult to see that this is true. And a quick check of the [HTTP/2 IANA registry]( shows that 0x0 is also reserved, but I can't seem to find where that is defined in RFC 7540.

Checking that, it seems we have a clash on 0x8 due to RFC 8441 - WebSocket over HTTP/2. I think its reasonable that someone might write a WebSocket over HTTP/3 extension and reusing the code point would be nice. Can we move NUM_PLACEHOLDERS to 0x9 and leave 0x8 open?

You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub: