draft-ietf-httpbis-header-compression-06.txt | draft-ietf-httpbis-header-compression-07.txt | |||
---|---|---|---|---|
HTTPbis Working Group R. Peon | HTTPbis Working Group R. Peon | |||
Internet-Draft Google, Inc | Internet-Draft Google, Inc | |||
Intended status: Standards Track H. Ruellan | Intended status: Standards Track H. Ruellan | |||
Expires: August 17, 2014 Canon CRF | Expires: October 05, 2014 Canon CRF | |||
February 13, 2014 | April 03, 2014 | |||
HPACK - Header Compression for HTTP/2 | HPACK - Header Compression for HTTP/2 | |||
draft-ietf-httpbis-header-compression-06 | draft-ietf-httpbis-header-compression-07 | |||
Abstract | Abstract | |||
This specification defines HPACK, a compression format for | This specification defines HPACK, a compression format for | |||
efficiently representing HTTP header fields in the context of HTTP/2. | efficiently representing HTTP header fields in the context of HTTP/2. | |||
Editorial Note (To be removed by RFC Editor) | Editorial Note (To be removed by RFC Editor) | |||
Discussion of this draft takes place on the HTTPBIS working group | Discussion of this draft takes place on the HTTPBIS working group | |||
mailing list (ietf-http-wg@w3.org), which is archived at [1]. | mailing list (ietf-http-wg@w3.org), which is archived at <http:// | |||
lists.w3.org/Archives/Public/ietf-http-wg/>. | ||||
Working Group information and related documents can be found at [2] | Working Group information can be found at <http://tools.ietf.org/wg/ | |||
(Wiki) and [3] (source code and issues tracker). | httpbis/>; that specific to HTTP/2 are at <http://http2.github.io/>. | |||
The changes in this draft are summarized in Appendix A.1. | The changes in this draft are summarized in Appendix A.1. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on August 17, 2014. | This Internet-Draft will expire on October 05, 2014. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2014 IETF Trust and the persons identified as the | Copyright (c) 2014 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
2. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
2.1. Outline . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2.1. Outline . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Header Field Encoding . . . . . . . . . . . . . . . . . . . . 4 | 3. Header Field Encoding . . . . . . . . . . . . . . . . . . . . 5 | |||
3.1. Encoding Concepts . . . . . . . . . . . . . . . . . . . . 4 | 3.1. Encoding Concepts . . . . . . . . . . . . . . . . . . . . 5 | |||
3.1.1. Encoding Context . . . . . . . . . . . . . . . . . . 5 | 3.1.1. Encoding Context . . . . . . . . . . . . . . . . . . 6 | |||
3.1.2. Header Table . . . . . . . . . . . . . . . . . . . . 5 | 3.1.2. Header Table . . . . . . . . . . . . . . . . . . . . 6 | |||
3.1.3. Reference Set . . . . . . . . . . . . . . . . . . . . 6 | 3.1.3. Reference Set . . . . . . . . . . . . . . . . . . . . 6 | |||
3.1.4. Header Field Representation . . . . . . . . . . . . . 7 | 3.1.4. Header Field Representation . . . . . . . . . . . . . 7 | |||
3.1.5. Header Field Emission . . . . . . . . . . . . . . . . 8 | 3.1.5. Header Field Emission . . . . . . . . . . . . . . . . 8 | |||
3.2. Header Block Decoding . . . . . . . . . . . . . . . . . . 8 | 3.2. Header Block Decoding . . . . . . . . . . . . . . . . . . 8 | |||
3.2.1. Header Field Representation Processing . . . . . . . 8 | 3.2.1. Header Field Representation Processing . . . . . . . 8 | |||
3.2.2. Reference Set Emission . . . . . . . . . . . . . . . 9 | 3.2.2. Reference Set Emission . . . . . . . . . . . . . . . 10 | |||
3.2.3. Header Set Completion . . . . . . . . . . . . . . . . 9 | 3.2.3. Header Set Completion . . . . . . . . . . . . . . . . 10 | |||
3.3. Header Table Management . . . . . . . . . . . . . . . . . 9 | 3.3. Header Table Management . . . . . . . . . . . . . . . . . 10 | |||
3.3.1. Maximum Table Size . . . . . . . . . . . . . . . . . 10 | 3.3.1. Maximum Table Size . . . . . . . . . . . . . . . . . 10 | |||
3.3.2. Entry Eviction When Header Table Size Changes . . . . 10 | 3.3.2. Entry Eviction When Header Table Size Changes . . . . 10 | |||
3.3.3. Entry Eviction when Adding New Entries . . . . . . . 10 | 3.3.3. Entry Eviction when Adding New Entries . . . . . . . 11 | |||
4. Detailed Format . . . . . . . . . . . . . . . . . . . . . . . 11 | 4. Detailed Format . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
4.1. Low-level representations . . . . . . . . . . . . . . . . 11 | 4.1. Low-level representations . . . . . . . . . . . . . . . . 11 | |||
4.1.1. Integer representation . . . . . . . . . . . . . . . 11 | 4.1.1. Integer representation . . . . . . . . . . . . . . . 11 | |||
4.1.2. String Literal Representation . . . . . . . . . . . . 13 | 4.1.2. String Literal Representation . . . . . . . . . . . . 12 | |||
4.2. Indexed Header Field Representation . . . . . . . . . . . 15 | 4.2. Indexed Header Field Representation . . . . . . . . . . . 13 | |||
4.3. Literal Header Field Representation . . . . . . . . . . . 15 | 4.3. Literal Header Field Representation . . . . . . . . . . . 14 | |||
4.3.1. Literal Header Field without Indexing . . . . . . . . 15 | 4.3.1. Literal Header Field with Incremental Indexing . . . 14 | |||
4.3.2. Literal Header Field with Incremental Indexing . . . 16 | 4.3.2. Literal Header Field without Indexing . . . . . . . . 15 | |||
4.3.3. Literal Header Field never Indexed . . . . . . . . . 16 | ||||
4.4. Encoding Context Update . . . . . . . . . . . . . . . . . 17 | 4.4. Encoding Context Update . . . . . . . . . . . . . . . . . 17 | |||
5. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | |||
5.1. Compression-based Attacks . . . . . . . . . . . . . . . . 18 | ||||
5.2. Memory Consumption . . . . . . . . . . . . . . . . . . . 19 | ||||
5.3. Implementation Limits . . . . . . . . . . . . . . . . . . 19 | ||||
6. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 19 | 6. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 19 | |||
7. References . . . . . . . . . . . . . . . . . . . . . . . . . 19 | 7. References . . . . . . . . . . . . . . . . . . . . . . . . . 20 | |||
7.1. Normative References . . . . . . . . . . . . . . . . . . 19 | 7.1. Normative References . . . . . . . . . . . . . . . . . . 20 | |||
7.2. Informative References . . . . . . . . . . . . . . . . . 19 | 7.2. Informative References . . . . . . . . . . . . . . . . . 20 | |||
Appendix A. Change Log (to be removed by RFC Editor before | Appendix A. Change Log (to be removed by RFC Editor before | |||
publication . . . . . . . . . . . . . . . . . . . . 20 | publication . . . . . . . . . . . . . . . . . . . . 21 | |||
A.1. Since draft-ietf-httpbis-header-compression-05 . . . . . 20 | A.1. Since draft-ietf-httpbis-header-compression-06 . . . . . 21 | |||
A.2. Since draft-ietf-httpbis-header-compression-04 . . . . . 20 | A.2. Since draft-ietf-httpbis-header-compression-05 . . . . . 21 | |||
A.3. Since draft-ietf-httpbis-header-compression-03 . . . . . 21 | A.3. Since draft-ietf-httpbis-header-compression-04 . . . . . 21 | |||
A.4. Since draft-ietf-httpbis-header-compression-02 . . . . . 21 | A.4. Since draft-ietf-httpbis-header-compression-03 . . . . . 21 | |||
A.5. Since draft-ietf-httpbis-header-compression-01 . . . . . 21 | A.5. Since draft-ietf-httpbis-header-compression-02 . . . . . 22 | |||
A.6. Since draft-ietf-httpbis-header-compression-00 . . . . . 21 | A.6. Since draft-ietf-httpbis-header-compression-01 . . . . . 22 | |||
Appendix B. Static Table . . . . . . . . . . . . . . . . . . . . 22 | A.7. Since draft-ietf-httpbis-header-compression-00 . . . . . 22 | |||
Appendix C. Huffman Codes . . . . . . . . . . . . . . . . . . . 24 | Appendix B. Static Table . . . . . . . . . . . . . . . . . . . . 23 | |||
Appendix D. Examples . . . . . . . . . . . . . . . . . . . . . . 29 | Appendix C. Huffman Codes . . . . . . . . . . . . . . . . . . . 25 | |||
D.1. Header Field Representation Examples . . . . . . . . . . 30 | Appendix D. Examples . . . . . . . . . . . . . . . . . . . . . . 31 | |||
D.1.1. Literal Header Field with Indexing . . . . . . . . . 30 | D.1. Integer Representation Examples . . . . . . . . . . . . . 31 | |||
D.1.2. Literal Header Field without Indexing . . . . . . . . 30 | D.1.1. Example 1: Encoding 10 using a 5-bit prefix . . . . . 31 | |||
D.1.3. Indexed Header Field . . . . . . . . . . . . . . . . 31 | D.1.2. Example 2: Encoding 1337 using a 5-bit prefix . . . . 31 | |||
D.1.4. Indexed Header Field from Static Table . . . . . . . 32 | D.1.3. Example 3: Encoding 42 starting at an | |||
D.2. Request Examples without Huffman . . . . . . . . . . . . 33 | octet-boundary . . . . . . . . . . . . . . . . . . . 32 | |||
D.2.1. First request . . . . . . . . . . . . . . . . . . . . 33 | D.2. Header Field Representation Examples . . . . . . . . . . 32 | |||
D.2.2. Second request . . . . . . . . . . . . . . . . . . . 34 | D.2.1. Literal Header Field with Indexing . . . . . . . . . 32 | |||
D.2.3. Third request . . . . . . . . . . . . . . . . . . . . 35 | D.2.2. Literal Header Field without Indexing . . . . . . . . 33 | |||
D.3. Request Examples with Huffman . . . . . . . . . . . . . . 37 | D.2.3. Indexed Header Field . . . . . . . . . . . . . . . . 34 | |||
D.3.1. First request . . . . . . . . . . . . . . . . . . . . 37 | D.2.4. Indexed Header Field from Static Table . . . . . . . 35 | |||
D.3.2. Second request . . . . . . . . . . . . . . . . . . . 38 | D.3. Request Examples without Huffman . . . . . . . . . . . . 35 | |||
D.3.3. Third request . . . . . . . . . . . . . . . . . . . . 40 | D.3.1. First request . . . . . . . . . . . . . . . . . . . . 35 | |||
D.4. Response Examples without Huffman . . . . . . . . . . . . 42 | D.3.2. Second request . . . . . . . . . . . . . . . . . . . 37 | |||
D.4.1. First response . . . . . . . . . . . . . . . . . . . 42 | D.3.3. Third request . . . . . . . . . . . . . . . . . . . . 38 | |||
D.4.2. Second response . . . . . . . . . . . . . . . . . . . 44 | D.4. Request Examples with Huffman . . . . . . . . . . . . . . 40 | |||
D.4.3. Third response . . . . . . . . . . . . . . . . . . . 45 | D.4.1. First request . . . . . . . . . . . . . . . . . . . . 40 | |||
D.5. Response Examples with Huffman . . . . . . . . . . . . . 47 | D.4.2. Second request . . . . . . . . . . . . . . . . . . . 41 | |||
D.5.1. First response . . . . . . . . . . . . . . . . . . . 47 | D.4.3. Third request . . . . . . . . . . . . . . . . . . . . 42 | |||
D.5.2. Second response . . . . . . . . . . . . . . . . . . . 50 | D.5. Response Examples without Huffman . . . . . . . . . . . . 44 | |||
D.5.3. Third response . . . . . . . . . . . . . . . . . . . 51 | D.5.1. First response . . . . . . . . . . . . . . . . . . . 44 | |||
D.5.2. Second response . . . . . . . . . . . . . . . . . . . 46 | ||||
D.5.3. Third response . . . . . . . . . . . . . . . . . . . 47 | ||||
D.6. Response Examples with Huffman . . . . . . . . . . . . . 49 | ||||
D.6.1. First response . . . . . . . . . . . . . . . . . . . 49 | ||||
D.6.2. Second response . . . . . . . . . . . . . . . . . . . 52 | ||||
D.6.3. Third response . . . . . . . . . . . . . . . . . . . 53 | ||||
1. Introduction | 1. Introduction | |||
This specification defines HPACK, a compression format for | This specification defines HPACK, a compression format for | |||
efficiently representing HTTP header fields in the context of HTTP/2 | efficiently representing HTTP header fields in the context of HTTP/2 | |||
(see [HTTP2]). | (see [HTTP2]). | |||
2. Overview | 2. Overview | |||
In HTTP/1.1 (see [HTTP-p1]), header fields are encoded without any | In HTTP/1.1 (see [HTTP-p1]), header fields are encoded without any | |||
form of compression. As web pages have grown to include dozens to | form of compression. As web pages have grown to include dozens to | |||
hundreds of requests, the redundant header fields in these requests | hundreds of requests, the redundant header fields in these requests | |||
now measurably increase latency and unnecessarily consume bandwidth | now measurably increase latency and unnecessarily consume bandwidth | |||
skipping to change at page 7, line 15 | skipping to change at page 7, line 26 | |||
3.1.4. Header Field Representation | 3.1.4. Header Field Representation | |||
An encoded header field can be represented either as a literal or as | An encoded header field can be represented either as a literal or as | |||
an index. | an index. | |||
Literal Representation: A literal representation defines a new | Literal Representation: A literal representation defines a new | |||
header field. The header field name is represented either | header field. The header field name is represented either | |||
literally or as a reference to an entry of the header table. The | literally or as a reference to an entry of the header table. The | |||
header field value is represented literally. | header field value is represented literally. | |||
Two different literal representations are provided: | Three different literal representations are provided: | |||
* A literal representation that does not add the header field to | * A literal representation that does not add the header field to | |||
the header table (see Section 4.3.1). | the header table (see Section 4.3.2). | |||
* A literal representation that does not add the header field to | ||||
the header table and require that this header field always use | ||||
a literal representation, in particular when re-encoded by an | ||||
intermediary (see Section 4.3.3). | ||||
* A literal representation that adds the header field as a new | * A literal representation that adds the header field as a new | |||
entry at the beginning of the header table (see Section 4.3.2). | entry at the beginning of the header table (see Section 4.3.1). | |||
Indexed Representation: The indexed representation defines a header | Indexed Representation: The indexed representation defines a header | |||
field as a reference to an entry in either the header table or the | field as a reference to an entry in either the header table or the | |||
static table (see Section 4.2). | static table (see Section 4.2). | |||
Indices between 1 and len(header table), inclusive, refer to | ||||
elements in the header table, with index 1 referring to the | ||||
beginning of the table. | ||||
Indices between len(header table) + 1 and len(header table) + | ||||
len(static table), inclusive, refer to elements in the static | ||||
table, where the index len(header table) + 1 refers to the first | ||||
entry in the static table. | ||||
Any other indices MUST be treated as a decoding error. | ||||
<---------- Index Address Space ----------> | <---------- Index Address Space ----------> | |||
<-- Header Table --> <-- Static Table --> | <-- Header Table --> <-- Static Table --> | |||
+---+-----------+---+ +---+-----------+---+ | +---+-----------+---+ +---+-----------+---+ | |||
| 1 | ... | k | |k+1| ... | n | | | 1 | ... | k | |k+1| ... | n | | |||
+---+-----------+---+ +---+-----------+---+ | +---+-----------+---+ +---+-----------+---+ | |||
^ | | ^ | | |||
| V | | V | |||
Insertion Point Drop Point | Insertion Point Drop Point | |||
Index Address Space | Index Address Space | |||
Indices between 1 and len(header table), inclusive, refer to | ||||
elements in the header table, with index 1 referring to the | ||||
beginning of the table. | ||||
Indices between len(header table)+1 and len(header | ||||
table)+len(static table), inclusive, refer to elements in the | ||||
static table, where the index len(header table)+1 refers to the | ||||
first entry in the static table. | ||||
Index 0 signals a modification of the encoding context: either | ||||
the reference set is emptied, or the maximum size of the header | ||||
table is updated (see Section 4.4). | ||||
Any other indices MUST be treated as erroneous, and the | ||||
compression context considered corrupt and unusable. | ||||
3.1.5. Header Field Emission | 3.1.5. Header Field Emission | |||
The emission of a header field is the process of marking a header | The emission of a header field is the process of marking a header | |||
field as belonging to the current header set. Once a header has been | field as belonging to the current header set. Once a header has been | |||
emitted, it cannot be removed from the current header set. | emitted, it cannot be removed from the current header set. | |||
On the decoding side, an emitted header field can be safely passed to | On the decoding side, an emitted header field can be safely passed to | |||
the upper processing layer as part of the current header set. The | the upper processing layer as part of the current header set. The | |||
decoder MAY pass the emitted header fields to the upper processing | decoder MAY pass the emitted header fields to the upper processing | |||
layer in any order. | layer in any order. | |||
skipping to change at page 9, line 12 | skipping to change at page 9, line 22 | |||
o If referencing an element of the static table: | o If referencing an element of the static table: | |||
* The header field corresponding to the referenced entry is | * The header field corresponding to the referenced entry is | |||
emitted. | emitted. | |||
* The referenced static entry is inserted at the beginning of the | * The referenced static entry is inserted at the beginning of the | |||
header table. | header table. | |||
* A reference to this new header table entry is added to the | * A reference to this new header table entry is added to the | |||
reference set (except if this new entry didn't fit in the | reference set, except if this new entry didn't fit in the | |||
header table). | header table. | |||
o If referencing an element of the header table: | o If referencing an element of the header table: | |||
* The header field corresponding to the referenced entry is | * The header field corresponding to the referenced entry is | |||
emitted. | emitted. | |||
* The referenced header table entry is added to the reference | * The referenced header table entry is added to the reference | |||
set. | set. | |||
A _literal representation_ that is _not added_ to the header table | A _literal representation_ that is _not added_ to the header table | |||
skipping to change at page 11, line 27 | skipping to change at page 11, line 42 | |||
representation always finishes at the end of an octet. | representation always finishes at the end of an octet. | |||
An integer is represented in two parts: a prefix that fills the | An integer is represented in two parts: a prefix that fills the | |||
current octet and an optional list of octets that are used if the | current octet and an optional list of octets that are used if the | |||
integer value does not fit within the prefix. The number of bits of | integer value does not fit within the prefix. The number of bits of | |||
the prefix (called N) is a parameter of the integer representation. | the prefix (called N) is a parameter of the integer representation. | |||
The N-bit prefix allows filling the current octet. If the value is | The N-bit prefix allows filling the current octet. If the value is | |||
small enough (strictly less than 2^N-1), it is encoded within the | small enough (strictly less than 2^N-1), it is encoded within the | |||
N-bit prefix. Otherwise all the bits of the prefix are set to 1 and | N-bit prefix. Otherwise all the bits of the prefix are set to 1 and | |||
the value is encoded using an unsigned variable length integer [4] | the value is encoded using an unsigned variable length integer | |||
representation. N is always between 1 and 8 bits. An integer | representation (see <http://en.wikipedia.org/wiki/Variable- | |||
length_quantity>). N is always between 1 and 8 bits. An integer | ||||
starting at an octet-boundary will have an 8-bit prefix. | starting at an octet-boundary will have an 8-bit prefix. | |||
The algorithm to represent an integer I is as follows: | The algorithm to represent an integer I is as follows: | |||
if I < 2^N - 1, encode I on N bits | if I < 2^N - 1, encode I on N bits | |||
else | else | |||
encode (2^N - 1) on N bits | encode (2^N - 1) on N bits | |||
I = I - (2^N - 1) | I = I - (2^N - 1) | |||
while I >= 128 | while I >= 128 | |||
encode (I % 128 + 128) on 8 bits | encode (I % 128 + 128) on 8 bits | |||
skipping to change at page 12, line 8 | skipping to change at page 12, line 23 | |||
if I < 2^N - 1, return I | if I < 2^N - 1, return I | |||
else | else | |||
M = 0 | M = 0 | |||
repeat | repeat | |||
B = next octet | B = next octet | |||
I = I + (B & 127) * 2^M | I = I + (B & 127) * 2^M | |||
M = M + 7 | M = M + 7 | |||
while B & 128 == 128 | while B & 128 == 128 | |||
return I | return I | |||
Examples illustrating the encoding of integers are available in | ||||
Appendix D.1. | ||||
This integer representation allows for values of indefinite size. It | This integer representation allows for values of indefinite size. It | |||
is also possible for an encoder to send a large number of zero | is also possible for an encoder to send a large number of zero | |||
values, which can waste octets and could be used to overflow integer | values, which can waste octets and could be used to overflow integer | |||
values. Excessively large integer encodings - in value or octet | values. Excessively large integer encodings - in value or octet | |||
length - MUST be treated as a decoding error. Different limits can | length - MUST be treated as a decoding error. Different limits can | |||
be set for each of the different uses of integers, based on | be set for each of the different uses of integers, based on | |||
implementation constraints. | implementation constraints. | |||
4.1.1.1. Example 1: Encoding 10 using a 5-bit prefix | 4.1.2. String Literal Representation | |||
The value 10 is to be encoded with a 5-bit prefix. | ||||
o 10 is less than 31 (= 2^5 - 1) and is represented using the 5-bit | ||||
prefix. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| X | X | X | 0 | 1 | 0 | 1 | 0 | 10 stored on 5 bits | ||||
+---+---+---+---+---+---+---+---+ | ||||
4.1.1.2. Example 2: Encoding 1337 using a 5-bit prefix | ||||
The value I=1337 is to be encoded with a 5-bit prefix. | ||||
1337 is greater than 31 (= 2^5 - 1). | ||||
The 5-bit prefix is filled with its max value (31). | ||||
I = 1337 - (2^5 - 1) = 1306. | ||||
I (1306) is greater than or equal to 128, the while loop body | ||||
executes: | ||||
I % 128 == 26 | ||||
26 + 128 == 154 | ||||
154 is encoded in 8 bits as: 10011010 | ||||
I is set to 10 (1306 / 128 == 10) | ||||
I is no longer greater than or equal to 128, the while loop | ||||
terminates. | ||||
I, now 10, is encoded on 8 bits as: 00001010 | ||||
The process ends. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| X | X | X | 1 | 1 | 1 | 1 | 1 | Prefix = 31, I = 1306 | ||||
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1306>=128, encode(154), I=1306/128 | ||||
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 10<128, encode(10), done | ||||
+---+---+---+---+---+---+---+---+ | ||||
4.1.1.3. Example 3: Encoding 42 starting at an octet-boundary | ||||
The value 42 is to be encoded starting at an octet-boundary. This | ||||
implies that a 8-bit prefix is used. | ||||
o 42 is less than 255 (= 2^8 - 1) and is represented using the 8-bit | Header field names and header field values can be represented as | |||
prefix. | literal string. A literal string is encoded as a sequence of octets, | |||
either by directly encoding the literal string's octets, or by using | ||||
a canonical [CANON] Huffman encoding [HUFF]. | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 42 stored on 8 bits | | H | String Length (7+) | | |||
+---+---+---+---+---+---+---+---+ | +---+---------------------------+ | |||
| String Data (Length octets) | | ||||
4.1.2. String Literal Representation | +-------------------------------+ | |||
Header field names and header field values are encoded as sequences | ||||
of octets. A header field name or a header field value is encoded in | ||||
three parts: | ||||
1. One bit, H, indicating whether or not the octets are Huffman | ||||
encoded. | ||||
2. The number of octets required to hold the result of the next | ||||
step, represented as an integer with a 7-bit prefix (see | ||||
Section 4.1.1), immediately following the first bit. | ||||
3. The encoded data of the string: | String Literal Representation | |||
* If H is '1', then the encoded string data is the bitwise | A literal string representation contains the following fields: | |||
concatenation of the canonical [CANON] Huffman code [HUFF] | ||||
corresponding to each octet of the data, followed by between | ||||
0-7 bits of padding. | ||||
* If H is '0', then the encoded string is the octets of the | H: A one bit flag, H, indicating whether or not the octets of the | |||
field value without modification. | string are Huffman encoded. | |||
Padding is necessary when doing Huffman encoding to ensure that the | String Length: The number of octets used to encode the string | |||
remaining bits between the actual end of the data and the next octet | literal, encoded as an integer with 7-bit prefix (see | |||
boundary are not misinterpreted as part of the input data. | Section 4.1.1). | |||
When padding for Huffman encoding, the bits from the EOS (end-of- | String Data: The encoded data of the string literal. If H is '0', | |||
string) entry in the Huffman table are used, starting with the MSB | then the encoded data is the raw octets of the string literal. If | |||
(most significant bit). This entry is guaranteed to be at least 8 | H is '1', then the encoded data is the Huffman encoding of the | |||
bits long. | string literal. | |||
String literals which use Huffman encoding are encoded with the | String literals which use Huffman encoding are encoded with the | |||
Huffman Codes Appendix C (see examples in Request Examples with | Huffman codes defined in Appendix C (see examples inRequest Examples | |||
Huffman Appendix D.3 and in Response Examples with Huffman | with Huffman Appendix D.4 and in Response Examples with Huffman | |||
Appendix D.5). | Appendix D.6). The encoded data is the bitwise concatenation of the | |||
Huffman codes corresponding to each octet of the string literal. | ||||
The EOS symbol is represented with value 256, and is used solely to | ||||
signal the end of the Huffman-encoded key data or the end of the | ||||
Huffman-encoded value data. Given that only between 0-7 bits of the | ||||
EOS symbol is included in any Huffman-encoded string, and given that | ||||
the EOS symbol is at least 8 bits long, it is expected that it should | ||||
never be successfully decoded. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| 1 | Value Length Prefix (7) | | ||||
+---+---+---+---+---+---+---+---+ | ||||
| Value Length (0-N octets) | | ||||
+---+---+---+---+---+---+---+---+ | ||||
... | ||||
+---+---+---+---+---+---+---+---+ | ||||
| Huffman Encoded Data |Padding| | ||||
+---+---+---+---+---+---+---+---+ | ||||
String Literal with Huffman Encoding | ||||
0 1 2 3 4 5 6 7 | As the Huffman encoded data doesn't always end at an octet boundary, | |||
+---+---+---+---+---+---+---+---+ | some padding is inserted after it up to the next octet boundary. To | |||
| 0 | Value Length Prefix (7) | | prevent this padding to be misinterpreted as part of the string | |||
+---+---+---+---+---+---+---+---+ | literal, the most significant bits of the EOS (end-of-string) entry | |||
| Value Length (0-N octets) | | in the Huffman table are used. | |||
+---+---+---+---+---+---+---+---+ | ||||
... | ||||
+---+---+---+---+---+---+---+---+ | ||||
| Field Bytes without Encoding | | ||||
+---+---+---+---+---+---+---+---+ | ||||
String Literal without Huffman Encoding | Upon decoding, an incomplete Huffman code at the end of the encoded | |||
data is to be considered as padding and discarded. A padding | ||||
strictly longer than 7 bits MUST be treated as a decoding error. A | ||||
padding not corresponding to the most significant bits of the EOS | ||||
entry MUST be treated as a decoding error. A Huffman encoded string | ||||
literal containing the EOS entry MUST be treated as a decoding error. | ||||
4.2. Indexed Header Field Representation | 4.2. Indexed Header Field Representation | |||
An indexed header field representation either identifies an entry in | An indexed header field representation either identifies an entry in | |||
the header table or static table. The processing of an indexed | the header table or static table. The processing of an indexed | |||
header field representation is described in Section 3.2.1. | header field representation is described in Section 3.2.1. | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 1 | Index (7+) | | | 1 | Index (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
Indexed Header Field | Indexed Header Field | |||
This representation starts with the '1' 1-bit pattern, followed by | This representation starts with the '1' 1-bit pattern, followed by | |||
the index of the matching pair, represented as an integer with a | the index of the matching pair, represented as an integer with a | |||
7-bit prefix. | 7-bit prefix. | |||
The index value of 0 is reserved for signalling changes in the | The index value of 0 is not used. It MUST be treated as a decoding | |||
encoding context (see Section 4.4). | error if found in an indexed header field representation. | |||
4.3. Literal Header Field Representation | 4.3. Literal Header Field Representation | |||
Literal header field representations contain a literal header field | Literal header field representations contain a literal header field | |||
value. Header field names are either provided as a literal or by | value. Header field names are either provided as a literal or by | |||
reference to an existing header table or static table entry. | reference to an existing header table or static table entry. | |||
Literal representations all result in the emission of a header field | Literal representations all result in the emission of a header field | |||
when decoded. | when decoded. | |||
4.3.1. Literal Header Field without Indexing | 4.3.1. Literal Header Field with Incremental Indexing | |||
A literal header field without indexing causes the emission of a | A literal header field with incremental indexing adds a new entry to | |||
header field without altering the header table. | the header table. | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 1 | Index (6+) | | | 0 | 1 | Index (6+) | | |||
+---+---+---+-------------------+ | +---+---+-----------------------+ | |||
| H | Value Length (7+) | | | H | Value Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Value String (Length octets) | | | Value String (Length octets) | | |||
+-------------------------------+ | +-------------------------------+ | |||
Literal Header Field without Indexing - Indexed Name | Literal Header Field with Incremental Indexing - Indexed Name | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 1 | 0 | | | 0 | 1 | 0 | | |||
+---+---+---+-------------------+ | +---+---+-----------------------+ | |||
| H | Name Length (7+) | | | H | Name Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Name String (Length octets) | | | Name String (Length octets) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| H | Value Length (7+) | | | H | Value Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Value String (Length octets) | | | Value String (Length octets) | | |||
+-------------------------------+ | +-------------------------------+ | |||
Literal Header Field without Indexing - New Name | Literal Header Field with Incremental Indexing - New Name | |||
This representation starts with the '01' 2-bit pattern. | This representation starts with the '01' 2-bit pattern. | |||
If the header field name matches the header field name of a (name, | If the header field name matches the header field name of a (name, | |||
value) pair stored in the Header Table or Static Table, the header | value) pair stored in the Header Table or Static Table, the header | |||
field name can be represented using the index of that entry. In this | field name can be represented using the index of that entry. In this | |||
case, the index of the entry, index (which is strictly greater than | case, the index of the entry, index (which is strictly greater than | |||
0), is represented as an integer with a 6-bit prefix (see | 0), is represented as an integer with a 6-bit prefix (see | |||
Section 4.1.1). | Section 4.1.1). | |||
Otherwise, the header field name is represented as a literal. The | Otherwise, the header field name is represented as a literal. The | |||
value 0 is represented on 6 bits followed by the header field name | value 0 is represented on 6 bits followed by the header field name | |||
(see Section 4.1.2). | (see Section 4.1.2). | |||
The header field name representation is followed by the header field | The header field name representation is followed by the header field | |||
value represented as a literal string as described in Section 4.1.2. | value represented as a literal string as described in Section 4.1.2. | |||
4.3.2. Literal Header Field with Incremental Indexing | 4.3.2. Literal Header Field without Indexing | |||
A literal header field with incremental indexing adds a new entry to | A literal header field without indexing causes the emission of a | |||
the header table. | header field without altering the header table. | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | Index (6+) | | | 0 | 0 | 0 | 0 | Index (4+) | | |||
+---+---+---+-------------------+ | +---+---+-----------------------+ | |||
| H | Value Length (7+) | | | H | Value Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Value String (Length octets) | | | Value String (Length octets) | | |||
+-------------------------------+ | +-------------------------------+ | |||
Literal Header Field with Incremental Indexing - Indexed Name | ||||
Literal Header Field without Indexing - Indexed Name | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | 0 | 0 | | | 0 | 0 | 0 | 0 | 0 | | |||
+---+---+---+-------------------+ | +---+---+-----------------------+ | |||
| H | Name Length (7+) | | | H | Name Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Name String (Length octets) | | | Name String (Length octets) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| H | Value Length (7+) | | | H | Value Length (7+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
| Value String (Length octets) | | | Value String (Length octets) | | |||
+-------------------------------+ | +-------------------------------+ | |||
Literal Header Field with Incremental Indexing - New Name | Literal Header Field without Indexing - New Name | |||
This representation starts with the '00' 2-bit pattern. | The literal header field without indexing representation starts with | |||
the '0000' 4-bit pattern. | ||||
If the header field name matches the header field name of a (name, | If the header field name matches the header field name of a (name, | |||
value) pair stored in the Header Table or Static Table, the header | value) pair stored in the Header Table or Static Table, the header | |||
field name can be represented using the index of that entry. In this | field name can be represented using the index of that entry. In this | |||
case, the index of the entry, index (which is strictly greater than | case, the index of the entry, index (which is strictly greater than | |||
0), is represented as an integer with a 6-bit prefix (see | 0), is represented as an integer with a 6-bit prefix (see | |||
Section 4.1.1). | Section 4.1.1). | |||
Otherwise, the header field name is represented as a literal. The | Otherwise, the header field name is represented as a literal. The | |||
value 0 is represented on 6 bits followed by the header field name | value 0 is represented on 4 bits followed by the header field name | |||
(see Section 4.1.2). | (see Section 4.1.2). | |||
The header field name representation is followed by the header field | The header field name representation is followed by the header field | |||
value represented as a literal string as described in Section 4.1.2. | value represented as a literal string as described in Section 4.1.2. | |||
4.3.3. Literal Header Field never Indexed | ||||
A literal header field never indexed causes the emission of a header | ||||
field without altering the header table. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| 0 | 0 | 0 | 1 | Index (4+) | | ||||
+---+---+-----------------------+ | ||||
| H | Value Length (7+) | | ||||
+---+---------------------------+ | ||||
| Value String (Length octets) | | ||||
+-------------------------------+ | ||||
Literal Header Field never Indexed - Indexed Name | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| 0 | 0 | 0 | 1 | 0 | | ||||
+---+---+-----------------------+ | ||||
| H | Name Length (7+) | | ||||
+---+---------------------------+ | ||||
| Name String (Length octets) | | ||||
+---+---------------------------+ | ||||
| H | Value Length (7+) | | ||||
+---+---------------------------+ | ||||
| Value String (Length octets) | | ||||
+-------------------------------+ | ||||
Literal Header Field never Indexed - New Name | ||||
The literal header field never indexed representation starts with the | ||||
'0001' 4-bit pattern. | ||||
When a header field is represented as a literal header field never | ||||
indexed, it MUST always be encoded with this same representation. In | ||||
particular, when a peer sends a header field that it received | ||||
represented as a literal header field never indexed, it MUST use the | ||||
same representation to forward this header field. | ||||
This representation is intended for protecting header field values | ||||
that are not to be put at risk by compressing them (see Section 5.1 | ||||
for more details). | ||||
The encoding of the representation is the same as for the literal | ||||
header field without indexing representation (see Section 4.3.2). | ||||
4.4. Encoding Context Update | 4.4. Encoding Context Update | |||
An indexed value of 0 is reserved for signalling changes in the | An encoding context update causes the immediate application of a | |||
encoding context. The type of the change is encoded on the following | change to the encoding context. | |||
octet(s). Any change in the encoding context is applied immediately. | ||||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 1 | 0 | | | 0 | 0 | 1 | F | ... | | |||
+---+---------------------------+ | ||||
Context Update | ||||
An encoding context update starts with the '001' 3-bit pattern. | ||||
It is followed by a flag specifying the type of the change, and by | ||||
any data necessary to describe the change itself. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| 0 | 0 | 1 | 1 | 0 | | ||||
+---+---------------------------+ | +---+---------------------------+ | |||
Reference Set Emptying | Reference Set Emptying | |||
An octet with its high bit set to '1' signals that the reference set | The flag bit being set to '1' signals that the reference set is | |||
is emptied. The remaining bits are set to '0'. | emptied. The remaining bits are set to '0'. | |||
0 1 2 3 4 5 6 7 | 0 1 2 3 4 5 6 7 | |||
+---+---+---+---+---+---+---+---+ | +---+---+---+---+---+---+---+---+ | |||
| 0 | New maximum size (7+) | | | 0 | 0 | 1 | 0 | Max size (4+) | | |||
+---+---------------------------+ | +---+---------------------------+ | |||
Maximum Header Table Size Change | Maximum Header Table Size Change | |||
An octet with its high bit set to '0' signals the new maximum size of | The flag bit being set to '0' signals that a change to the maximum | |||
the header table. This new maximum size MUST be lower than or equal | size of the header table. This new maximum size MUST be lower than | |||
to the value of the setting SETTINGS_HEADER_TABLE_SIZE (see [HTTP2]). | or equal to the value of the setting SETTINGS_HEADER_TABLE_SIZE (see | |||
[HTTP2]). | ||||
The new maximum size is encoded as an integer with a 7-bit prefix. | The new maximum size is encoded as an integer with a 4-bit prefix. | |||
Change in the maximum size of the header table can trigger entry | Change in the maximum size of the header table can trigger entry | |||
evictions (see Section 3.3.2). | evictions (see Section 3.3.2). | |||
5. Security Considerations | 5. Security Considerations | |||
This compressor exists to solve security issues present in stream | 5.1. Compression-based Attacks | |||
compressors such as DEFLATE whereby the compression context can be | ||||
efficiently probed to reveal secrets. A conformant implementation of | ||||
this specification should be fairly safe against that kind of attack, | ||||
as the reaping of any information from the compression context | ||||
requires more work than guessing and verifying the plain text data | ||||
directly with the server. As with any secret, however, the longer | ||||
the length of the secret, the more difficult the secret is to guess. | ||||
It is inadvisable to have short cookies that are relied upon to | ||||
remain secret for any duration of time. | ||||
A proper security-conscious implementation will also need to prevent | Compression can create a weak point allowing an attacker to recover | |||
timing attacks by ensuring that the amount of time it takes to do | secret data. For example, the CRIME attack (see [CRIME]) took | |||
string comparisons is always a function of the total length of the | advantage of the DEFLATE mechanism (see [DEFLATE]) of SPDY (see | |||
strings, and not a function of the number of matched characters. | [SPDY]) to efficiently probe the compression context. The full-text | |||
compression mechanism of DEFLATE allowed the attacker to learn some | ||||
information from each failed attempt at guessing the secret. | ||||
A decoder needs to ensure that larger values or encodings of integers | For this reason, HPACK provides only limited compression mechanisms | |||
do not permit exploitation. Decoders MUST limit the size of | in the form of an indexing table and of a static Huffman encoding. | |||
integers, both in value and encoded length, that it accepts (see | ||||
Section 4.1.1). | ||||
Another common security problem is when the remote endpoint | The indexing table can still provide information to an attacker that | |||
successfully causes the local endpoint to exhaust its memory. This | would be able to probe the compression context. However, this | |||
compressor attempts to deal with the most obvious ways that this | information is limited to the knowledge of whether the attacker's | |||
could occur by limiting both the peak and the steady-state amount of | guess is correct or not. | |||
memory consumed in the compressor state, by providing ways for the | ||||
application to consume/flush the emitted header fields in small | ||||
chunks, and by considering overhead in the state size calculation. | ||||
Implementors must still be careful in the creation of APIs to an | ||||
implementation of this compressor by ensuring that header field keys | ||||
and values are either emitted as a stream, or that the compression | ||||
implementation have a limit on the maximum size of a key or value. | ||||
Failure to implement these kinds of safeguards may still result in a | ||||
scenario where the local endpoint exhausts its memory. | ||||
A particular care should be used for the maximum size of the header | Still, an attacker could take advantage of this limited information | |||
table. While an endpoint can fully control the maximum size of its | for breaking low-entropy secrets using a brute-force attack. A | |||
header table for the decoding size, by using | server usually has some protections against such brute-force attack. | |||
SETTINGS_HEADER_TABLE_SIZE, the maximum size of the encoding size is | Here, the attack would target the client, where it would be harder to | |||
controlled by the remote peer. The endpoint should check the | detect. The attack would be even more dangerous if the attacker is | |||
SETTINGS_HEADER_TABLE_SIZE defined by the remote peer, and decrease | able to prevent the traffic generated by its brute-force attack from | |||
the maximum size for the encoding size if needed. | reaching the server. | |||
To offer some protection against such type of attacks, HPACK enables | ||||
an endpoint to indicate that a header field must never be compressed, | ||||
across any hop up to the other endpoint (see Section 4.3.3). An | ||||
endpoint MUST use this feature to prevent the compression of any | ||||
header field whose value contains a secret which could be put at risk | ||||
by a brute-force attack. | ||||
For optimal processing, a sensitive value (for example a cookie) | ||||
needs to have an entropy high enough to not be endangered by a brute- | ||||
force attack, in order to take advantage of HPACK indexing. | ||||
There is currently no known threat taking advantage of the use of a | ||||
fixed Huffman encoding. A study has shown that using a fixed Huffman | ||||
encoding table created an information leakage, however this same | ||||
study concluded that an attacker could not take advantage of this | ||||
information leakage to recover any meaningful amount of information | ||||
(see [PETAL]). | ||||
5.2. Memory Consumption | ||||
An attacker can try to cause an endpoint to exhaust its memory. | ||||
HPACK is designed to limit both the peak and state amounts of memory | ||||
allocated by an endpoint. | ||||
The amount of memory used by the compressor state is limited by the | ||||
value of the setting SETTINGS_HEADER_TABLE_SIZE. This limitation | ||||
takes into account both the size of the data stored in the header | ||||
table, and the overhead required by the table structure itself. | ||||
For the decoding side, an endpoint can limit the amount of state | ||||
memory used by setting an appropriate value for | ||||
SETTINGS_HEADER_TABLE_SIZE. For the encoding side, the endpoint can | ||||
limit the amount of state memory it uses by defining a header table | ||||
maximum size lower than the value of SETTINGS_HEADER_TABLE_SIZE | ||||
defined by its peer (see Section 4.4). | ||||
The amount of temporary memory consumed is linked to the set of | ||||
header fields emitted or received. However, this amount of temporary | ||||
memory can be limited by processing these header fields in a | ||||
streaming manner. | ||||
5.3. Implementation Limits | ||||
An implementation of HPACK needs to ensure that large values for | ||||
integers, long encoding for integers, or long string literal do not | ||||
create security weaknesses. | ||||
An implementation has to set a limit for the values it accepts for | ||||
integers, as well as for the encoded length (see Section 4.1.1). In | ||||
the same way, it has to set a limit to the length it accepts for | ||||
string literals (see Section 4.1.2). | ||||
6. Acknowledgements | 6. Acknowledgements | |||
This document includes substantial editorial contributions from the | This document includes substantial editorial contributions from the | |||
following individuals: Mike Bishop, Jeff Pinner, Julian Reschke, | following individuals: Mike Bishop, Jeff Pinner, Julian Reschke, | |||
Martin Thomson. | Martin Thomson. | |||
7. References | 7. References | |||
7.1. Normative References | 7.1. Normative References | |||
skipping to change at page 20, line 19 | skipping to change at page 20, line 47 | |||
articleDetails.jsp?arnumber=4051119>. | articleDetails.jsp?arnumber=4051119>. | |||
[PERF1] Belshe, M., "IETF83: SPDY and What to Consider for HTTP/ | [PERF1] Belshe, M., "IETF83: SPDY and What to Consider for HTTP/ | |||
2.0", March 2012, <http://www.ietf.org/proceedings/83/ | 2.0", March 2012, <http://www.ietf.org/proceedings/83/ | |||
slides/slides-83-httpbis-3>. | slides/slides-83-httpbis-3>. | |||
[PERF2] McManus, P., "SPDY: What I Like About You", September | [PERF2] McManus, P., "SPDY: What I Like About You", September | |||
2011, <http://bitsup.blogspot.com/2011/09/spdy-what-i | 2011, <http://bitsup.blogspot.com/2011/09/spdy-what-i | |||
-like-about-you.html>. | -like-about-you.html>. | |||
[PETAL] Tan, J. and J. Nahata, "PETAL: Preset Encoding Table | ||||
Information Leakage", April 2013, <http://www.pdl.cmu.edu/ | ||||
PDL-FTP/associated/CMU-PDL-13-106.pdf>. | ||||
[SPDY] Belshe, M. and R. Peon, "SPDY Protocol", draft-mbelshe- | [SPDY] Belshe, M. and R. Peon, "SPDY Protocol", draft-mbelshe- | |||
httpbis-spdy-00 (work in progress), February 2012. | httpbis-spdy-00 (work in progress), February 2012. | |||
Appendix A. Change Log (to be removed by RFC Editor before publication | Appendix A. Change Log (to be removed by RFC Editor before publication | |||
A.1. Since draft-ietf-httpbis-header-compression-05 | A.1. Since draft-ietf-httpbis-header-compression-06 | |||
o Updated format to include literal headers that must never be | ||||
compressed. | ||||
o Updated security considerations. | ||||
o Moved integer encoding examples to the appendix. | ||||
o Updated Huffman table. | ||||
o Updated static header table (adding and removing status values). | ||||
o Updated examples. | ||||
A.2. Since draft-ietf-httpbis-header-compression-05 | ||||
o Regenerated examples. | o Regenerated examples. | |||
o Only one Huffman table for requests and responses. | o Only one Huffman table for requests and responses. | |||
o Added maximum size for header table, independent of | o Added maximum size for header table, independent of | |||
SETTINGS_HEADER_TABLE_SIZE. | SETTINGS_HEADER_TABLE_SIZE. | |||
o Added pseudo-code for integer decoding. | o Added pseudo-code for integer decoding. | |||
o Improved examples (removing unnecessary removals). | o Improved examples (removing unnecessary removals). | |||
A.2. Since draft-ietf-httpbis-header-compression-04 | A.3. Since draft-ietf-httpbis-header-compression-04 | |||
o Updated examples: take into account changes in the spec, and show | o Updated examples: take into account changes in the spec, and show | |||
more features. | more features. | |||
o Use 'octet' everywhere instead of having both 'byte' and 'octet'. | o Use 'octet' everywhere instead of having both 'byte' and 'octet'. | |||
o Added reference set emptying. | o Added reference set emptying. | |||
o Editorial changes and clarifications. | o Editorial changes and clarifications. | |||
o Added "host" header to the static table. | o Added "host" header to the static table. | |||
o Ordering for list of values (either NULL- or comma-separated). | o Ordering for list of values (either NULL- or comma-separated). | |||
A.3. Since draft-ietf-httpbis-header-compression-03 | A.4. Since draft-ietf-httpbis-header-compression-03 | |||
o A large number of editorial changes; changed the description of | o A large number of editorial changes; changed the description of | |||
evicting/adding new entries. | evicting/adding new entries. | |||
o Removed substitution indexing | o Removed substitution indexing | |||
o Changed 'initial headers' to 'static headers', as per issue #258 | o Changed 'initial headers' to 'static headers', as per issue #258 | |||
o Merged 'request' and 'response' static headers, as per issue #259 | o Merged 'request' and 'response' static headers, as per issue #259 | |||
o Changed text to indicate that new headers are added at index 0 and | o Changed text to indicate that new headers are added at index 0 and | |||
expire from the largest index, as per issue #233 | expire from the largest index, as per issue #233 | |||
A.4. Since draft-ietf-httpbis-header-compression-02 | A.5. Since draft-ietf-httpbis-header-compression-02 | |||
o Corrected error in integer encoding pseudocode. | o Corrected error in integer encoding pseudocode. | |||
A.5. Since draft-ietf-httpbis-header-compression-01 | A.6. Since draft-ietf-httpbis-header-compression-01 | |||
o Refactored of Header Encoding Section: split definitions and | o Refactored of Header Encoding Section: split definitions and | |||
processing rule. | processing rule. | |||
o Backward incompatible change: Updated reference set management as | o Backward incompatible change: Updated reference set management as | |||
per issue #214. This changes how the interaction between the | per issue #214. This changes how the interaction between the | |||
reference set and eviction works. This also changes the working | reference set and eviction works. This also changes the working | |||
of the reference set in some specific cases. | of the reference set in some specific cases. | |||
o Backward incompatible change: modified initial header list, as per | o Backward incompatible change: modified initial header list, as per | |||
skipping to change at page 21, line 46 | skipping to change at page 22, line 43 | |||
o Added example of 32 octets entry structure (issue #191). | o Added example of 32 octets entry structure (issue #191). | |||
o Added Header Set Completion section. Reflowed some text. | o Added Header Set Completion section. Reflowed some text. | |||
Clarified some writing which was akward. Added text about | Clarified some writing which was akward. Added text about | |||
duplicate header entry encoding. Clarified some language w.r.t | duplicate header entry encoding. Clarified some language w.r.t | |||
Header Set. Changed x-my-header to mynewheader. Added text in | Header Set. Changed x-my-header to mynewheader. Added text in | |||
the HeaderEmission section indicating that the application may | the HeaderEmission section indicating that the application may | |||
also be able to free up memory more quickly. Added information in | also be able to free up memory more quickly. Added information in | |||
Security Considerations section. | Security Considerations section. | |||
A.6. Since draft-ietf-httpbis-header-compression-00 | A.7. Since draft-ietf-httpbis-header-compression-00 | |||
Fixed bug/omission in integer representation algorithm. | Fixed bug/omission in integer representation algorithm. | |||
Changed the document title. | Changed the document title. | |||
Header matching text rewritten. | Header matching text rewritten. | |||
Changed the definition of header emission. | Changed the definition of header emission. | |||
Changed the name of the setting which dictates how much memory the | Changed the name of the setting which dictates how much memory the | |||
skipping to change at page 22, line 23 | skipping to change at page 23, line 21 | |||
one octet | one octet | |||
Added descriptions of opcodes | Added descriptions of opcodes | |||
Removed security claims from introduction. | Removed security claims from introduction. | |||
Appendix B. Static Table | Appendix B. Static Table | |||
The static table consists of an unchangeable ordered list of (name, | The static table consists of an unchangeable ordered list of (name, | |||
value) pairs. The first entry in the table is always represented by | value) pairs. The first entry in the table is always represented by | |||
the index len(header table)+1, and the last entry in the table is | the index len(header table) + 1, and the last entry in the table is | |||
represented by the index len(header table)+len(static table). | represented by the index len(header table) + len(static table). | |||
[[The ordering of these tables is currently arbitrary. The tables in | ||||
this section should be updated and ordered such that the table | ||||
entries with the smallest indices are those which, based on a | ||||
statistical analysis of the frequency of use weighted by size, | ||||
achieve the largest decrease in octets transmitted subject to HTTP 2 | ||||
header field rules (like removal of some header fields). This set of | ||||
header fields is currently very likely incomplete, and should be made | ||||
complete. ]] | ||||
The following table lists the pre-defined header fields that make-up | The following table lists the pre-defined header fields that make-up | |||
the static header table. | the static table. | |||
+-------+-----------------------------+--------------+ | +-------+-----------------------------+--------------+ | |||
| Index | Header Name | Header Value | | | Index | Header Name | Header Value | | |||
+-------+-----------------------------+--------------+ | +-------+-----------------------------+--------------+ | |||
| 1 | :authority | | | | 1 | :authority | | | |||
| 2 | :method | GET | | | 2 | :method | GET | | |||
| 3 | :method | POST | | | 3 | :method | POST | | |||
| 4 | :path | / | | | 4 | :path | / | | |||
| 5 | :path | /index.html | | | 5 | :path | /index.html | | |||
| 6 | :scheme | http | | | 6 | :scheme | http | | |||
| 7 | :scheme | https | | | 7 | :scheme | https | | |||
| 8 | :status | 200 | | | 8 | :status | 200 | | |||
| 9 | :status | 500 | | | 9 | :status | 204 | | |||
| 10 | :status | 404 | | | 10 | :status | 206 | | |||
| 11 | :status | 403 | | | 11 | :status | 304 | | |||
| 12 | :status | 400 | | | 12 | :status | 400 | | |||
| 13 | :status | 401 | | | 13 | :status | 404 | | |||
| 14 | accept-charset | | | | 14 | :status | 500 | | |||
| 15 | accept-encoding | | | | 15 | accept-charset | | | |||
| 16 | accept-language | | | | 16 | accept-encoding | | | |||
| 17 | accept-ranges | | | | 17 | accept-language | | | |||
| 18 | accept | | | | 18 | accept-ranges | | | |||
| 19 | access-control-allow-origin | | | | 19 | accept | | | |||
| 20 | age | | | | 20 | access-control-allow-origin | | | |||
| 21 | allow | | | | 21 | age | | | |||
| 22 | authorization | | | | 22 | allow | | | |||
| 23 | cache-control | | | | 23 | authorization | | | |||
| 24 | content-disposition | | | | 24 | cache-control | | | |||
| 25 | content-encoding | | | | 25 | content-disposition | | | |||
| 26 | content-language | | | | 26 | content-encoding | | | |||
| 27 | content-length | | | | 27 | content-language | | | |||
| 28 | content-location | | | | 28 | content-length | | | |||
| 29 | content-range | | | | 29 | content-location | | | |||
| 30 | content-type | | | | 30 | content-range | | | |||
| 31 | cookie | | | | 31 | content-type | | | |||
| 32 | date | | | | 32 | cookie | | | |||
| 33 | etag | | | | 33 | date | | | |||
| 34 | expect | | | | 34 | etag | | | |||
| 35 | expires | | | | 35 | expect | | | |||
| 36 | from | | | | 36 | expires | | | |||
| 37 | host | | | | 37 | from | | | |||
| 38 | if-match | | | | 38 | host | | | |||
| 39 | if-modified-since | | | | 39 | if-match | | | |||
| 40 | if-none-match | | | | 40 | if-modified-since | | | |||
| 41 | if-range | | | | 41 | if-none-match | | | |||
| 42 | if-unmodified-since | | | | 42 | if-range | | | |||
| 43 | last-modified | | | | 43 | if-unmodified-since | | | |||
| 44 | link | | | | 44 | last-modified | | | |||
| 45 | location | | | | 45 | link | | | |||
| 46 | max-forwards | | | | 46 | location | | | |||
| 47 | proxy-authenticate | | | | 47 | max-forwards | | | |||
| 48 | proxy-authorization | | | | 48 | proxy-authenticate | | | |||
| 49 | range | | | | 49 | proxy-authorization | | | |||
| 50 | referer | | | | 50 | range | | | |||
| 51 | refresh | | | | 51 | referer | | | |||
| 52 | retry-after | | | | 52 | refresh | | | |||
| 53 | server | | | | 53 | retry-after | | | |||
| 54 | set-cookie | | | | 54 | server | | | |||
| 55 | strict-transport-security | | | | 55 | set-cookie | | | |||
| 56 | transfer-encoding | | | | 56 | strict-transport-security | | | |||
| 57 | user-agent | | | | 57 | transfer-encoding | | | |||
| 58 | vary | | | | 58 | user-agent | | | |||
| 59 | via | | | | 59 | vary | | | |||
| 60 | www-authenticate | | | | 60 | via | | | |||
| 61 | www-authenticate | | | ||||
+-------+-----------------------------+--------------+ | +-------+-----------------------------+--------------+ | |||
Table 1: Static Table Entries | Table 1: Static Table Entries | |||
The table give the index of each entry in the static table. The full | The table give the index of each entry in the static table. The full | |||
index of each entry, to be used for encoding a reference to this | index of each entry, to be used for encoding a reference to this | |||
entry, is computed by adding the number of entries in the header | entry, is computed by adding the number of entries in the header | |||
table to this index. | table to this index. | |||
Appendix C. Huffman Codes | Appendix C. Huffman Codes | |||
The following Huffman codes are used when encoding string literals. | The following codes are used when encoding string literals with an | |||
Huffman coding (see Section 4.1.2). | ||||
[[This table will be regenerated. ]] | Each row in the table specifies one Huffman code: | |||
aligned aligned | sym: The symbol to be represented. It is the decimal value of an | |||
to len to len | octet, possibly prepended with its ASCII representation. A | |||
MSB in LSB in | specific symbol, "EOS", is used to indicate the end of a string | |||
sym as bits bits as hex bits | literal. | |||
( 0) |11111111|11111111|11110111|010 [27] 7ffffba [27] | ||||
( 1) |11111111|11111111|11110111|011 [27] 7ffffbb [27] | code as bits: The Huffman code for the symbol represented as a | |||
( 2) |11111111|11111111|11110111|100 [27] 7ffffbc [27] | base-2 integer. | |||
( 3) |11111111|11111111|11110111|101 [27] 7ffffbd [27] | ||||
( 4) |11111111|11111111|11110111|110 [27] 7ffffbe [27] | code as hex: The Huffman code for the symbol, represented as a | |||
( 5) |11111111|11111111|11110111|111 [27] 7ffffbf [27] | hexadecimal integer, aligned on the least significant bit. | |||
( 6) |11111111|11111111|11111000|000 [27] 7ffffc0 [27] | ||||
( 7) |11111111|11111111|11111000|001 [27] 7ffffc1 [27] | len: The number of bits for the Huffman code of the symbol. | |||
( 8) |11111111|11111111|11111000|010 [27] 7ffffc2 [27] | ||||
( 9) |11111111|11111111|11111000|011 [27] 7ffffc3 [27] | As an example, the Huffman code for the symbol 48 (corresponding to | |||
( 10) |11111111|11111111|11111000|100 [27] 7ffffc4 [27] | the ASCII character "0") consists in the 5 bits "0", "0", "1", "0", | |||
( 11) |11111111|11111111|11111000|101 [27] 7ffffc5 [27] | "1". This corresponds to the value 5 encoded on 5 bits. | |||
( 12) |11111111|11111111|11111000|110 [27] 7ffffc6 [27] | ||||
( 13) |11111111|11111111|11111000|111 [27] 7ffffc7 [27] | code | |||
( 14) |11111111|11111111|11111001|000 [27] 7ffffc8 [27] | code as bits as hex len | |||
( 15) |11111111|11111111|11111001|001 [27] 7ffffc9 [27] | sym aligned to MSB aligned in | |||
( 16) |11111111|11111111|11111001|010 [27] 7ffffca [27] | to LSB bits | |||
( 17) |11111111|11111111|11111001|011 [27] 7ffffcb [27] | ( 0) |11111111|11111111|11101110|10 3ffffba [26] | |||
( 18) |11111111|11111111|11111001|100 [27] 7ffffcc [27] | ( 1) |11111111|11111111|11101110|11 3ffffbb [26] | |||
( 19) |11111111|11111111|11111001|101 [27] 7ffffcd [27] | ( 2) |11111111|11111111|11101111|00 3ffffbc [26] | |||
( 20) |11111111|11111111|11111001|110 [27] 7ffffce [27] | ( 3) |11111111|11111111|11101111|01 3ffffbd [26] | |||
( 21) |11111111|11111111|11111001|111 [27] 7ffffcf [27] | ( 4) |11111111|11111111|11101111|10 3ffffbe [26] | |||
( 22) |11111111|11111111|11111010|000 [27] 7ffffd0 [27] | ( 5) |11111111|11111111|11101111|11 3ffffbf [26] | |||
( 23) |11111111|11111111|11111010|001 [27] 7ffffd1 [27] | ( 6) |11111111|11111111|11110000|00 3ffffc0 [26] | |||
( 24) |11111111|11111111|11111010|010 [27] 7ffffd2 [27] | ( 7) |11111111|11111111|11110000|01 3ffffc1 [26] | |||
( 25) |11111111|11111111|11111010|011 [27] 7ffffd3 [27] | ( 8) |11111111|11111111|11110000|10 3ffffc2 [26] | |||
( 26) |11111111|11111111|11111010|100 [27] 7ffffd4 [27] | ( 9) |11111111|11111111|11110000|11 3ffffc3 [26] | |||
( 27) |11111111|11111111|11111010|101 [27] 7ffffd5 [27] | ( 10) |11111111|11111111|11110001|00 3ffffc4 [26] | |||
( 28) |11111111|11111111|11111010|110 [27] 7ffffd6 [27] | ( 11) |11111111|11111111|11110001|01 3ffffc5 [26] | |||
( 29) |11111111|11111111|11111010|111 [27] 7ffffd7 [27] | ( 12) |11111111|11111111|11110001|10 3ffffc6 [26] | |||
( 30) |11111111|11111111|11111011|000 [27] 7ffffd8 [27] | ( 13) |11111111|11111111|11110001|11 3ffffc7 [26] | |||
( 31) |11111111|11111111|11111011|001 [27] 7ffffd9 [27] | ( 14) |11111111|11111111|11110010|00 3ffffc8 [26] | |||
' ' ( 32) |11101000| [8] e8 [8] | ( 15) |11111111|11111111|11110010|01 3ffffc9 [26] | |||
'!' ( 33) |11111111|1100 [12] ffc [12] | ( 16) |11111111|11111111|11110010|10 3ffffca [26] | |||
'"' ( 34) |11111111|111010 [14] 3ffa [14] | ( 17) |11111111|11111111|11110010|11 3ffffcb [26] | |||
'#' ( 35) |11111111|1111100 [15] 7ffc [15] | ( 18) |11111111|11111111|11110011|00 3ffffcc [26] | |||
'$' ( 36) |11111111|1111101 [15] 7ffd [15] | ( 19) |11111111|11111111|11110011|01 3ffffcd [26] | |||
'%' ( 37) |100100 [6] 24 [6] | ( 20) |11111111|11111111|11110011|10 3ffffce [26] | |||
'&' ( 38) |1101110 [7] 6e [7] | ( 21) |11111111|11111111|11110011|11 3ffffcf [26] | |||
''' ( 39) |11111111|1111110 [15] 7ffe [15] | ( 22) |11111111|11111111|11110100|00 3ffffd0 [26] | |||
'(' ( 40) |11111111|010 [11] 7fa [11] | ( 23) |11111111|11111111|11110100|01 3ffffd1 [26] | |||
')' ( 41) |11111111|011 [11] 7fb [11] | ( 24) |11111111|11111111|11110100|10 3ffffd2 [26] | |||
'*' ( 42) |11111110|10 [10] 3fa [10] | ( 25) |11111111|11111111|11110100|11 3ffffd3 [26] | |||
'+' ( 43) |11111111|100 [11] 7fc [11] | ( 26) |11111111|11111111|11110101|00 3ffffd4 [26] | |||
',' ( 44) |11101001| [8] e9 [8] | ( 27) |11111111|11111111|11110101|01 3ffffd5 [26] | |||
'-' ( 45) |100101 [6] 25 [6] | ( 28) |11111111|11111111|11110101|10 3ffffd6 [26] | |||
'.' ( 46) |00100 [5] 4 [5] | ( 29) |11111111|11111111|11110101|11 3ffffd7 [26] | |||
'/' ( 47) |0000 [4] 0 [4] | ( 30) |11111111|11111111|11110110|00 3ffffd8 [26] | |||
'0' ( 48) |00101 [5] 5 [5] | ( 31) |11111111|11111111|11110110|01 3ffffd9 [26] | |||
'1' ( 49) |00110 [5] 6 [5] | ' ' ( 32) |00110 6 [ 5] | |||
'2' ( 50) |00111 [5] 7 [5] | '!' ( 33) |11111111|11100 1ffc [13] | |||
'3' ( 51) |100110 [6] 26 [6] | '"' ( 34) |11111000|0 1f0 [ 9] | |||
'4' ( 52) |100111 [6] 27 [6] | '#' ( 35) |11111111|111100 3ffc [14] | |||
'5' ( 53) |101000 [6] 28 [6] | '$' ( 36) |11111111|1111100 7ffc [15] | |||
'6' ( 54) |101001 [6] 29 [6] | '%' ( 37) |011110 1e [ 6] | |||
'7' ( 55) |101010 [6] 2a [6] | '&' ( 38) |1100100 64 [ 7] | |||
'8' ( 56) |101011 [6] 2b [6] | ''' ( 39) |11111111|11101 1ffd [13] | |||
'9' ( 57) |101100 [6] 2c [6] | '(' ( 40) |11111110|10 3fa [10] | |||
':' ( 58) |11110110|0 [9] 1ec [9] | ')' ( 41) |11111000|1 1f1 [ 9] | |||
';' ( 59) |11101010| [8] ea [8] | '*' ( 42) |11111110|11 3fb [10] | |||
'<' ( 60) |11111111|11111111|10 [18] 3fffe [18] | '+' ( 43) |11111111|00 3fc [10] | |||
'=' ( 61) |101101 [6] 2d [6] | ',' ( 44) |1100101 65 [ 7] | |||
'>' ( 62) |11111111|11111110|0 [17] 1fffc [17] | '-' ( 45) |1100110 66 [ 7] | |||
'?' ( 63) |11110110|1 [9] 1ed [9] | '.' ( 46) |011111 1f [ 6] | |||
'@' ( 64) |11111111|111011 [14] 3ffb [14] | '/' ( 47) |00111 7 [ 5] | |||
'A' ( 65) |1101111 [7] 6f [7] | '0' ( 48) |0000 0 [ 4] | |||
'B' ( 66) |11101011| [8] eb [8] | '1' ( 49) |0001 1 [ 4] | |||
'C' ( 67) |11101100| [8] ec [8] | '2' ( 50) |0010 2 [ 4] | |||
'D' ( 68) |11101101| [8] ed [8] | '3' ( 51) |01000 8 [ 5] | |||
'E' ( 69) |11101110| [8] ee [8] | '4' ( 52) |100000 20 [ 6] | |||
'F' ( 70) |1110000 [7] 70 [7] | '5' ( 53) |100001 21 [ 6] | |||
'G' ( 71) |11110111|0 [9] 1ee [9] | '6' ( 54) |100010 22 [ 6] | |||
'H' ( 72) |11110111|1 [9] 1ef [9] | '7' ( 55) |100011 23 [ 6] | |||
'I' ( 73) |11111000|0 [9] 1f0 [9] | '8' ( 56) |100100 24 [ 6] | |||
'J' ( 74) |11111000|1 [9] 1f1 [9] | '9' ( 57) |100101 25 [ 6] | |||
'K' ( 75) |11111110|11 [10] 3fb [10] | ':' ( 58) |100110 26 [ 6] | |||
'L' ( 76) |11111001|0 [9] 1f2 [9] | ';' ( 59) |11101100| ec [ 8] | |||
'M' ( 77) |11101111| [8] ef [8] | '<' ( 60) |11111111|11111110|0 1fffc [17] | |||
'N' ( 78) |11111001|1 [9] 1f3 [9] | '=' ( 61) |100111 27 [ 6] | |||
'O' ( 79) |11111010|0 [9] 1f4 [9] | '>' ( 62) |11111111|1111101 7ffd [15] | |||
'P' ( 80) |11111010|1 [9] 1f5 [9] | '?' ( 63) |11111111|01 3fd [10] | |||
'Q' ( 81) |11111011|0 [9] 1f6 [9] | '@' ( 64) |11111111|1111110 7ffe [15] | |||
'R' ( 82) |11111011|1 [9] 1f7 [9] | 'A' ( 65) |1100111 67 [ 7] | |||
'S' ( 83) |11110000| [8] f0 [8] | 'B' ( 66) |11101101| ed [ 8] | |||
'T' ( 84) |11110001| [8] f1 [8] | 'C' ( 67) |11101110| ee [ 8] | |||
'U' ( 85) |11111100|0 [9] 1f8 [9] | 'D' ( 68) |1101000 68 [ 7] | |||
'V' ( 86) |11111100|1 [9] 1f9 [9] | 'E' ( 69) |11101111| ef [ 8] | |||
'W' ( 87) |11111101|0 [9] 1fa [9] | 'F' ( 70) |1101001 69 [ 7] | |||
'X' ( 88) |11111101|1 [9] 1fb [9] | 'G' ( 71) |1101010 6a [ 7] | |||
'Y' ( 89) |11111110|0 [9] 1fc [9] | 'H' ( 72) |11111001|0 1f2 [ 9] | |||
'Z' ( 90) |11111111|00 [10] 3fc [10] | 'I' ( 73) |11110000| f0 [ 8] | |||
'[' ( 91) |11111111|111100 [14] 3ffc [14] | 'J' ( 74) |11111001|1 1f3 [ 9] | |||
'\' ( 92) |11111111|11111111|11111011|010 [27] 7ffffda [27] | 'K' ( 75) |11111010|0 1f4 [ 9] | |||
']' ( 93) |11111111|11100 [13] 1ffc [13] | 'L' ( 76) |11111010|1 1f5 [ 9] | |||
'^' ( 94) |11111111|111101 [14] 3ffd [14] | 'M' ( 77) |1101011 6b [ 7] | |||
'_' ( 95) |101110 [6] 2e [6] | 'N' ( 78) |1101100 6c [ 7] | |||
'`' ( 96) |11111111|11111111|110 [19] 7fffe [19] | 'O' ( 79) |11110001| f1 [ 8] | |||
'a' ( 97) |01000 [5] 8 [5] | 'P' ( 80) |11110010| f2 [ 8] | |||
'b' ( 98) |101111 [6] 2f [6] | 'Q' ( 81) |11111011|0 1f6 [ 9] | |||
'c' ( 99) |01001 [5] 9 [5] | 'R' ( 82) |11111011|1 1f7 [ 9] | |||
'd' (100) |110000 [6] 30 [6] | 'S' ( 83) |1101101 6d [ 7] | |||
'e' (101) |0001 [4] 1 [4] | 'T' ( 84) |101000 28 [ 6] | |||
'f' (102) |110001 [6] 31 [6] | 'U' ( 85) |11110011| f3 [ 8] | |||
'g' (103) |110010 [6] 32 [6] | 'V' ( 86) |11111100|0 1f8 [ 9] | |||
'h' (104) |110011 [6] 33 [6] | 'W' ( 87) |11111100|1 1f9 [ 9] | |||
'i' (105) |01010 [5] a [5] | 'X' ( 88) |11110100| f4 [ 8] | |||
'j' (106) |1110001 [7] 71 [7] | 'Y' ( 89) |11111101|0 1fa [ 9] | |||
'k' (107) |1110010 [7] 72 [7] | 'Z' ( 90) |11111101|1 1fb [ 9] | |||
'l' (108) |01011 [5] b [5] | '[' ( 91) |11111111|100 7fc [11] | |||
'm' (109) |110100 [6] 34 [6] | '\' ( 92) |11111111|11111111|11110110|10 3ffffda [26] | |||
'n' (110) |01100 [5] c [5] | ']' ( 93) |11111111|101 7fd [11] | |||
'o' (111) |01101 [5] d [5] | '^' ( 94) |11111111|111101 3ffd [14] | |||
'p' (112) |01110 [5] e [5] | '_' ( 95) |1101110 6e [ 7] | |||
'q' (113) |11110010| [8] f2 [8] | '`' ( 96) |11111111|11111111|10 3fffe [18] | |||
'r' (114) |01111 [5] f [5] | 'a' ( 97) |01001 9 [ 5] | |||
's' (115) |10000 [5] 10 [5] | 'b' ( 98) |1101111 6f [ 7] | |||
't' (116) |10001 [5] 11 [5] | 'c' ( 99) |01010 a [ 5] | |||
'u' (117) |110101 [6] 35 [6] | 'd' (100) |101001 29 [ 6] | |||
'v' (118) |1110011 [7] 73 [7] | 'e' (101) |01011 b [ 5] | |||
'w' (119) |110110 [6] 36 [6] | 'f' (102) |1110000 70 [ 7] | |||
'x' (120) |11110011| [8] f3 [8] | 'g' (103) |101010 2a [ 6] | |||
'y' (121) |11110100| [8] f4 [8] | 'h' (104) |101011 2b [ 6] | |||
'z' (122) |11110101| [8] f5 [8] | 'i' (105) |01100 c [ 5] | |||
'{' (123) |11111111|11111110|1 [17] 1fffd [17] | 'j' (106) |11110101| f5 [ 8] | |||
'|' (124) |11111111|101 [11] 7fd [11] | 'k' (107) |11110110| f6 [ 8] | |||
'}' (125) |11111111|11111111|0 [17] 1fffe [17] | 'l' (108) |101100 2c [ 6] | |||
'~' (126) |11111111|1101 [12] ffd [12] | 'm' (109) |101101 2d [ 6] | |||
(127) |11111111|11111111|11111011|011 [27] 7ffffdb [27] | 'n' (110) |101110 2e [ 6] | |||
(128) |11111111|11111111|11111011|100 [27] 7ffffdc [27] | 'o' (111) |01101 d [ 5] | |||
(129) |11111111|11111111|11111011|101 [27] 7ffffdd [27] | 'p' (112) |101111 2f [ 6] | |||
(130) |11111111|11111111|11111011|110 [27] 7ffffde [27] | 'q' (113) |11111110|0 1fc [ 9] | |||
(131) |11111111|11111111|11111011|111 [27] 7ffffdf [27] | 'r' (114) |110000 30 [ 6] | |||
(132) |11111111|11111111|11111100|000 [27] 7ffffe0 [27] | 's' (115) |110001 31 [ 6] | |||
(133) |11111111|11111111|11111100|001 [27] 7ffffe1 [27] | 't' (116) |01110 e [ 5] | |||
(134) |11111111|11111111|11111100|010 [27] 7ffffe2 [27] | 'u' (117) |1110001 71 [ 7] | |||
(135) |11111111|11111111|11111100|011 [27] 7ffffe3 [27] | 'v' (118) |1110010 72 [ 7] | |||
(136) |11111111|11111111|11111100|100 [27] 7ffffe4 [27] | 'w' (119) |1110011 73 [ 7] | |||
(137) |11111111|11111111|11111100|101 [27] 7ffffe5 [27] | 'x' (120) |1110100 74 [ 7] | |||
(138) |11111111|11111111|11111100|110 [27] 7ffffe6 [27] | 'y' (121) |1110101 75 [ 7] | |||
(139) |11111111|11111111|11111100|111 [27] 7ffffe7 [27] | 'z' (122) |11110111| f7 [ 8] | |||
(140) |11111111|11111111|11111101|000 [27] 7ffffe8 [27] | '{' (123) |11111111|11111110|1 1fffd [17] | |||
(141) |11111111|11111111|11111101|001 [27] 7ffffe9 [27] | '|' (124) |11111111|1100 ffc [12] | |||
(142) |11111111|11111111|11111101|010 [27] 7ffffea [27] | '}' (125) |11111111|11111111|0 1fffe [17] | |||
(143) |11111111|11111111|11111101|011 [27] 7ffffeb [27] | '~' (126) |11111111|1101 ffd [12] | |||
(144) |11111111|11111111|11111101|100 [27] 7ffffec [27] | (127) |11111111|11111111|11110110|11 3ffffdb [26] | |||
(145) |11111111|11111111|11111101|101 [27] 7ffffed [27] | (128) |11111111|11111111|11110111|00 3ffffdc [26] | |||
(146) |11111111|11111111|11111101|110 [27] 7ffffee [27] | (129) |11111111|11111111|11110111|01 3ffffdd [26] | |||
(147) |11111111|11111111|11111101|111 [27] 7ffffef [27] | (130) |11111111|11111111|11110111|10 3ffffde [26] | |||
(148) |11111111|11111111|11111110|000 [27] 7fffff0 [27] | (131) |11111111|11111111|11110111|11 3ffffdf [26] | |||
(149) |11111111|11111111|11111110|001 [27] 7fffff1 [27] | (132) |11111111|11111111|11111000|00 3ffffe0 [26] | |||
(150) |11111111|11111111|11111110|010 [27] 7fffff2 [27] | (133) |11111111|11111111|11111000|01 3ffffe1 [26] | |||
(151) |11111111|11111111|11111110|011 [27] 7fffff3 [27] | (134) |11111111|11111111|11111000|10 3ffffe2 [26] | |||
(152) |11111111|11111111|11111110|100 [27] 7fffff4 [27] | (135) |11111111|11111111|11111000|11 3ffffe3 [26] | |||
(153) |11111111|11111111|11111110|101 [27] 7fffff5 [27] | (136) |11111111|11111111|11111001|00 3ffffe4 [26] | |||
(154) |11111111|11111111|11111110|110 [27] 7fffff6 [27] | (137) |11111111|11111111|11111001|01 3ffffe5 [26] | |||
(155) |11111111|11111111|11111110|111 [27] 7fffff7 [27] | (138) |11111111|11111111|11111001|10 3ffffe6 [26] | |||
(156) |11111111|11111111|11111111|000 [27] 7fffff8 [27] | (139) |11111111|11111111|11111001|11 3ffffe7 [26] | |||
(157) |11111111|11111111|11111111|001 [27] 7fffff9 [27] | (140) |11111111|11111111|11111010|00 3ffffe8 [26] | |||
(158) |11111111|11111111|11111111|010 [27] 7fffffa [27] | (141) |11111111|11111111|11111010|01 3ffffe9 [26] | |||
(159) |11111111|11111111|11111111|011 [27] 7fffffb [27] | (142) |11111111|11111111|11111010|10 3ffffea [26] | |||
(160) |11111111|11111111|11111111|100 [27] 7fffffc [27] | (143) |11111111|11111111|11111010|11 3ffffeb [26] | |||
(161) |11111111|11111111|11111111|101 [27] 7fffffd [27] | (144) |11111111|11111111|11111011|00 3ffffec [26] | |||
(162) |11111111|11111111|11111111|110 [27] 7fffffe [27] | (145) |11111111|11111111|11111011|01 3ffffed [26] | |||
(163) |11111111|11111111|11111111|111 [27] 7ffffff [27] | (146) |11111111|11111111|11111011|10 3ffffee [26] | |||
(164) |11111111|11111111|11100000|00 [26] 3ffff80 [26] | (147) |11111111|11111111|11111011|11 3ffffef [26] | |||
(165) |11111111|11111111|11100000|01 [26] 3ffff81 [26] | (148) |11111111|11111111|11111100|00 3fffff0 [26] | |||
(166) |11111111|11111111|11100000|10 [26] 3ffff82 [26] | (149) |11111111|11111111|11111100|01 3fffff1 [26] | |||
(167) |11111111|11111111|11100000|11 [26] 3ffff83 [26] | (150) |11111111|11111111|11111100|10 3fffff2 [26] | |||
(168) |11111111|11111111|11100001|00 [26] 3ffff84 [26] | (151) |11111111|11111111|11111100|11 3fffff3 [26] | |||
(169) |11111111|11111111|11100001|01 [26] 3ffff85 [26] | (152) |11111111|11111111|11111101|00 3fffff4 [26] | |||
(170) |11111111|11111111|11100001|10 [26] 3ffff86 [26] | (153) |11111111|11111111|11111101|01 3fffff5 [26] | |||
(171) |11111111|11111111|11100001|11 [26] 3ffff87 [26] | (154) |11111111|11111111|11111101|10 3fffff6 [26] | |||
(172) |11111111|11111111|11100010|00 [26] 3ffff88 [26] | (155) |11111111|11111111|11111101|11 3fffff7 [26] | |||
(173) |11111111|11111111|11100010|01 [26] 3ffff89 [26] | (156) |11111111|11111111|11111110|00 3fffff8 [26] | |||
(174) |11111111|11111111|11100010|10 [26] 3ffff8a [26] | (157) |11111111|11111111|11111110|01 3fffff9 [26] | |||
(175) |11111111|11111111|11100010|11 [26] 3ffff8b [26] | (158) |11111111|11111111|11111110|10 3fffffa [26] | |||
(176) |11111111|11111111|11100011|00 [26] 3ffff8c [26] | (159) |11111111|11111111|11111110|11 3fffffb [26] | |||
(177) |11111111|11111111|11100011|01 [26] 3ffff8d [26] | (160) |11111111|11111111|11111111|00 3fffffc [26] | |||
(178) |11111111|11111111|11100011|10 [26] 3ffff8e [26] | (161) |11111111|11111111|11111111|01 3fffffd [26] | |||
(179) |11111111|11111111|11100011|11 [26] 3ffff8f [26] | (162) |11111111|11111111|11111111|10 3fffffe [26] | |||
(180) |11111111|11111111|11100100|00 [26] 3ffff90 [26] | (163) |11111111|11111111|11111111|11 3ffffff [26] | |||
(181) |11111111|11111111|11100100|01 [26] 3ffff91 [26] | (164) |11111111|11111111|11000000|0 1ffff80 [25] | |||
(182) |11111111|11111111|11100100|10 [26] 3ffff92 [26] | (165) |11111111|11111111|11000000|1 1ffff81 [25] | |||
(183) |11111111|11111111|11100100|11 [26] 3ffff93 [26] | (166) |11111111|11111111|11000001|0 1ffff82 [25] | |||
(184) |11111111|11111111|11100101|00 [26] 3ffff94 [26] | (167) |11111111|11111111|11000001|1 1ffff83 [25] | |||
(185) |11111111|11111111|11100101|01 [26] 3ffff95 [26] | (168) |11111111|11111111|11000010|0 1ffff84 [25] | |||
(186) |11111111|11111111|11100101|10 [26] 3ffff96 [26] | (169) |11111111|11111111|11000010|1 1ffff85 [25] | |||
(187) |11111111|11111111|11100101|11 [26] 3ffff97 [26] | (170) |11111111|11111111|11000011|0 1ffff86 [25] | |||
(188) |11111111|11111111|11100110|00 [26] 3ffff98 [26] | (171) |11111111|11111111|11000011|1 1ffff87 [25] | |||
(189) |11111111|11111111|11100110|01 [26] 3ffff99 [26] | (172) |11111111|11111111|11000100|0 1ffff88 [25] | |||
(190) |11111111|11111111|11100110|10 [26] 3ffff9a [26] | (173) |11111111|11111111|11000100|1 1ffff89 [25] | |||
(191) |11111111|11111111|11100110|11 [26] 3ffff9b [26] | (174) |11111111|11111111|11000101|0 1ffff8a [25] | |||
(192) |11111111|11111111|11100111|00 [26] 3ffff9c [26] | (175) |11111111|11111111|11000101|1 1ffff8b [25] | |||
(193) |11111111|11111111|11100111|01 [26] 3ffff9d [26] | (176) |11111111|11111111|11000110|0 1ffff8c [25] | |||
(194) |11111111|11111111|11100111|10 [26] 3ffff9e [26] | (177) |11111111|11111111|11000110|1 1ffff8d [25] | |||
(195) |11111111|11111111|11100111|11 [26] 3ffff9f [26] | (178) |11111111|11111111|11000111|0 1ffff8e [25] | |||
(196) |11111111|11111111|11101000|00 [26] 3ffffa0 [26] | (179) |11111111|11111111|11000111|1 1ffff8f [25] | |||
(197) |11111111|11111111|11101000|01 [26] 3ffffa1 [26] | (180) |11111111|11111111|11001000|0 1ffff90 [25] | |||
(198) |11111111|11111111|11101000|10 [26] 3ffffa2 [26] | (181) |11111111|11111111|11001000|1 1ffff91 [25] | |||
(199) |11111111|11111111|11101000|11 [26] 3ffffa3 [26] | (182) |11111111|11111111|11001001|0 1ffff92 [25] | |||
(200) |11111111|11111111|11101001|00 [26] 3ffffa4 [26] | (183) |11111111|11111111|11001001|1 1ffff93 [25] | |||
(201) |11111111|11111111|11101001|01 [26] 3ffffa5 [26] | (184) |11111111|11111111|11001010|0 1ffff94 [25] | |||
(202) |11111111|11111111|11101001|10 [26] 3ffffa6 [26] | (185) |11111111|11111111|11001010|1 1ffff95 [25] | |||
(203) |11111111|11111111|11101001|11 [26] 3ffffa7 [26] | (186) |11111111|11111111|11001011|0 1ffff96 [25] | |||
(204) |11111111|11111111|11101010|00 [26] 3ffffa8 [26] | (187) |11111111|11111111|11001011|1 1ffff97 [25] | |||
(205) |11111111|11111111|11101010|01 [26] 3ffffa9 [26] | (188) |11111111|11111111|11001100|0 1ffff98 [25] | |||
(206) |11111111|11111111|11101010|10 [26] 3ffffaa [26] | (189) |11111111|11111111|11001100|1 1ffff99 [25] | |||
(207) |11111111|11111111|11101010|11 [26] 3ffffab [26] | (190) |11111111|11111111|11001101|0 1ffff9a [25] | |||
(208) |11111111|11111111|11101011|00 [26] 3ffffac [26] | (191) |11111111|11111111|11001101|1 1ffff9b [25] | |||
(209) |11111111|11111111|11101011|01 [26] 3ffffad [26] | (192) |11111111|11111111|11001110|0 1ffff9c [25] | |||
(210) |11111111|11111111|11101011|10 [26] 3ffffae [26] | (193) |11111111|11111111|11001110|1 1ffff9d [25] | |||
(211) |11111111|11111111|11101011|11 [26] 3ffffaf [26] | (194) |11111111|11111111|11001111|0 1ffff9e [25] | |||
(212) |11111111|11111111|11101100|00 [26] 3ffffb0 [26] | (195) |11111111|11111111|11001111|1 1ffff9f [25] | |||
(213) |11111111|11111111|11101100|01 [26] 3ffffb1 [26] | (196) |11111111|11111111|11010000|0 1ffffa0 [25] | |||
(214) |11111111|11111111|11101100|10 [26] 3ffffb2 [26] | (197) |11111111|11111111|11010000|1 1ffffa1 [25] | |||
(215) |11111111|11111111|11101100|11 [26] 3ffffb3 [26] | (198) |11111111|11111111|11010001|0 1ffffa2 [25] | |||
(216) |11111111|11111111|11101101|00 [26] 3ffffb4 [26] | (199) |11111111|11111111|11010001|1 1ffffa3 [25] | |||
(217) |11111111|11111111|11101101|01 [26] 3ffffb5 [26] | (200) |11111111|11111111|11010010|0 1ffffa4 [25] | |||
(218) |11111111|11111111|11101101|10 [26] 3ffffb6 [26] | (201) |11111111|11111111|11010010|1 1ffffa5 [25] | |||
(219) |11111111|11111111|11101101|11 [26] 3ffffb7 [26] | (202) |11111111|11111111|11010011|0 1ffffa6 [25] | |||
(220) |11111111|11111111|11101110|00 [26] 3ffffb8 [26] | (203) |11111111|11111111|11010011|1 1ffffa7 [25] | |||
(221) |11111111|11111111|11101110|01 [26] 3ffffb9 [26] | (204) |11111111|11111111|11010100|0 1ffffa8 [25] | |||
(222) |11111111|11111111|11101110|10 [26] 3ffffba [26] | (205) |11111111|11111111|11010100|1 1ffffa9 [25] | |||
(223) |11111111|11111111|11101110|11 [26] 3ffffbb [26] | (206) |11111111|11111111|11010101|0 1ffffaa [25] | |||
(224) |11111111|11111111|11101111|00 [26] 3ffffbc [26] | (207) |11111111|11111111|11010101|1 1ffffab [25] | |||
(225) |11111111|11111111|11101111|01 [26] 3ffffbd [26] | (208) |11111111|11111111|11010110|0 1ffffac [25] | |||
(226) |11111111|11111111|11101111|10 [26] 3ffffbe [26] | (209) |11111111|11111111|11010110|1 1ffffad [25] | |||
(227) |11111111|11111111|11101111|11 [26] 3ffffbf [26] | (210) |11111111|11111111|11010111|0 1ffffae [25] | |||
(228) |11111111|11111111|11110000|00 [26] 3ffffc0 [26] | (211) |11111111|11111111|11010111|1 1ffffaf [25] | |||
(229) |11111111|11111111|11110000|01 [26] 3ffffc1 [26] | (212) |11111111|11111111|11011000|0 1ffffb0 [25] | |||
(230) |11111111|11111111|11110000|10 [26] 3ffffc2 [26] | (213) |11111111|11111111|11011000|1 1ffffb1 [25] | |||
(231) |11111111|11111111|11110000|11 [26] 3ffffc3 [26] | (214) |11111111|11111111|11011001|0 1ffffb2 [25] | |||
(232) |11111111|11111111|11110001|00 [26] 3ffffc4 [26] | (215) |11111111|11111111|11011001|1 1ffffb3 [25] | |||
(233) |11111111|11111111|11110001|01 [26] 3ffffc5 [26] | (216) |11111111|11111111|11011010|0 1ffffb4 [25] | |||
(234) |11111111|11111111|11110001|10 [26] 3ffffc6 [26] | (217) |11111111|11111111|11011010|1 1ffffb5 [25] | |||
(235) |11111111|11111111|11110001|11 [26] 3ffffc7 [26] | (218) |11111111|11111111|11011011|0 1ffffb6 [25] | |||
(236) |11111111|11111111|11110010|00 [26] 3ffffc8 [26] | (219) |11111111|11111111|11011011|1 1ffffb7 [25] | |||
(237) |11111111|11111111|11110010|01 [26] 3ffffc9 [26] | (220) |11111111|11111111|11011100|0 1ffffb8 [25] | |||
(238) |11111111|11111111|11110010|10 [26] 3ffffca [26] | (221) |11111111|11111111|11011100|1 1ffffb9 [25] | |||
(239) |11111111|11111111|11110010|11 [26] 3ffffcb [26] | (222) |11111111|11111111|11011101|0 1ffffba [25] | |||
(240) |11111111|11111111|11110011|00 [26] 3ffffcc [26] | (223) |11111111|11111111|11011101|1 1ffffbb [25] | |||
(241) |11111111|11111111|11110011|01 [26] 3ffffcd [26] | (224) |11111111|11111111|11011110|0 1ffffbc [25] | |||
(242) |11111111|11111111|11110011|10 [26] 3ffffce [26] | (225) |11111111|11111111|11011110|1 1ffffbd [25] | |||
(243) |11111111|11111111|11110011|11 [26] 3ffffcf [26] | (226) |11111111|11111111|11011111|0 1ffffbe [25] | |||
(244) |11111111|11111111|11110100|00 [26] 3ffffd0 [26] | (227) |11111111|11111111|11011111|1 1ffffbf [25] | |||
(245) |11111111|11111111|11110100|01 [26] 3ffffd1 [26] | (228) |11111111|11111111|11100000|0 1ffffc0 [25] | |||
(246) |11111111|11111111|11110100|10 [26] 3ffffd2 [26] | (229) |11111111|11111111|11100000|1 1ffffc1 [25] | |||
(247) |11111111|11111111|11110100|11 [26] 3ffffd3 [26] | (230) |11111111|11111111|11100001|0 1ffffc2 [25] | |||
(248) |11111111|11111111|11110101|00 [26] 3ffffd4 [26] | (231) |11111111|11111111|11100001|1 1ffffc3 [25] | |||
(249) |11111111|11111111|11110101|01 [26] 3ffffd5 [26] | (232) |11111111|11111111|11100010|0 1ffffc4 [25] | |||
(250) |11111111|11111111|11110101|10 [26] 3ffffd6 [26] | (233) |11111111|11111111|11100010|1 1ffffc5 [25] | |||
(251) |11111111|11111111|11110101|11 [26] 3ffffd7 [26] | (234) |11111111|11111111|11100011|0 1ffffc6 [25] | |||
(252) |11111111|11111111|11110110|00 [26] 3ffffd8 [26] | (235) |11111111|11111111|11100011|1 1ffffc7 [25] | |||
(253) |11111111|11111111|11110110|01 [26] 3ffffd9 [26] | (236) |11111111|11111111|11100100|0 1ffffc8 [25] | |||
(254) |11111111|11111111|11110110|10 [26] 3ffffda [26] | (237) |11111111|11111111|11100100|1 1ffffc9 [25] | |||
(255) |11111111|11111111|11110110|11 [26] 3ffffdb [26] | (238) |11111111|11111111|11100101|0 1ffffca [25] | |||
EOS (256) |11111111|11111111|11110111|00 [26] 3ffffdc [26] | (239) |11111111|11111111|11100101|1 1ffffcb [25] | |||
(240) |11111111|11111111|11100110|0 1ffffcc [25] | ||||
(241) |11111111|11111111|11100110|1 1ffffcd [25] | ||||
(242) |11111111|11111111|11100111|0 1ffffce [25] | ||||
(243) |11111111|11111111|11100111|1 1ffffcf [25] | ||||
(244) |11111111|11111111|11101000|0 1ffffd0 [25] | ||||
(245) |11111111|11111111|11101000|1 1ffffd1 [25] | ||||
(246) |11111111|11111111|11101001|0 1ffffd2 [25] | ||||
(247) |11111111|11111111|11101001|1 1ffffd3 [25] | ||||
(248) |11111111|11111111|11101010|0 1ffffd4 [25] | ||||
(249) |11111111|11111111|11101010|1 1ffffd5 [25] | ||||
(250) |11111111|11111111|11101011|0 1ffffd6 [25] | ||||
(251) |11111111|11111111|11101011|1 1ffffd7 [25] | ||||
(252) |11111111|11111111|11101100|0 1ffffd8 [25] | ||||
(253) |11111111|11111111|11101100|1 1ffffd9 [25] | ||||
(254) |11111111|11111111|11101101|0 1ffffda [25] | ||||
(255) |11111111|11111111|11101101|1 1ffffdb [25] | ||||
EOS (256) |11111111|11111111|11101110|0 1ffffdc [25] | ||||
Appendix D. Examples | Appendix D. Examples | |||
A number of examples are worked through here, for both requests and | A number of examples are worked through here, covering integer | |||
responses, and with and without Huffman coding. | encoding, header field representation, and the encoding of whole sets | |||
of header fields, for both requests and responses, and with and | ||||
without Huffman coding. | ||||
D.1. Header Field Representation Examples | D.1. Integer Representation Examples | |||
This section show several independent representation examples. | This section shows the representation of integer values in details | |||
(see Section 4.1.1). | ||||
D.1.1. Literal Header Field with Indexing | D.1.1. Example 1: Encoding 10 using a 5-bit prefix | |||
The value 10 is to be encoded with a 5-bit prefix. | ||||
o 10 is less than 31 (2^5 - 1) and is represented using the 5-bit | ||||
prefix. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| X | X | X | 0 | 1 | 0 | 1 | 0 | 10 stored on 5 bits | ||||
+---+---+---+---+---+---+---+---+ | ||||
D.1.2. Example 2: Encoding 1337 using a 5-bit prefix | ||||
The value I=1337 is to be encoded with a 5-bit prefix. | ||||
1337 is greater than 31 (2^5 - 1). | ||||
The 5-bit prefix is filled with its max value (31). | ||||
I = 1337 - (2^5 - 1) = 1306. | ||||
I (1306) is greater than or equal to 128, the while loop body | ||||
executes: | ||||
I % 128 == 26 | ||||
26 + 128 == 154 | ||||
154 is encoded in 8 bits as: 10011010 | ||||
I is set to 10 (1306 / 128 == 10) | ||||
I is no longer greater than or equal to 128, the while loop | ||||
terminates. | ||||
I, now 10, is encoded on 8 bits as: 00001010. | ||||
The process ends. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| X | X | X | 1 | 1 | 1 | 1 | 1 | Prefix = 31, I = 1306 | ||||
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1306>=128, encode(154), I=1306/128 | ||||
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 10<128, encode(10), done | ||||
+---+---+---+---+---+---+---+---+ | ||||
D.1.3. Example 3: Encoding 42 starting at an octet-boundary | ||||
The value 42 is to be encoded starting at an octet-boundary. This | ||||
implies that a 8-bit prefix is used. | ||||
o 42 is less than 255 (2^8 - 1) and is represented using the 8-bit | ||||
prefix. | ||||
0 1 2 3 4 5 6 7 | ||||
+---+---+---+---+---+---+---+---+ | ||||
| 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 42 stored on 8 bits | ||||
+---+---+---+---+---+---+---+---+ | ||||
D.2. Header Field Representation Examples | ||||
This section shows several independent representation examples. | ||||
D.2.1. Literal Header Field with Indexing | ||||
The header field representation uses a literal name and a literal | The header field representation uses a literal name and a literal | |||
value. | value. | |||
Header set to encode: | Header set to encode: | |||
custom-key: custom-header | custom-key: custom-header | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
000a 6375 7374 6f6d 2d6b 6579 0d63 7573 | ..custom-key.cus | 400a 6375 7374 6f6d 2d6b 6579 0d63 7573 | @.custom-key.cus | |||
746f 6d2d 6865 6164 6572 | tom-header | 746f 6d2d 6865 6164 6572 | tom-header | |||
Decoding process: | Decoding process: | |||
00 | == Literal indexed == | 40 | == Literal indexed == | |||
0a | Literal name (len = 10) | 0a | Literal name (len = 10) | |||
6375 7374 6f6d 2d6b 6579 | custom-key | 6375 7374 6f6d 2d6b 6579 | custom-key | |||
0d | Literal value (len = 13) | 0d | Literal value (len = 13) | |||
6375 7374 6f6d 2d68 6561 6465 72 | custom-header | 6375 7374 6f6d 2d68 6561 6465 72 | custom-header | |||
| -> custom-key: custom-head\ | | -> custom-key: custom-head\ | |||
| er | | er | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 55) custom-key: custom-header | [ 1] (s = 55) custom-key: custom-header | |||
Table size: 55 | Table size: 55 | |||
Decoded header set: | Decoded header set: | |||
custom-key: custom-header | custom-key: custom-header | |||
D.1.2. Literal Header Field without Indexing | D.2.2. Literal Header Field without Indexing | |||
The header field representation uses an indexed name and a literal | The header field representation uses an indexed name and a literal | |||
value. | value. | |||
Header set to encode: | Header set to encode: | |||
:path: /sample/path | :path: /sample/path | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
440c 2f73 616d 706c 652f 7061 7468 | D./sample/path | 040c 2f73 616d 706c 652f 7061 7468 | ../sample/path | |||
Decoding process: | Decoding process: | |||
44 | == Literal not indexed == | 04 | == Literal not indexed == | |||
| Indexed name (idx = 4) | | Indexed name (idx = 4) | |||
| :path | | :path | |||
0c | Literal value (len = 12) | 0c | Literal value (len = 12) | |||
2f73 616d 706c 652f 7061 7468 | /sample/path | 2f73 616d 706c 652f 7061 7468 | /sample/path | |||
| -> :path: /sample/path | | -> :path: /sample/path | |||
Header table (after decoding): empty. | Header table (after decoding): empty. | |||
Decoded header set: | Decoded header set: | |||
:path: /sample/path | :path: /sample/path | |||
D.1.3. Indexed Header Field | D.2.3. Indexed Header Field | |||
The header field representation uses an indexed header field, from | The header field representation uses an indexed header field, from | |||
the static table. Upon using it, the static table entry is copied | the static table. Upon using it, the static table entry is copied | |||
into the header table. | into the header table. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
Reference set: empty. | Reference set: empty. | |||
skipping to change at page 32, line 20 | skipping to change at page 35, line 7 | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 42) :method: GET | [ 1] (s = 42) :method: GET | |||
Table size: 42 | Table size: 42 | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
D.1.4. Indexed Header Field from Static Table | D.2.4. Indexed Header Field from Static Table | |||
The header field representation uses an indexed header field, from | The header field representation uses an indexed header field, from | |||
the static table. In this example, the SETTINGS_HEADER_TABLE_SIZE is | the static table. In this example, the SETTINGS_HEADER_TABLE_SIZE is | |||
set to 0, therefore, the entry is not copied into the header table. | set to 0, therefore, the entry is not copied into the header table. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
Reference set: empty. | Reference set: empty. | |||
skipping to change at page 33, line 9 | skipping to change at page 35, line 35 | |||
82 | == Indexed - Add == | 82 | == Indexed - Add == | |||
| idx = 2 | | idx = 2 | |||
| -> :method: GET | | -> :method: GET | |||
Header table (after decoding): empty. | Header table (after decoding): empty. | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
D.2. Request Examples without Huffman | D.3. Request Examples without Huffman | |||
This section shows several consecutive header sets, corresponding to | This section shows several consecutive header sets, corresponding to | |||
HTTP requests, on the same connection. | HTTP requests, on the same connection. | |||
D.2.1. First request | D.3.1. First request | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8287 8604 0f77 7777 2e65 7861 6d70 6c65 | .....www.example | 8287 8644 0f77 7777 2e65 7861 6d70 6c65 | ...D.www.example | |||
2e63 6f6d | .com | 2e63 6f6d | .com | |||
Decoding process: | Decoding process: | |||
82 | == Indexed - Add == | 82 | == Indexed - Add == | |||
| idx = 2 | | idx = 2 | |||
| -> :method: GET | | -> :method: GET | |||
87 | == Indexed - Add == | 87 | == Indexed - Add == | |||
| idx = 7 | | idx = 7 | |||
| -> :scheme: http | | -> :scheme: http | |||
86 | == Indexed - Add == | 86 | == Indexed - Add == | |||
| idx = 6 | | idx = 6 | |||
| -> :path: / | | -> :path: / | |||
04 | == Literal indexed == | 44 | == Literal indexed == | |||
| Indexed name (idx = 4) | | Indexed name (idx = 4) | |||
| :authority | | :authority | |||
0f | Literal value (len = 15) | 0f | Literal value (len = 15) | |||
7777 772e 6578 616d 706c 652e 636f 6d | www.example.com | 7777 772e 6578 616d 706c 652e 636f 6d | www.example.com | |||
| -> :authority: www.example\ | | -> :authority: www.example\ | |||
| .com | | .com | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 57) :authority: www.example.com | [ 1] (s = 57) :authority: www.example.com | |||
skipping to change at page 34, line 20 | skipping to change at page 37, line 10 | |||
[ 4] (s = 42) :method: GET | [ 4] (s = 42) :method: GET | |||
Table size: 180 | Table size: 180 | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
D.2.2. Second request | D.3.2. Second request | |||
This request takes advantage of the differential encoding of header | This request takes advantage of the differential encoding of header | |||
sets. | sets. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
skipping to change at page 34, line 42 | skipping to change at page 37, line 32 | |||
Reference set: | Reference set: | |||
[ 1] :authority: www.example.com | [ 1] :authority: www.example.com | |||
[ 2] :path: / | [ 2] :path: / | |||
[ 3] :scheme: http | [ 3] :scheme: http | |||
[ 4] :method: GET | [ 4] :method: GET | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
1b08 6e6f 2d63 6163 6865 | ..no-cache | 5c08 6e6f 2d63 6163 6865 | \.no-cache | |||
Decoding process: | Decoding process: | |||
1b | == Literal indexed == | 5c | == Literal indexed == | |||
| Indexed name (idx = 27) | | Indexed name (idx = 28) | |||
| cache-control | | cache-control | |||
08 | Literal value (len = 8) | 08 | Literal value (len = 8) | |||
6e6f 2d63 6163 6865 | no-cache | 6e6f 2d63 6163 6865 | no-cache | |||
| -> cache-control: no-cache | | -> cache-control: no-cache | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 53) cache-control: no-cache | [ 1] (s = 53) cache-control: no-cache | |||
[ 2] (s = 57) :authority: www.example.com | [ 2] (s = 57) :authority: www.example.com | |||
[ 3] (s = 38) :path: / | [ 3] (s = 38) :path: / | |||
skipping to change at page 35, line 29 | skipping to change at page 38, line 20 | |||
Table size: 233 | Table size: 233 | |||
Decoded header set: | Decoded header set: | |||
cache-control: no-cache | cache-control: no-cache | |||
:authority: www.example.com | :authority: www.example.com | |||
:path: / | :path: / | |||
:scheme: http | :scheme: http | |||
:method: GET | :method: GET | |||
D.2.3. Third request | D.3.3. Third request | |||
This request has not enough headers in common with the previous | This request has not enough headers in common with the previous | |||
request to take advantage of the differential encoding. Therefore, | request to take advantage of the differential encoding. Therefore, | |||
the reference set is emptied before encoding the header fields. | the reference set is emptied before encoding the header fields. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: https | :scheme: https | |||
:path: /index.html | :path: /index.html | |||
skipping to change at page 36, line 13 | skipping to change at page 38, line 44 | |||
Reference set: | Reference set: | |||
[ 1] cache-control: no-cache | [ 1] cache-control: no-cache | |||
[ 2] :authority: www.example.com | [ 2] :authority: www.example.com | |||
[ 3] :path: / | [ 3] :path: / | |||
[ 4] :scheme: http | [ 4] :scheme: http | |||
[ 5] :method: GET | [ 5] :method: GET | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8080 858c 8b84 000a 6375 7374 6f6d 2d6b | ........custom-k | 3085 8c8b 8440 0a63 7573 746f 6d2d 6b65 | 0....@.custom-ke | |||
6579 0c63 7573 746f 6d2d 7661 6c75 65 | ey.custom-value | 790c 6375 7374 6f6d 2d76 616c 7565 | y.custom-value | |||
Decoding process: | Decoding process: | |||
80 80 | == Empty reference set == | 30 | == Empty reference set == | |||
| idx = 0 | | idx = 0 | |||
| flag = 1 | | flag = 1 | |||
85 | == Indexed - Add == | 85 | == Indexed - Add == | |||
| idx = 5 | | idx = 5 | |||
| -> :method: GET | | -> :method: GET | |||
8c | == Indexed - Add == | 8c | == Indexed - Add == | |||
| idx = 12 | | idx = 12 | |||
| -> :scheme: https | | -> :scheme: https | |||
8b | == Indexed - Add == | 8b | == Indexed - Add == | |||
| idx = 11 | | idx = 11 | |||
| -> :path: /index.html | | -> :path: /index.html | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> :authority: www.example\ | | -> :authority: www.example\ | |||
| .com | | .com | |||
00 | == Literal indexed == | 40 | == Literal indexed == | |||
0a | Literal name (len = 10) | 0a | Literal name (len = 10) | |||
6375 7374 6f6d 2d6b 6579 | custom-key | 6375 7374 6f6d 2d6b 6579 | custom-key | |||
0c | Literal value (len = 12) | 0c | Literal value (len = 12) | |||
6375 7374 6f6d 2d76 616c 7565 | custom-value | 6375 7374 6f6d 2d76 616c 7565 | custom-value | |||
| -> custom-key: custom-valu\ | | -> custom-key: custom-valu\ | |||
| e | | e | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 54) custom-key: custom-value | [ 1] (s = 54) custom-key: custom-value | |||
skipping to change at page 37, line 23 | skipping to change at page 40, line 5 | |||
Table size: 379 | Table size: 379 | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
:scheme: https | :scheme: https | |||
:path: /index.html | :path: /index.html | |||
:authority: www.example.com | :authority: www.example.com | |||
custom-key: custom-value | custom-key: custom-value | |||
D.3. Request Examples with Huffman | D.4. Request Examples with Huffman | |||
This section shows the same examples as the previous section, but | This section shows the same examples as the previous section, but | |||
using Huffman encoding for the literal values. | using Huffman encoding for the literal values. | |||
D.3.1. First request | D.4.1. First request | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8287 8604 8bdb 6d88 3e68 d1cb 1225 ba7f | ......m..h...%.. | 8287 8644 8ce7 cf9b ebe8 9b6f b16f a9b6 | ...D.......o.o.. | |||
ff | . | ||||
Decoding process: | Decoding process: | |||
82 | == Indexed - Add == | 82 | == Indexed - Add == | |||
| idx = 2 | | idx = 2 | |||
| -> :method: GET | | -> :method: GET | |||
87 | == Indexed - Add == | 87 | == Indexed - Add == | |||
| idx = 7 | | idx = 7 | |||
| -> :scheme: http | | -> :scheme: http | |||
86 | == Indexed - Add == | 86 | == Indexed - Add == | |||
| idx = 6 | | idx = 6 | |||
| -> :path: / | | -> :path: / | |||
04 | == Literal indexed == | 44 | == Literal indexed == | |||
| Indexed name (idx = 4) | | Indexed name (idx = 4) | |||
| :authority | | :authority | |||
8b | Literal value (len = 15) | 8c | Literal value (len = 15) | |||
| Huffman encoded: | | Huffman encoded: | |||
db6d 883e 68d1 cb12 25ba 7f | .m..h...%.. | e7cf 9beb e89b 6fb1 6fa9 b6ff | ......o.o... | |||
| Decoded: | | Decoded: | |||
| www.example.com | | www.example.com | |||
| -> :authority: www.example\ | | -> :authority: www.example\ | |||
| .com | | .com | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 57) :authority: www.example.com | [ 1] (s = 57) :authority: www.example.com | |||
[ 2] (s = 38) :path: / | [ 2] (s = 38) :path: / | |||
[ 3] (s = 43) :scheme: http | [ 3] (s = 43) :scheme: http | |||
[ 4] (s = 42) :method: GET | [ 4] (s = 42) :method: GET | |||
Table size: 180 | Table size: 180 | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
D.3.2. Second request | D.4.2. Second request | |||
This request takes advantage of the differential encoding of header | This request takes advantage of the differential encoding of header | |||
sets. | sets. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: http | :scheme: http | |||
:path: / | :path: / | |||
:authority: www.example.com | :authority: www.example.com | |||
skipping to change at page 39, line 20 | skipping to change at page 41, line 40 | |||
Reference set: | Reference set: | |||
[ 1] :authority: www.example.com | [ 1] :authority: www.example.com | |||
[ 2] :path: / | [ 2] :path: / | |||
[ 3] :scheme: http | [ 3] :scheme: http | |||
[ 4] :method: GET | [ 4] :method: GET | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
1b86 6365 4a13 98ff | ..ceJ... | 5c86 b9b9 9495 56bf | \.....V. | |||
Decoding process: | Decoding process: | |||
1b | == Literal indexed == | 5c | == Literal indexed == | |||
| Indexed name (idx = 27) | | Indexed name (idx = 28) | |||
| cache-control | | cache-control | |||
86 | Literal value (len = 8) | 86 | Literal value (len = 8) | |||
| Huffman encoded: | | Huffman encoded: | |||
6365 4a13 98ff | ceJ... | b9b9 9495 56bf | ....V. | |||
| Decoded: | | Decoded: | |||
| no-cache | | no-cache | |||
| -> cache-control: no-cache | | -> cache-control: no-cache | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 53) cache-control: no-cache | [ 1] (s = 53) cache-control: no-cache | |||
[ 2] (s = 57) :authority: www.example.com | [ 2] (s = 57) :authority: www.example.com | |||
[ 3] (s = 38) :path: / | [ 3] (s = 38) :path: / | |||
[ 4] (s = 43) :scheme: http | [ 4] (s = 43) :scheme: http | |||
skipping to change at page 40, line 11 | skipping to change at page 42, line 32 | |||
Table size: 233 | Table size: 233 | |||
Decoded header set: | Decoded header set: | |||
cache-control: no-cache | cache-control: no-cache | |||
:authority: www.example.com | :authority: www.example.com | |||
:path: / | :path: / | |||
:scheme: http | :scheme: http | |||
:method: GET | :method: GET | |||
D.3.3. Third request | D.4.3. Third request | |||
This request has not enough headers in common with the previous | This request has not enough headers in common with the previous | |||
request to take advantage of the differential encoding. Therefore, | request to take advantage of the differential encoding. Therefore, | |||
the reference set is emptied before encoding the header fields. | the reference set is emptied before encoding the header fields. | |||
Header set to encode: | Header set to encode: | |||
:method: GET | :method: GET | |||
:scheme: https | :scheme: https | |||
:path: /index.html | :path: /index.html | |||
skipping to change at page 40, line 35 | skipping to change at page 43, line 13 | |||
Reference set: | Reference set: | |||
[ 1] cache-control: no-cache | [ 1] cache-control: no-cache | |||
[ 2] :authority: www.example.com | [ 2] :authority: www.example.com | |||
[ 3] :path: / | [ 3] :path: / | |||
[ 4] :scheme: http | [ 4] :scheme: http | |||
[ 5] :method: GET | [ 5] :method: GET | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8080 858c 8b84 0088 4eb0 8b74 9790 fa7f | ........N..t.... | 3085 8c8b 8440 8857 1c5c db73 7b2f af89 | 0....@.W.\.s{/.. | |||
894e b08b 7497 9a17 a8ff | .N..t..... | 571c 5cdb 7372 4d9c 57 | W.\.srM.W | |||
Decoding process: | Decoding process: | |||
80 80 | == Empty reference set == | 30 | == Empty reference set == | |||
| idx = 0 | | idx = 0 | |||
| flag = 1 | | flag = 1 | |||
85 | == Indexed - Add == | 85 | == Indexed - Add == | |||
| idx = 5 | | idx = 5 | |||
| -> :method: GET | | -> :method: GET | |||
8c | == Indexed - Add == | 8c | == Indexed - Add == | |||
| idx = 12 | | idx = 12 | |||
| -> :scheme: https | | -> :scheme: https | |||
8b | == Indexed - Add == | 8b | == Indexed - Add == | |||
| idx = 11 | | idx = 11 | |||
| -> :path: /index.html | | -> :path: /index.html | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> :authority: www.example\ | | -> :authority: www.example\ | |||
| .com | | .com | |||
00 | == Literal indexed == | 40 | == Literal indexed == | |||
88 | Literal name (len = 10) | 88 | Literal name (len = 10) | |||
| Huffman encoded: | | Huffman encoded: | |||
4eb0 8b74 9790 fa7f | N..t.... | 571c 5cdb 737b 2faf | W.\.s{/. | |||
| Decoded: | | Decoded: | |||
| custom-key | | custom-key | |||
89 | Literal value (len = 12) | 89 | Literal value (len = 12) | |||
| Huffman encoded: | | Huffman encoded: | |||
4eb0 8b74 979a 17a8 ff | N..t..... | 571c 5cdb 7372 4d9c 57 | W.\.srM.W | |||
| Decoded: | | Decoded: | |||
| custom-value | | custom-value | |||
| -> custom-key: custom-valu\ | | -> custom-key: custom-valu\ | |||
| e | | e | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 54) custom-key: custom-value | [ 1] (s = 54) custom-key: custom-value | |||
[ 2] (s = 48) :path: /index.html | [ 2] (s = 48) :path: /index.html | |||
[ 3] (s = 44) :scheme: https | [ 3] (s = 44) :scheme: https | |||
skipping to change at page 42, line 11 | skipping to change at page 44, line 23 | |||
Table size: 379 | Table size: 379 | |||
Decoded header set: | Decoded header set: | |||
:method: GET | :method: GET | |||
:scheme: https | :scheme: https | |||
:path: /index.html | :path: /index.html | |||
:authority: www.example.com | :authority: www.example.com | |||
custom-key: custom-value | custom-key: custom-value | |||
D.4. Response Examples without Huffman | D.5. Response Examples without Huffman | |||
This section shows several consecutive header sets, corresponding to | This section shows several consecutive header sets, corresponding to | |||
HTTP responses, on the same connection. SETTINGS_HEADER_TABLE_SIZE | HTTP responses, on the same connection. SETTINGS_HEADER_TABLE_SIZE | |||
is set to the value of 256 octets, causing some evictions to occur. | is set to the value of 256 octets, causing some evictions to occur. | |||
D.4.1. First response | D.5.1. First response | |||
Header set to encode: | Header set to encode: | |||
:status: 302 | :status: 302 | |||
cache-control: private | cache-control: private | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
location: https://www.example.com | location: https://www.example.com | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
0803 3330 3218 0770 7269 7661 7465 221d | ..302..private". | 4803 3330 3259 0770 7269 7661 7465 631d | H.302Y.privatec. | |||
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | 4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | |||
2032 303a 3133 3a32 3120 474d 5430 1768 | 20:13:21 GMT0.h | 2032 303a 3133 3a32 3120 474d 5471 1768 | 20:13:21 GMTq.h | |||
7474 7073 3a2f 2f77 7777 2e65 7861 6d70 | ttps://www.examp | 7474 7073 3a2f 2f77 7777 2e65 7861 6d70 | ttps://www.examp | |||
6c65 2e63 6f6d | le.com | 6c65 2e63 6f6d | le.com | |||
Decoding process: | Decoding process: | |||
08 | == Literal indexed == | 48 | == Literal indexed == | |||
| Indexed name (idx = 8) | | Indexed name (idx = 8) | |||
| :status | | :status | |||
03 | Literal value (len = 3) | 03 | Literal value (len = 3) | |||
3330 32 | 302 | 3330 32 | 302 | |||
| -> :status: 302 | | -> :status: 302 | |||
18 | == Literal indexed == | 59 | == Literal indexed == | |||
| Indexed name (idx = 24) | | Indexed name (idx = 25) | |||
| cache-control | | cache-control | |||
07 | Literal value (len = 7) | 07 | Literal value (len = 7) | |||
7072 6976 6174 65 | private | 7072 6976 6174 65 | private | |||
| -> cache-control: private | | -> cache-control: private | |||
22 | == Literal indexed == | 63 | == Literal indexed == | |||
| Indexed name (idx = 34) | | Indexed name (idx = 35) | |||
| date | | date | |||
1d | Literal value (len = 29) | 1d | Literal value (len = 29) | |||
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | 4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | |||
2032 303a 3133 3a32 3120 474d 54 | 20:13:21 GMT | 2032 303a 3133 3a32 3120 474d 54 | 20:13:21 GMT | |||
| -> date: Mon, 21 Oct 2013 \ | | -> date: Mon, 21 Oct 2013 \ | |||
| 20:13:21 GMT | | 20:13:21 GMT | |||
30 | == Literal indexed == | 71 | == Literal indexed == | |||
| Indexed name (idx = 48) | | Indexed name (idx = 49) | |||
| location | | location | |||
17 | Literal value (len = 23) | 17 | Literal value (len = 23) | |||
6874 7470 733a 2f2f 7777 772e 6578 616d | https://www.exam | 6874 7470 733a 2f2f 7777 772e 6578 616d | https://www.exam | |||
706c 652e 636f 6d | ple.com | 706c 652e 636f 6d | ple.com | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 63) location: https://www.example.com | [ 1] (s = 63) location: https://www.example.com | |||
skipping to change at page 44, line 5 | skipping to change at page 46, line 5 | |||
[ 4] (s = 42) :status: 302 | [ 4] (s = 42) :status: 302 | |||
Table size: 222 | Table size: 222 | |||
Decoded header set: | Decoded header set: | |||
:status: 302 | :status: 302 | |||
cache-control: private | cache-control: private | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
location: https://www.example.com | location: https://www.example.com | |||
D.4.2. Second response | D.5.2. Second response | |||
The (":status", "302") header field is evicted from the header table | The (":status", "302") header field is evicted from the header table | |||
to free space to allow adding the (":status", "200") header field, | to free space to allow adding the (":status", "200") header field, | |||
copied from the static table into the header table. The (":status", | copied from the static table into the header table. The (":status", | |||
"302") header field doesn't need to be removed from the reference set | "302") header field doesn't need to be removed from the reference set | |||
as it is evicted from the header table. | as it is evicted from the header table. | |||
Header set to encode: | Header set to encode: | |||
:status: 200 | :status: 200 | |||
skipping to change at page 45, line 10 | skipping to change at page 47, line 10 | |||
[ 4] (s = 52) cache-control: private | [ 4] (s = 52) cache-control: private | |||
Table size: 222 | Table size: 222 | |||
Decoded header set: | Decoded header set: | |||
:status: 200 | :status: 200 | |||
location: https://www.example.com | location: https://www.example.com | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
cache-control: private | cache-control: private | |||
D.4.3. Third response | D.5.3. Third response | |||
Several header fields are evicted from the header table during the | Several header fields are evicted from the header table during the | |||
processing of this header set. Before evicting a header belonging to | processing of this header set. Before evicting a header belonging to | |||
the reference set, it is emitted, by coding it twice as an Indexed | the reference set, it is emitted, by coding it twice as an Indexed | |||
Representation. The first representation removes the header field | Representation. The first representation removes the header field | |||
from the reference set, the second one adds it again to the reference | from the reference set, the second one adds it again to the reference | |||
set, also emitting it. | set, also emitting it. | |||
Header set to encode: | Header set to encode: | |||
skipping to change at page 45, line 37 | skipping to change at page 47, line 37 | |||
Reference set: | Reference set: | |||
[ 1] :status: 200 | [ 1] :status: 200 | |||
[ 2] location: https://www.example.com | [ 2] location: https://www.example.com | |||
[ 3] date: Mon, 21 Oct 2013 20:13:21 GMT | [ 3] date: Mon, 21 Oct 2013 20:13:21 GMT | |||
[ 4] cache-control: private | [ 4] cache-control: private | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8484 031d 4d6f 6e2c 2032 3120 4f63 7420 | ....Mon, 21 Oct | 8484 431d 4d6f 6e2c 2032 3120 4f63 7420 | ..C.Mon, 21 Oct | |||
3230 3133 2032 303a 3133 3a32 3220 474d | 2013 20:13:22 GM | 3230 3133 2032 303a 3133 3a32 3220 474d | 2013 20:13:22 GM | |||
541d 0467 7a69 7084 8483 833a 3866 6f6f | T..gzip....:8foo | 545e 0467 7a69 7084 8483 837b 3866 6f6f | T^.gzip....{8foo | |||
3d41 5344 4a4b 4851 4b42 5a58 4f51 5745 | =ASDJKHQKBZXOQWE | 3d41 5344 4a4b 4851 4b42 5a58 4f51 5745 | =ASDJKHQKBZXOQWE | |||
4f50 4955 4158 5157 454f 4955 3b20 6d61 | OPIUAXQWEOIU; ma | 4f50 4955 4158 5157 454f 4955 3b20 6d61 | OPIUAXQWEOIU; ma | |||
782d 6167 653d 3336 3030 3b20 7665 7273 | x-age=3600; vers | 782d 6167 653d 3336 3030 3b20 7665 7273 | x-age=3600; vers | |||
696f 6e3d 31 | ion=1 | 696f 6e3d 31 | ion=1 | |||
Decoding process: | Decoding process: | |||
84 | == Indexed - Remove == | 84 | == Indexed - Remove == | |||
| idx = 4 | | idx = 4 | |||
| -> cache-control: private | | -> cache-control: private | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> cache-control: private | | -> cache-control: private | |||
03 | == Literal indexed == | 43 | == Literal indexed == | |||
| Indexed name (idx = 3) | | Indexed name (idx = 3) | |||
| date | | date | |||
1d | Literal value (len = 29) | 1d | Literal value (len = 29) | |||
4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | 4d6f 6e2c 2032 3120 4f63 7420 3230 3133 | Mon, 21 Oct 2013 | |||
2032 303a 3133 3a32 3220 474d 54 | 20:13:22 GMT | 2032 303a 3133 3a32 3220 474d 54 | 20:13:22 GMT | |||
| - evict: cache-control: pr\ | | - evict: cache-control: pr\ | |||
| ivate | | ivate | |||
| -> date: Mon, 21 Oct 2013 \ | | -> date: Mon, 21 Oct 2013 \ | |||
| 20:13:22 GMT | | 20:13:22 GMT | |||
1d | == Literal indexed == | 5e | == Literal indexed == | |||
| Indexed name (idx = 29) | | Indexed name (idx = 30) | |||
| content-encoding | | content-encoding | |||
04 | Literal value (len = 4) | 04 | Literal value (len = 4) | |||
677a 6970 | gzip | 677a 6970 | gzip | |||
| - evict: date: Mon, 21 Oct\ | | - evict: date: Mon, 21 Oct\ | |||
| 2013 20:13:21 GMT | | 2013 20:13:21 GMT | |||
| -> content-encoding: gzip | | -> content-encoding: gzip | |||
84 | == Indexed - Remove == | 84 | == Indexed - Remove == | |||
| idx = 4 | | idx = 4 | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
83 | == Indexed - Remove == | 83 | == Indexed - Remove == | |||
| idx = 3 | | idx = 3 | |||
| -> :status: 200 | | -> :status: 200 | |||
83 | == Indexed - Add == | 83 | == Indexed - Add == | |||
| idx = 3 | | idx = 3 | |||
| -> :status: 200 | | -> :status: 200 | |||
3a | == Literal indexed == | 7b | == Literal indexed == | |||
| Indexed name (idx = 58) | | Indexed name (idx = 59) | |||
| set-cookie | | set-cookie | |||
38 | Literal value (len = 56) | 38 | Literal value (len = 56) | |||
666f 6f3d 4153 444a 4b48 514b 425a 584f | foo=ASDJKHQKBZXO | 666f 6f3d 4153 444a 4b48 514b 425a 584f | foo=ASDJKHQKBZXO | |||
5157 454f 5049 5541 5851 5745 4f49 553b | QWEOPIUAXQWEOIU; | 5157 454f 5049 5541 5851 5745 4f49 553b | QWEOPIUAXQWEOIU; | |||
206d 6178 2d61 6765 3d33 3630 303b 2076 | max-age=3600; v | 206d 6178 2d61 6765 3d33 3630 303b 2076 | max-age=3600; v | |||
6572 7369 6f6e 3d31 | ersion=1 | 6572 7369 6f6e 3d31 | ersion=1 | |||
| - evict: location: https:/\ | | - evict: location: https:/\ | |||
| /www.example.com | | /www.example.com | |||
| - evict: :status: 200 | | - evict: :status: 200 | |||
| -> set-cookie: foo=ASDJKHQ\ | | -> set-cookie: foo=ASDJKHQ\ | |||
skipping to change at page 47, line 24 | skipping to change at page 49, line 24 | |||
Decoded header set: | Decoded header set: | |||
cache-control: private | cache-control: private | |||
date: Mon, 21 Oct 2013 20:13:22 GMT | date: Mon, 21 Oct 2013 20:13:22 GMT | |||
content-encoding: gzip | content-encoding: gzip | |||
location: https://www.example.com | location: https://www.example.com | |||
:status: 200 | :status: 200 | |||
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1 | set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1 | |||
D.5. Response Examples with Huffman | D.6. Response Examples with Huffman | |||
This section shows the same examples as the previous section, but | This section shows the same examples as the previous section, but | |||
using Huffman encoding for the literal values. The eviction | using Huffman encoding for the literal values. The eviction | |||
mechanism uses the length of the decoded literal values, so the same | mechanism uses the length of the decoded literal values, so the same | |||
evictions occurs as in the previous section. | evictions occurs as in the previous section. | |||
D.5.1. First response | D.6.1. First response | |||
Header set to encode: | Header set to encode: | |||
:status: 302 | :status: 302 | |||
cache-control: private | cache-control: private | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
location: https://www.example.com | location: https://www.example.com | |||
Reference set: empty. | Reference set: empty. | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
0882 98a7 1885 73d5 cd11 1f22 98ef 6b3a | ......s...."..k: | 4882 4017 5985 bf06 724b 9763 93d6 dbb2 | H.@.Y...rK.c.... | |||
7a0e 6e8f a263 d072 9a6e 8397 d869 bd87 | z.n..c.r.n...i.. | 9884 de2a 7188 0506 2098 5131 09b5 6ba3 | ...*q... .Q1..k. | |||
3747 bbbf c730 90ce 3174 3d80 1b6d b107 | 7G...0..1t=..m.. | 7191 adce bf19 8e7e 7cf9 bebe 89b6 fb16 | q.......|....... | |||
cd1a 3962 44b7 4f | ..9bD.O | fa9b 6f | ..o | |||
Decoding process: | Decoding process: | |||
08 | == Literal indexed == | 48 | == Literal indexed == | |||
| Indexed name (idx = 8) | | Indexed name (idx = 8) | |||
| :status | | :status | |||
82 | Literal value (len = 3) | 82 | Literal value (len = 3) | |||
| Huffman encoded: | | Huffman encoded: | |||
98a7 | .. | 4017 | @. | |||
| Decoded: | | Decoded: | |||
| 302 | | 302 | |||
| -> :status: 302 | | -> :status: 302 | |||
18 | == Literal indexed == | 59 | == Literal indexed == | |||
| Indexed name (idx = 24) | | Indexed name (idx = 25) | |||
| cache-control | | cache-control | |||
85 | Literal value (len = 7) | 85 | Literal value (len = 7) | |||
| Huffman encoded: | | Huffman encoded: | |||
73d5 cd11 1f | s.... | bf06 724b 97 | ..rK. | |||
| Decoded: | | Decoded: | |||
| private | | private | |||
| -> cache-control: private | | -> cache-control: private | |||
22 | == Literal indexed == | 63 | == Literal indexed == | |||
| Indexed name (idx = 34) | | Indexed name (idx = 35) | |||
| date | | date | |||
98 | Literal value (len = 29) | 93 | Literal value (len = 29) | |||
| Huffman encoded: | | Huffman encoded: | |||
ef6b 3a7a 0e6e 8fa2 63d0 729a 6e83 97d8 | .k:z.n..c.r.n... | d6db b298 84de 2a71 8805 0620 9851 3109 | ......*q... .Q1. | |||
69bd 8737 47bb bfc7 | i..7G... | b56b a3 | .k. | |||
| Decoded: | | Decoded: | |||
| Mon, 21 Oct 2013 20:13:21 \ | | Mon, 21 Oct 2013 20:13:21 \ | |||
| GMT | | GMT | |||
| -> date: Mon, 21 Oct 2013 \ | | -> date: Mon, 21 Oct 2013 \ | |||
| 20:13:21 GMT | | 20:13:21 GMT | |||
30 | == Literal indexed == | 71 | == Literal indexed == | |||
| Indexed name (idx = 48) | | Indexed name (idx = 49) | |||
| location | | location | |||
90 | Literal value (len = 23) | 91 | Literal value (len = 23) | |||
| Huffman encoded: | | Huffman encoded: | |||
ce31 743d 801b 6db1 07cd 1a39 6244 b74f | .1t=..m....9bD.O | adce bf19 8e7e 7cf9 bebe 89b6 fb16 fa9b | ......|......... | |||
6f | o | ||||
| Decoded: | | Decoded: | |||
| https://www.example.com | | https://www.example.com | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
Header Table (after decoding): | Header Table (after decoding): | |||
[ 1] (s = 63) location: https://www.example.com | [ 1] (s = 63) location: https://www.example.com | |||
[ 2] (s = 65) date: Mon, 21 Oct 2013 20:13:21 GMT | [ 2] (s = 65) date: Mon, 21 Oct 2013 20:13:21 GMT | |||
[ 3] (s = 52) cache-control: private | [ 3] (s = 52) cache-control: private | |||
[ 4] (s = 42) :status: 302 | [ 4] (s = 42) :status: 302 | |||
Table size: 222 | Table size: 222 | |||
Decoded header set: | Decoded header set: | |||
:status: 302 | :status: 302 | |||
cache-control: private | cache-control: private | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
location: https://www.example.com | location: https://www.example.com | |||
D.5.2. Second response | D.6.2. Second response | |||
The (":status", "302") header field is evicted from the header table | The (":status", "302") header field is evicted from the header table | |||
to free space to allow adding the (":status", "200") header field, | to free space to allow adding the (":status", "200") header field, | |||
copied from the static table into the header table. The (":status", | copied from the static table into the header table. The (":status", | |||
"302") header field doesn't need to be removed from the reference set | "302") header field doesn't need to be removed from the reference set | |||
as it is evicted from the header table. | as it is evicted from the header table. | |||
Header set to encode: | Header set to encode: | |||
:status: 200 | :status: 200 | |||
skipping to change at page 51, line 25 | skipping to change at page 53, line 25 | |||
[ 4] (s = 52) cache-control: private | [ 4] (s = 52) cache-control: private | |||
Table size: 222 | Table size: 222 | |||
Decoded header set: | Decoded header set: | |||
:status: 200 | :status: 200 | |||
location: https://www.example.com | location: https://www.example.com | |||
date: Mon, 21 Oct 2013 20:13:21 GMT | date: Mon, 21 Oct 2013 20:13:21 GMT | |||
cache-control: private | cache-control: private | |||
D.5.3. Third response | D.6.3. Third response | |||
Several header fields are evicted from the header table during the | Several header fields are evicted from the header table during the | |||
processing of this header set. Before evicting a header belonging to | processing of this header set. Before evicting a header belonging to | |||
the reference set, it is emitted, by coding it twice as an Indexed | the reference set, it is emitted, by coding it twice as an Indexed | |||
Representation. The first representation removes the header field | Representation. The first representation removes the header field | |||
from the reference set, the second one adds it again to the reference | from the reference set, the second one adds it again to the reference | |||
set, also emitting it. | set, also emitting it. | |||
Header set to encode: | Header set to encode: | |||
skipping to change at page 52, line 13 | skipping to change at page 54, line 13 | |||
set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1 | set-cookie: foo=ASDJKHQKBZXOQWEOPIUAXQWEOIU; max-age=3600; version=1 | |||
Reference set: | Reference set: | |||
[ 1] :status: 200 | [ 1] :status: 200 | |||
[ 2] location: https://www.example.com | [ 2] location: https://www.example.com | |||
[ 3] date: Mon, 21 Oct 2013 20:13:21 GMT | [ 3] date: Mon, 21 Oct 2013 20:13:21 GMT | |||
[ 4] cache-control: private | [ 4] cache-control: private | |||
Hex dump of encoded data: | Hex dump of encoded data: | |||
8484 0398 ef6b 3a7a 0e6e 8fa2 63d0 729a | .....k:z.n..c.r. | 8484 4393 d6db b298 84de 2a71 8805 0620 | ..C.......*q... | |||
6e83 97d8 69bd 873f 47bb bfc7 1d83 cbd5 | n...i..?G....... | 9851 3111 b56b a35e 84ab dd97 ff84 8483 | .Q1..k.^........ | |||
4e84 8483 833a b3c5 adb7 7f87 6fc7 fbf7 | N....:......o... | 837b b1e0 d6cf 9f6e 8f9f d3e5 f6fa 76fe | .{.....n......v. | |||
fdbf bebf f3f7 f4fb 7ebb be9f 5f87 e37f | ............_... | fd3c 7edf 9eff 1f2f 0f3c fe9f 6fcf 7f8f | ......./....o... | |||
efed faee fa7c 3f1d 5d1a 23ce 5464 36cd | .....|?.].#.Td6. | 879f 61ad 4f4c c9a9 73a2 200e c372 5e18 | ..a.OL..s. ..r^. | |||
494b d5d1 cc5f 0535 969b | IK..._.5.. | b1b7 4e3f | ..N? | |||
Decoding process: | Decoding process: | |||
84 | == Indexed - Remove == | 84 | == Indexed - Remove == | |||
| idx = 4 | | idx = 4 | |||
| -> cache-control: private | | -> cache-control: private | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> cache-control: private | | -> cache-control: private | |||
03 | == Literal indexed == | 43 | == Literal indexed == | |||
| Indexed name (idx = 3) | | Indexed name (idx = 3) | |||
| date | | date | |||
98 | Literal value (len = 29) | 93 | Literal value (len = 29) | |||
| Huffman encoded: | | Huffman encoded: | |||
ef6b 3a7a 0e6e 8fa2 63d0 729a 6e83 97d8 | .k:z.n..c.r.n... | d6db b298 84de 2a71 8805 0620 9851 3111 | ......*q... .Q1. | |||
69bd 873f 47bb bfc7 | i..?G... | b56b a3 | .k. | |||
| Decoded: | | Decoded: | |||
| Mon, 21 Oct 2013 20:13:22 \ | | Mon, 21 Oct 2013 20:13:22 \ | |||
| GMT | | GMT | |||
| - evict: cache-control: pr\ | | - evict: cache-control: pr\ | |||
| ivate | | ivate | |||
| -> date: Mon, 21 Oct 2013 \ | | -> date: Mon, 21 Oct 2013 \ | |||
| 20:13:22 GMT | | 20:13:22 GMT | |||
1d | == Literal indexed == | 5e | == Literal indexed == | |||
| Indexed name (idx = 29) | | Indexed name (idx = 30) | |||
| content-encoding | | content-encoding | |||
83 | Literal value (len = 4) | 84 | Literal value (len = 4) | |||
| Huffman encoded: | | Huffman encoded: | |||
cbd5 4e | ..N | abdd 97ff | .... | |||
| Decoded: | | Decoded: | |||
| gzip | | gzip | |||
| - evict: date: Mon, 21 Oct\ | | - evict: date: Mon, 21 Oct\ | |||
| 2013 20:13:21 GMT | | 2013 20:13:21 GMT | |||
| -> content-encoding: gzip | | -> content-encoding: gzip | |||
84 | == Indexed - Remove == | 84 | == Indexed - Remove == | |||
| idx = 4 | | idx = 4 | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
84 | == Indexed - Add == | 84 | == Indexed - Add == | |||
| idx = 4 | | idx = 4 | |||
| -> location: https://www.e\ | | -> location: https://www.e\ | |||
| xample.com | | xample.com | |||
83 | == Indexed - Remove == | 83 | == Indexed - Remove == | |||
| idx = 3 | | idx = 3 | |||
| -> :status: 200 | | -> :status: 200 | |||
83 | == Indexed - Add == | 83 | == Indexed - Add == | |||
| idx = 3 | | idx = 3 | |||
| -> :status: 200 | | -> :status: 200 | |||
3a | == Literal indexed == | 7b | == Literal indexed == | |||
| Indexed name (idx = 58) | | Indexed name (idx = 59) | |||
| set-cookie | | set-cookie | |||
b3 | Literal value (len = 56) | b1 | Literal value (len = 56) | |||
| Huffman encoded: | | Huffman encoded: | |||
c5ad b77f 876f c7fb f7fd bfbe bff3 f7f4 | .....o.......... | e0d6 cf9f 6e8f 9fd3 e5f6 fa76 fefd 3c7e | ....n......v.... | |||
fb7e bbbe 9f5f 87e3 7fef edfa eefa 7c3f | ....._........|? | df9e ff1f 2f0f 3cfe 9f6f cf7f 8f87 9f61 | ..../....o.....a | |||
1d5d 1a23 ce54 6436 cd49 4bd5 d1cc 5f05 | .].#.Td6.IK..._. | ad4f 4cc9 a973 a220 0ec3 725e 18b1 b74e | .OL..s. ..r^...N | |||
3596 9b | 5.. | 3f | ? | |||
| Decoded: | | Decoded: | |||
| foo=ASDJKHQKBZXOQWEOPIUAXQ\ | | foo=ASDJKHQKBZXOQWEOPIUAXQ\ | |||
| WEOIU; max-age=3600; versi\ | | WEOIU; max-age=3600; versi\ | |||
| on=1 | | on=1 | |||
| - evict: location: https:/\ | | - evict: location: https:/\ | |||
| /www.example.com | | /www.example.com | |||
| - evict: :status: 200 | | - evict: :status: 200 | |||
| -> set-cookie: foo=ASDJKHQ\ | | -> set-cookie: foo=ASDJKHQ\ | |||
| KBZXOQWEOPIUAXQWEOIU; ma\ | | KBZXOQWEOPIUAXQWEOIU; ma\ | |||
| x-age=3600; version=1 | | x-age=3600; version=1 | |||
End of changes. 153 change blocks. | ||||
705 lines changed or deleted | 827 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |