idnits 2.17.1 draft-snell-httpbis-bohe-04.txt: Checking boilerplate required by RFC 5378 and the IETF Trust (see https://trustee.ietf.org/license-info): ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/1id-guidelines.txt: ---------------------------------------------------------------------------- No issues found here. Checking nits according to https://www.ietf.org/id-info/checklist : ---------------------------------------------------------------------------- ** The document seems to lack an Introduction section. ** The document seems to lack an IANA Considerations section. (See Section 2.2 of https://www.ietf.org/id-info/checklist for how to handle the case when there are no actions for IANA.) Miscellaneous warnings: ---------------------------------------------------------------------------- == The copyright year in the IETF Trust and authors Copyright Line does not match the current year == Line 181 has weird spacing: '... bit coun...' == Line 183 has weird spacing: '... bit coun...' == The document seems to lack the recommended RFC 2119 boilerplate, even if it appears to use RFC 2119 keywords. (The document does seem to have the reference to RFC 2119 which the ID-Checklist requires). -- The document date (April 20, 2013) is 4022 days in the past. Is this intentional? Checking references for intended status: Informational ---------------------------------------------------------------------------- -- Looks like a reference, but probably isn't: '25' on line 720 -- Looks like a reference, but probably isn't: '24' on line 811 -- Looks like a reference, but probably isn't: '12' on line 845 -- Looks like a reference, but probably isn't: '14' on line 813 -- Looks like a reference, but probably isn't: '15' on line 758 -- Looks like a reference, but probably isn't: '6' on line 846 -- Looks like a reference, but probably isn't: '7' on line 817 -- Looks like a reference, but probably isn't: '10' on line 809 -- Looks like a reference, but probably isn't: '5' on line 835 -- Looks like a reference, but probably isn't: '18' on line 779 -- Looks like a reference, but probably isn't: '17' on line 844 -- Looks like a reference, but probably isn't: '9' on line 841 -- Looks like a reference, but probably isn't: '13' on line 783 -- Looks like a reference, but probably isn't: '8' on line 897 -- Looks like a reference, but probably isn't: '11' on line 794 -- Looks like a reference, but probably isn't: '19' on line 815 -- Looks like a reference, but probably isn't: '4' on line 820 == Unused Reference: 'RFC2119' is defined on line 530, but no explicit reference was found in the text Summary: 2 errors (**), 0 flaws (~~), 5 warnings (==), 18 comments (--). Run idnits with the --verbose option for more detailed information about the items above. -------------------------------------------------------------------------------- 2 Network Working Group J.M. Snell 3 Internet-Draft April 20, 2013 4 Intended status: Informational 5 Expires: October 22, 2013 7 HTTP/2.0 Discussion: Stored Header Encoding 8 draft-snell-httpbis-bohe-04 10 Abstract 12 This memo describes a proposed alternative encoding for headers that 13 combines the best concepts from the proposed Delta and HeaderDiff 14 options with the typed value codecs introduced by previous versions 15 of this draft. 17 Status of This Memo 19 This Internet-Draft is submitted to IETF in full conformance with the 20 provisions of BCP 78 and BCP 79. 22 Internet-Drafts are working documents of the Internet Engineering 23 Task Force (IETF). Note that other groups may also distribute 24 working documents as Internet-Drafts. The list of current Internet- 25 Drafts is at http://datatracker.ietf.org/drafts/current/. 27 Internet-Drafts are draft documents valid for a maximum of six months 28 and may be updated, replaced, or obsoleted by other documents at any 29 time. It is inappropriate to use Internet-Drafts as reference 30 material or to cite them other than as "work in progress." 32 This Internet-Draft will expire on October 22, 2013. 34 Copyright Notice 36 Copyright (c) 2013 IETF Trust and the persons identified as the 37 document authors. All rights reserved. 39 This document is subject to BCP 78 and the IETF Trust's Legal 40 Provisions Relating to IETF Documents 41 (http://trustee.ietf.org/license-info) in effect on the date of 42 publication of this document. Please review these documents 43 carefully, as they describe your rights and restrictions with respect 44 to this document. 46 Table of Contents 48 1. Stored Header Encoding . . . . . . . . . . . . . . . . . . . 2 49 2. State Model . . . . . . . . . . . . . . . . . . . . . . . . . 2 50 3. Header Serialization . . . . . . . . . . . . . . . . . . . . 3 51 3.1. Header Group Prefix . . . . . . . . . . . . . . . . . . . 6 52 3.2. Index Header Group . . . . . . . . . . . . . . . . . . . 6 53 3.3. Index Range Header Group . . . . . . . . . . . . . . . . 7 54 3.4. Cloned Index Header Group . . . . . . . . . . . . . . . . 7 55 3.5. Literal Header Group . . . . . . . . . . . . . . . . . . 8 56 4. Header Values . . . . . . . . . . . . . . . . . . . . . . . . 9 57 4.1. UTF-8 Text Values . . . . . . . . . . . . . . . . . . . . 10 58 4.2. Numeric Values . . . . . . . . . . . . . . . . . . . . . 10 59 4.3. Timestamp Values . . . . . . . . . . . . . . . . . . . . 10 60 4.4. Raw Binary Octet Values . . . . . . . . . . . . . . . . . 10 61 4.5. Unsigned Variable Length Integer Syntax . . . . . . . . . 10 62 4.6. Huffman Coding . . . . . . . . . . . . . . . . . . . . . 11 63 5. Security Considerations . . . . . . . . . . . . . . . . . . . 12 64 6. Normative References . . . . . . . . . . . . . . . . . . . . 12 65 Appendix A. Huffman Tables . . . . . . . . . . . . . . . . . . . 12 66 Appendix B. Static Storage Cache . . . . . . . . . . . . . . . . 20 67 Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 23 69 1. Stored Header Encoding 71 The Stored Header Encoding is an alternative "binary header encoding" 72 for HTTP/2.0 that combines the best elements from three other 73 proposed encodings, including: 75 o The "Header Delta Compression" scheme proposed by Roberto Peon in 76 http://tools.ietf.org/html/draft-rpeon-httpbis-header- 77 compression-03 79 o The "Header Diff" encoding proposed by Herve Reullan, Jun 80 Fujisawa, Romain Bellessort, and Youenn Fablet in http:// 81 tools.ietf.org/html/draft-ruellan-headerdiff-00 83 o The "Binary Optimized Header Encoding" proposed by James Snell 84 (me) in http://tools.ietf.org/html/draft-snell-httpbis-bohe-03 86 The Stored Header Encoding seeks to find an elegant, efficient and 87 simple marriage of the best concepts from each of these separate 88 proposals. 90 2. State Model 92 The compressor and decompressor each maintain a cache of header value 93 pairs. There is a static cache, prepopulated by the specification, 94 and a dynamic cache, populated through the compression and 95 decompression process. Each cache contains a maximum of 128 96 individual key+value pairs. 98 Each item in the index is referenced by an 8-bit identifier. The 99 most significant bit identifies whether an item from the static or 100 dynamic cache is being referenced. Note: the Nil byte (0x00) is a 101 valid identifier for the dynamic cache. 103 0xxxxxxx -- Dynamic Cache 104 1xxxxxxx -- Static Cache 106 The dynamic cache is managed in a "least recently written" style, 107 that is, as the cache fills to capacity in both number of entries and 108 maximum stored byte size, the least recently written items are 109 dropped and those index positions are reused. 111 Index positions from the dynamic cache are assigned in "encounter 112 order", beginning from 0x00 and increasing monotonically to 0x7F. 113 That is to say, the positions are assigned in precisely the same 114 order that they are serialized, and thereby encountered by the 115 decompressor upon reading and processing the block. 117 Each item in the store consists of a Header Name and a Value. The 118 Name is a lower-case ISO-8859-1 character sequence. The Value is 119 either a UTF-8 string, a number, a Timestamp or an arbitrary sequence 120 of binary octets. 122 The available size of the stored compression state can be capped by 123 the decompressor. Each stored value contributes to the accumulated 124 size of the storage state. As new key+value pairs are assigned 125 positions in the dynamic cache, the least-recently assigned items 126 must be removed if necessary to free up the required space. 128 The size of string values is measured by the number of UTF-8 bytes 129 required for the character sequence. 131 The size of number and timestamp values are measured by the number of 132 unsigned variable length integer (uvarint) encoded bytes it takes to 133 represent the value (see the section of value types below). 135 The size of raw binary values is measured by the number of octets. 137 Header names DO NOT contribute to the stored state size of the 138 compressor; only the size of the value is considered. Duplicate 139 values MUST be counted individually. 141 3. Header Serialization 143 Headers are serialized into four typed header groups, each 144 represented by a two-bit identifier. 146 00 -- Index Header Group 147 01 -- Index Range Header Group 148 10 -- Cloned Index Header Group 149 11 -- Literal Header Group 151 The Cloned Index (10) and Literal (11) header group types have an 152 additional "ephemeral" property that indicates whether or not the 153 group affects the compression state. 155 Each header group contains a single 8-bit prefix and up to 32 156 distinct header instances. 158 Wire Format 160 header-block = *(index-header-group / 161 index-range-header-group / 162 cloned-index-header-group / 163 literal-header-group) 165 ; Header Group Prefix = 8 bits ... 166 ; First two bits = header-group-type 167 ; Third bit = ephemeral flag 168 ; Final five bits = instance counter 169 ; 170 index-header-group-type = 00 171 index-range-group-type = 01 172 cloned-index-group-type = 10 173 literal-group-type = 11 174 count = 5bit 176 index-header-prefix = index-header-group-type 177 unset count ; 000xxxxx 178 index-range-header-prefix = index-header-group-type 179 unset count ; 010xxxxx 180 cloned-index-header-prefix = cloned-index-group-type 181 bit count ; 10?xxxxx 182 literal-header-prefix = literal-group-type 183 bit count ; 11?xxxxx 185 ; Cache Index Identifier = 8 bits ... 186 ; 0xxxxxxx = Dynamic Cache Identifier 187 ; 1xxxxxxx = Static Cache Identifier 188 cache-index = %x00-FF 190 ; Index Header Group 191 index-header-group = index-header-prefix 192 1*32cache-index 194 ; Index-Range Header Group 195 ; Contains a pair of cache-index values, second MUST 196 ; me strictly higher in value than the first... 197 index-range-header-group = index-range-header-prefix 198 1*32(cache-index cache-index) 200 ; Cloned-Index Header Group 201 cloned-index-header-group = cloned-index-header-prefix 202 1*32(cache-index value) 204 ; Literal Header Group 205 literal-header-group = literal-header-prefix 206 1*32(name value) 208 value = text-value / 209 number-value / 210 timestamp-value / 211 binary-value 213 text-value-type = 00 ; two bits 214 number-value-type = 01 215 timestamp-value-type = 10 216 binary-value-type = 11 218 text-value-prefix = text-value-type 219 unset count ; 000xxxxx 220 number-value-prefix = number-value-type 221 unset count ; 010xxxxx 222 timestamp-value-prefix = timestamp-value-type 223 unset count ; 100xxxxx 224 binary-value-prefix = binary-value-type 225 unset count ; 110xxxxx 227 text-value = text-value-prefix *32string 228 number-value = number-value-type *32uvarint 229 timestamp-value = timestamp-value-prefix *32uvarint 230 binary-value = binary-value-prefix uvarint *OCTET 232 uvarint = *uvarint-continuation uvarint-final 233 uvarint-continuation = %x80-FF 234 uvarint-final = %x00-7F 236 name = 1*tchar 237 tchar = "!" / "#" / "$" / "%" / "&" / 238 "'" / "*" / "+" / "-" / "." / 239 "^" / "_" / "`" / "|" / "~" 240 / DIGIT / ALPHA 242 string = uvarint *(HUFFMAN-ENCODED-CHAR) 243 HUFFMAN-EOF 244 padding-to-nearest-byte; 245 padding-to-nearest-byte = *7unset 247 bit = set / unset 248 unset = 0 249 set = 1 251 3.1. Header Group Prefix 253 The Header Group Prefix is a single octet that provides three 254 distinct pieces of information: 256 00 0 00000 258 The first two most significant bits of the header group prefix 259 identify the group type. 261 The next bit is the "ephemeral flag" and is used only for Cloned and 262 Literal group types. This bit indicates whether or not the group 263 alters the stored compression state. 265 The remaining five bits specify the number of header instances in the 266 group, with 00000 indicating that the group contains 1 instance and 267 11111 contains 32. A header group MUST contain at least one 268 instance. 270 The remaining serialization of the header group depends entirely on 271 the group type. 273 3.2. Index Header Group 275 The serialization of the Index Header Group consists of the Header 276 Group Prefix and up to 32 additional octets, each referencing a 277 single 8-bit storage index identifier for items in either the Static 278 or Dynamic Cache. 280 For instance 282 00000000 00000000 = References item #0 from 283 the dynamic cache 285 00000001 00000000 10000000 = References item #0 from the 286 dynamic cache and item #0 287 from the static cache 289 Index Header Groups do not affect the stored compression state. If 290 an Index Header Group references a header index that has not yet been 291 allocated, the deserialization MUST terminate with an error. This 292 likely means that the compression state has become out of sync and 293 needs to be reestablished. 295 3.3. Index Range Header Group 297 The serialization of the Index Range Header Group consists of the 298 Header Group Prefix and up to 32 additional 2-octet (16 bits) pairs 299 of 8-bit storage index identifiers. Each pair specifies a sequential 300 range of adjacent ranges. 302 For instance: 304 01000000 00000000 00000100 = References items #0-#4 from 305 the dynamic cache. 306 (five distinct items total) 308 A range MAY span dynamic and static index values. Index values are 309 treated as unsigned byte values, so indices from the static cache are 310 numerically greater than dynamic cache values.. e.g. 312 01000000 01111111 10000001 = References item #127 from the 313 dynamic cache, and items #0 314 and #1 from the static cache. 316 Index Range Header Groups do not affect the stored compression state. 317 If a range references a header index that has not yet been allocated, 318 the deserialization MUST terminate with an error. This likely means 319 that the compression state has become out of sync and needs to be 320 reestablished. 322 3.4. Cloned Index Header Group 323 The serialization of the Cloned Index Header Group consists of the 324 Header Group Prefix and up to 32 Index+Value pairs. Each Index+Value 325 pair consists of a leading 8-bit storage index of an existing stored 326 header followed by a new serialized value. The serialization of the 327 value depends on the value type (see discussion of Value 328 serialization below). 330 The Cloned Header Group affects the stored compression state if, and 331 only if, the "ephemeral" flag in the Header Group Prefix is NOT set. 332 If the header group is not marked as being ephemeral, then the 333 specified value is stored in the next available storage index using 334 the key name from the referenced storage index. 336 For instance, assume the dynamic cache currently contains an item at 337 index #1 with key name "foo" and value "bar", the following causes a 338 new item to be added to the storage with key name "foo" and value 339 "baz": 341 10000000 00000001 00000000 00000100 342 10111000 01001111 10110101 00100000 344 An explanation of the value syntax is given a bit later. 346 If a Cloned Header Group references a header index that has not yet 347 been allocated, the deserialization MUST terminate with an error. 348 This likely means that the compression state has become out of sync 349 and needs to be reestablished. 351 3.5. Literal Header Group 353 The serialization of the Literal Header Group consists of the Header 354 Group Prefix and up to 32 Name+Value pairs. Each Name+Value pair 355 consists of a length-prefixed sequence of ASCII bytes specifying the 356 Header Name followed by the serialized value. The serialization of 357 the value depends on the value type. The length prefix is encoded as 358 an unsigned variable length integer (uvarint). The length prefix 359 SHOULD NOT be longer than five octets and SHOULD NOT specify a value 360 larger than 0xFFFF. 362 The Literal Heaer Group affects the stored compression state if, and 363 only if, the "ephemeral" flag in the Header Group Prefix is NOT set. 364 If the header group is not marked as being ephemeral, then the 365 specified key name and value is stored in the next available storage 366 index. 368 For instance: 370 11000000 00000011 01100110 01101111 371 01101111 00000000 00000010 10111000 372 01000100 11010010 374 Stores a new header with name "foo" and value "baz" in the dynamic 375 cache. 377 Each Header Group consists of up to 32 distinct Header Instances. If 378 a particular serialization block contains more than 32 intances of a 379 given type, then multiple instances of the Header Group Type can be 380 included in the serialized block. For instance, if a given message 381 contains 33 index references, the serialized block may contain two 382 separate Index Header Groups. While this is allowed, it is expected 383 to be rare. 385 4. Header Values 387 Header Values can be one of four types, each identified by a two-bit 388 identifier. 390 o 00 -- UTF-8 Text 392 o 01 -- Numeric 394 o 10 -- Timetamp 396 o 11 -- Raw Binary Octets 398 An individual value MAY consist of up to 32 distinct discreet "value 399 instances". A value with multiple instances is considered, for all 400 intensive purposes, to be a single value. 402 Each serialized value is preceded by an 8-bit Value Prefix. 404 00 0 00000 406 The first two most significant bits specifies the value type. 408 The third significant bit is a reserved flag. Future iterations of 409 this specification might make use of this bit. 411 The final five least-significant bits specify the number of discreet 412 instances in the value. 00000 indicates that one instance is 413 included, 11111 indicates that 32 instances are included. The value 414 MUST contain at least one instance. 416 The remaining serialization depends entirely on the type. 418 4.1. UTF-8 Text Values 420 UTF-8 Text is encoded as a length-prefixed sequence of Huffman- 421 encoded UTF-8 octets. The length prefix is encoded as an unsigned 422 variable-length integer specifying the number of octets after 423 applying the Huffman-encoding. 425 4.2. Numeric Values 427 Numeric values are encoded as unsigned variable-length integers 428 (uvarint) of up to a maximum of 10-octets. Unsigned values larger 429 than 64-bits (0xFFFFFFFF) MUST NOT be used. Negative values cannot 430 be represented using this syntax. The uvarint syntax is described 431 below. 433 4.3. Timestamp Values 435 Timestamp values are encoded as unsigned variable-length integers 436 specifying the number of seconds that have passed since the standard 437 Epoch. The syntax is identical that used for Numeric Values. Dates 438 prior to the epoch cannot be represented using this syntax. 440 4.4. Raw Binary Octet Values 442 Binary values are encoded as a length prefixed sequence of arbitrary 443 octets. The length prefix is encoded as an unsigned variable length 444 integer. 446 4.5. Unsigned Variable Length Integer Syntax 448 The uvarint syntax is identical to that used by Google's protobufs. 449 They are serialized with the least-significant bytes first in batches 450 of 7-bits, with the most significant bit per byte reserved as a 451 continuation bit. Values less than or equal to 127 are serialized 452 using at most one byte; values less than or equal to 16383 are 453 serialized using at most two bytes; values less than or equal to 454 2097151 are serialized using at most three bytes. 456 def uvarint(num): 457 return [] if num = 0 458 ret = [] 459 while(num != 0): 460 m = num >>> 7 ; unsigned shift left 7 bits 461 ret.push (byte)((num & ~0x80) | ( m > 0 ? 0x80 : 0x00 )); 462 num = m; 463 return ret; 465 For example, the binary representation of the 32-bit integer 217 is: 467 00000000 00000000 00000000 11011001 469 The variable length encoding is: 471 11011001 00000001 473 The binary representation of the 32-bit integer 1386210052 is: 475 01010010 10011111 11100011 00000100 477 The variable length encoding is: 479 10000100 11000110 11111111 10010100 00000101 481 4.6. Huffman Coding 483 All UTF-8 text values are compressed using a modified static huffman 484 code. "Modified" because the encoded version may contain compact- 485 representations of raw, arbitrary UTF-8 bytes that are not covered by 486 the static huffman code table. 488 There are two huffman tables in use, one for HTTP Requests and 489 another for HTTP Responses, each covers UTF-8 codepoints strictly 490 less than 128 as well the fifty possible UTF-8 leading octets. 492 The encoded result MUST end with a specific terminal sequence of bits 493 called the "HUFFMAN_EOF". Currently, the HUFFMAN_EOF is the same for 494 both the Request and Response tables, but that could change if the 495 tables are regenerated. Currently, the HUFFMAN_EOF sequence is 496 101001. 498 Codepoints >= 128 are handled by first taking the leading octet of 499 the UTF-8 representation and serializing it's associated huffman code 500 from the table to the output stream, then, depending on the octets 501 value, serializing the six least significant bits from each of the 502 remaining trailing octets. 504 For instance, the UTF-8 character U+00D4 (LATIN CAPITAL LETTER O WITH 505 CIRCUMFLEX), with UTF-8 representation of C394 (hex) is encoded as: 507 11000100 01010010 10010000 509 The first 8-bits represents the huffman-table prefix, the first six 510 most significant bytes of the second octet are taken directly from 511 the six least significant bits of the second UTF-8 byte (0x94). 512 Following those six bits are the six bits of the HUFFMAN_EOF 101001, 513 followed by four unset padding bits. 515 The number of raw UTF-8 bits to write depends on the value of the 516 leading octet. If the value is between 0xC2 and 0xDF (inclusive), 517 six bits from the second continuation byte is encoded. If the value 518 is between 0xE0 and 0xEF (inclusive), six bits from the second and 519 third continuation bytes are encoded. If the value is between 0xF0 520 and 0xF4 (inclusive), six bits from the second, third and fourth 521 continuation bytes are encoded. UTF-8 codepoints that require 522 greater than four bytes to encode cannot be represented. 524 5. Security Considerations 526 TBD 528 6. Normative References 530 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate 531 Requirement Levels", BCP 14, RFC 2119, March 1997. 533 Appendix A. Huffman Tables 535 Request Table 537 ( 0) |11111111|11111111|11111111|0 [25] 1fffffe [25] 538 ( 1) |11111111|11111111|11111111|1 [25] 1ffffff [25] 539 ( 2) |11111111|11111111|11100000 [24] ffffe0 [24] 540 ( 3) |11111111|11111111|11100001 [24] ffffe1 [24] 541 ( 4) |11111111|11111111|11100010 [24] ffffe2 [24] 542 ( 5) |11111111|11111111|11100011 [24] ffffe3 [24] 543 ( 6) |11111111|11111111|11100100 [24] ffffe4 [24] 544 ( 7) |11111111|11111111|11100101 [24] ffffe5 [24] 545 ( 8) |11111111|11111111|11100110 [24] ffffe6 [24] 546 ( 9) |11111111|11111111|11100111 [24] ffffe7 [24] 547 ( 10) |11111111|11111111|11101000 [24] ffffe8 [24] 548 ( 11) |11111111|11111111|11101001 [24] ffffe9 [24] 549 ( 12) |11111111|11111111|11101010 [24] ffffea [24] 550 ( 13) |11111111|11111111|11101011 [24] ffffeb [24] 551 ( 14) |11111111|11111111|11101100 [24] ffffec [24] 552 ( 15) |11111111|11111111|11101101 [24] ffffed [24] 553 ( 16) |11111111|11111111|11101110 [24] ffffee [24] 554 ( 17) |11111111|11111111|11101111 [24] ffffef [24] 555 ( 18) |11111111|11111111|11110000 [24] fffff0 [24] 556 ( 19) |11111111|11111111|11110001 [24] fffff1 [24] 557 ( 20) |11111111|11111111|11110010 [24] fffff2 [24] 558 ( 21) |11111111|11111111|11110011 [24] fffff3 [24] 559 ( 22) |11111111|11111111|11110100 [24] fffff4 [24] 560 ( 23) |11111111|11111111|11110101 [24] fffff5 [24] 561 ( 24) |11111111|11111111|11110110 [24] fffff6 [24] 562 ( 25) |11111111|11111111|11110111 [24] fffff7 [24] 563 ( 26) |11111111|11111111|11111000 [24] fffff8 [24] 564 ( 27) |11111111|11111111|11111001 [24] fffff9 [24] 565 ( 28) |11111111|11111111|11111010 [24] fffffa [24] 566 ( 29) |11111111|11111111|11111011 [24] fffffb [24] 567 ( 30) |11111111|11111111|11111100 [24] fffffc [24] 568 ( 31) |11111111|11111111|11111101 [24] fffffd [24] 569 ' ' ( 32) |11111111|0110 [12] ff6 [12] 570 '!' ( 33) |11111111|0111 [12] ff7 [12] 571 '"' ( 34) |11111111|111010 [14] 3ffa [14] 572 '#' ( 35) |11111111|1111100 [15] 7ffc [15] 573 '$' ( 36) |11111111|1111101 [15] 7ffd [15] 574 '%' ( 37) |011000 [6] 18 [6] 575 '&' ( 38) |1010100 [7] 54 [7] 576 ''' ( 39) |11111111|1111110 [15] 7ffe [15] 577 '(' ( 40) |11111111|1000 [12] ff8 [12] 578 ')' ( 41) |11111111|1001 [12] ff9 [12] 579 '*' ( 42) |11111111|1010 [12] ffa [12] 580 '+' ( 43) |11111111|1011 [12] ffb [12] 581 ',' ( 44) |11111011|10 [10] 3ee [10] 582 '-' ( 45) |011001 [6] 19 [6] 583 '.' ( 46) |00010 [5] 2 [5] 584 '/' ( 47) |00011 [5] 3 [5] 585 '0' ( 48) |011010 [6] 1a [6] 586 '1' ( 49) |011011 [6] 1b [6] 587 '2' ( 50) |011100 [6] 1c [6] 588 '3' ( 51) |011101 [6] 1d [6] 589 '4' ( 52) |1010101 [7] 55 [7] 590 '5' ( 53) |1010110 [7] 56 [7] 591 '6' ( 54) |1010111 [7] 57 [7] 592 '7' ( 55) |1011000 [7] 58 [7] 593 '8' ( 56) |1011001 [7] 59 [7] 594 '9' ( 57) |1011010 [7] 5a [7] 595 ':' ( 58) |011110 [6] 1e [6] 596 ';' ( 59) |11111011|11 [10] 3ef [10] 597 '<' ( 60) |11111111|11111111|10 [18] 3fffe [18] 598 '=' ( 61) |011111 [6] 1f [6] 599 '>' ( 62) |11111111|11111110|0 [17] 1fffc [17] 600 '?' ( 63) |11110110|0 [9] 1ec [9] 601 '@' ( 64) |11111111|11100 [13] 1ffc [13] 602 'A' ( 65) |10111010 [8] ba [8] 603 'B' ( 66) |11110110|1 [9] 1ed [9] 604 'C' ( 67) |10111011 [8] bb [8] 605 'D' ( 68) |10111100 [8] bc [8] 606 'E' ( 69) |11110111|0 [9] 1ee [9] 607 'F' ( 70) |10111101 [8] bd [8] 608 'G' ( 71) |11111100|00 [10] 3f0 [10] 609 'H' ( 72) |11111100|01 [10] 3f1 [10] 610 'I' ( 73) |11110111|1 [9] 1ef [9] 611 'J' ( 74) |11111100|10 [10] 3f2 [10] 612 'K' ( 75) |11111111|010 [11] 7fa [11] 613 'L' ( 76) |11111100|11 [10] 3f3 [10] 614 'M' ( 77) |11111000|0 [9] 1f0 [9] 615 'N' ( 78) |11111101|00 [10] 3f4 [10] 616 'O' ( 79) |11111101|01 [10] 3f5 [10] 617 'P' ( 80) |11111000|1 [9] 1f1 [9] 618 'Q' ( 81) |11111101|10 [10] 3f6 [10] 619 'R' ( 82) |11111001|0 [9] 1f2 [9] 620 'S' ( 83) |11111001|1 [9] 1f3 [9] 621 'T' ( 84) |11111010|0 [9] 1f4 [9] 622 'U' ( 85) |11111101|11 [10] 3f7 [10] 623 'V' ( 86) |11111110|00 [10] 3f8 [10] 624 'W' ( 87) |11111110|01 [10] 3f9 [10] 625 'X' ( 88) |11111110|10 [10] 3fa [10] 626 'Y' ( 89) |11111110|11 [10] 3fb [10] 627 'Z' ( 90) |11111111|00 [10] 3fc [10] 628 '[' ( 91) |11111111|111011 [14] 3ffb [14] 629 '\' ( 92) |11111111|11111111|11111110 [24] fffffe [24] 630 ']' ( 93) |11111111|111100 [14] 3ffc [14] 631 '^' ( 94) |11111111|111101 [14] 3ffd [14] 632 '_' ( 95) |1011011 [7] 5b [7] 633 '`' ( 96) |11111111|11111111|110 [19] 7fffe [19] 634 'a' ( 97) |00100 [5] 4 [5] 635 'b' ( 98) |1011100 [7] 5c [7] 636 'c' ( 99) |00101 [5] 5 [5] 637 'd' (100) |100000 [6] 20 [6] 638 'e' (101) |0000 [4] 0 [4] 639 'f' (102) |100001 [6] 21 [6] 640 'g' (103) |100010 [6] 22 [6] 641 'h' (104) |100011 [6] 23 [6] 642 'i' (105) |00110 [5] 6 [5] 643 'j' (106) |10111110 [8] be [8] 644 'k' (107) |10111111 [8] bf [8] 645 'l' (108) |100100 [6] 24 [6] 646 'm' (109) |100101 [6] 25 [6] 647 'n' (110) |100110 [6] 26 [6] 648 'o' (111) |00111 [5] 7 [5] 649 'p' (112) |01000 [5] 8 [5] 650 'q' (113) |11111010|1 [9] 1f5 [9] 651 'r' (114) |01001 [5] 9 [5] 652 's' (115) |01010 [5] a [5] 653 't' (116) |01011 [5] b [5] 654 'u' (117) |100111 [6] 27 [6] 655 'v' (118) |11000000 [8] c0 [8] 656 'w' (119) |101000 [6] 28 [6] 657 'x' (120) |11000001 [8] c1 [8] 658 'y' (121) |11000010 [8] c2 [8] 659 'z' (122) |11111011|0 [9] 1f6 [9] 660 '{' (123) |11111111|11111110|1 [17] 1fffd [17] 661 '|' (124) |11111111|1100 [12] ffc [12] 662 '}' (125) |11111111|11111111|0 [17] 1fffe [17] 663 '~' (126) |11111111|1101 [12] ffd [12] 664 (127) |101001 [6] 29 [6] 665 (0xC2) |11000011 [8] c3 [8] 666 (0xC3) |11000100 [8] c4 [8] 667 (0xC4) |11000101 [8] c5 [8] 668 (0xC5) |11000110 [8] c6 [8] 669 (0xC6) |11000111 [8] c7 [8] 670 (0xC7) |11001000 [8] c8 [8] 671 (0xC8) |11001001 [8] c9 [8] 672 (0xC9) |11001010 [8] ca [8] 673 (0xCA) |11001011 [8] cb [8] 674 (0xCB) |11001100 [8] cc [8] 675 (0xCC) |11001101 [8] cd [8] 676 (0xCD) |11001110 [8] ce [8] 677 (0xCE) |11001111 [8] cf [8] 678 (0xCF) |11010000 [8] d0 [8] 679 (0xD0) |11010001 [8] d1 [8] 680 (0xD1) |11010010 [8] d2 [8] 681 (0xD2) |11010011 [8] d3 [8] 682 (0xD3) |11010100 [8] d4 [8] 683 (0xD4) |11010101 [8] d5 [8] 684 (0xD5) |11010110 [8] d6 [8] 685 (0xD6) |11010111 [8] d7 [8] 686 (0xD7) |11011000 [8] d8 [8] 687 (0xD8) |11011001 [8] d9 [8] 688 (0xD9) |11011010 [8] da [8] 689 (0xDA) |11011011 [8] db [8] 690 (0xDB) |11011100 [8] dc [8] 691 (0xDC) |11011101 [8] dd [8] 692 (0xDD) |11011110 [8] de [8] 693 (0xDE) |11011111 [8] df [8] 694 (0xDF) |11100000 [8] e0 [8] 695 (0xE0) |11100001 [8] e1 [8] 696 (0xE1) |11100010 [8] e2 [8] 697 (0xE2) |11100011 [8] e3 [8] 698 (0xE3) |11100100 [8] e4 [8] 699 (0xE4) |11100101 [8] e5 [8] 700 (0xE5) |11100110 [8] e6 [8] 701 (0xE6) |11100111 [8] e7 [8] 702 (0xE7) |11101000 [8] e8 [8] 703 (0xE8) |11101001 [8] e9 [8] 704 (0xE9) |11101010 [8] ea [8] 705 (0xEA) |11101011 [8] eb [8] 706 (0xEB) |11101100 [8] ec [8] 707 (0xEC) |11101101 [8] ed [8] 708 (0xED) |11101110 [8] ee [8] 709 (0xEE) |11101111 [8] ef [8] 710 (0xEF) |11110000 [8] f0 [8] 711 (0xF0) |11110001 [8] f1 [8] 712 (0xF1) |11110010 [8] f2 [8] 713 (0xF2) |11110011 [8] f3 [8] 714 (0xF3) |11110100 [8] f4 [8] 715 (0xF4) |11110101 [8] f5 [8] 717 Response Table: 719 ( 0) |11111111|11111111|11111111|0 [25] 1fffffe [25] 720 ( 1) |11111111|11111111|11111111|1 [25] 1ffffff [25] 721 ( 2) |11111111|11111111|11100000 [24] ffffe0 [24] 722 ( 3) |11111111|11111111|11100001 [24] ffffe1 [24] 723 ( 4) |11111111|11111111|11100010 [24] ffffe2 [24] 724 ( 5) |11111111|11111111|11100011 [24] ffffe3 [24] 725 ( 6) |11111111|11111111|11100100 [24] ffffe4 [24] 726 ( 7) |11111111|11111111|11100101 [24] ffffe5 [24] 727 ( 8) |11111111|11111111|11100110 [24] ffffe6 [24] 728 ( 9) |11111111|11111111|11100111 [24] ffffe7 [24] 729 ( 10) |11111111|11111111|11101000 [24] ffffe8 [24] 730 ( 11) |11111111|11111111|11101001 [24] ffffe9 [24] 731 ( 12) |11111111|11111111|11101010 [24] ffffea [24] 732 ( 13) |11111111|11111111|11101011 [24] ffffeb [24] 733 ( 14) |11111111|11111111|11101100 [24] ffffec [24] 734 ( 15) |11111111|11111111|11101101 [24] ffffed [24] 735 ( 16) |11111111|11111111|11101110 [24] ffffee [24] 736 ( 17) |11111111|11111111|11101111 [24] ffffef [24] 737 ( 18) |11111111|11111111|11110000 [24] fffff0 [24] 738 ( 19) |11111111|11111111|11110001 [24] fffff1 [24] 739 ( 20) |11111111|11111111|11110010 [24] fffff2 [24] 740 ( 21) |11111111|11111111|11110011 [24] fffff3 [24] 741 ( 22) |11111111|11111111|11110100 [24] fffff4 [24] 742 ( 23) |11111111|11111111|11110101 [24] fffff5 [24] 743 ( 24) |11111111|11111111|11110110 [24] fffff6 [24] 744 ( 25) |11111111|11111111|11110111 [24] fffff7 [24] 745 ( 26) |11111111|11111111|11111000 [24] fffff8 [24] 746 ( 27) |11111111|11111111|11111001 [24] fffff9 [24] 747 ( 28) |11111111|11111111|11111010 [24] fffffa [24] 748 ( 29) |11111111|11111111|11111011 [24] fffffb [24] 749 ( 30) |11111111|11111111|11111100 [24] fffffc [24] 750 ( 31) |11111111|11111111|11111101 [24] fffffd [24] 751 ' ' ( 32) |11111111|0110 [12] ff6 [12] 752 '!' ( 33) |11111111|0111 [12] ff7 [12] 753 '"' ( 34) |11111111|111010 [14] 3ffa [14] 754 '#' ( 35) |11111111|1111100 [15] 7ffc [15] 755 '$' ( 36) |11111111|1111101 [15] 7ffd [15] 756 '%' ( 37) |011000 [6] 18 [6] 757 '&' ( 38) |1010100 [7] 54 [7] 758 ''' ( 39) |11111111|1111110 [15] 7ffe [15] 759 '(' ( 40) |11111111|1000 [12] ff8 [12] 760 ')' ( 41) |11111111|1001 [12] ff9 [12] 761 '*' ( 42) |11111111|1010 [12] ffa [12] 762 '+' ( 43) |11111111|1011 [12] ffb [12] 763 ',' ( 44) |11111011|10 [10] 3ee [10] 764 '-' ( 45) |011001 [6] 19 [6] 765 '.' ( 46) |00010 [5] 2 [5] 766 '/' ( 47) |00011 [5] 3 [5] 767 '0' ( 48) |011010 [6] 1a [6] 768 '1' ( 49) |011011 [6] 1b [6] 769 '2' ( 50) |011100 [6] 1c [6] 770 '3' ( 51) |011101 [6] 1d [6] 771 '4' ( 52) |1010101 [7] 55 [7] 772 '5' ( 53) |1010110 [7] 56 [7] 773 '6' ( 54) |1010111 [7] 57 [7] 774 '7' ( 55) |1011000 [7] 58 [7] 775 '8' ( 56) |1011001 [7] 59 [7] 776 '9' ( 57) |1011010 [7] 5a [7] 777 ':' ( 58) |011110 [6] 1e [6] 778 ';' ( 59) |11111011|11 [10] 3ef [10] 779 '<' ( 60) |11111111|11111111|10 [18] 3fffe [18] 780 '=' ( 61) |011111 [6] 1f [6] 781 '>' ( 62) |11111111|11111110|0 [17] 1fffc [17] 782 '?' ( 63) |11110110|0 [9] 1ec [9] 783 '@' ( 64) |11111111|11100 [13] 1ffc [13] 784 'A' ( 65) |10111010 [8] ba [8] 785 'B' ( 66) |11110110|1 [9] 1ed [9] 786 'C' ( 67) |10111011 [8] bb [8] 787 'D' ( 68) |10111100 [8] bc [8] 788 'E' ( 69) |11110111|0 [9] 1ee [9] 789 'F' ( 70) |10111101 [8] bd [8] 790 'G' ( 71) |11111100|00 [10] 3f0 [10] 791 'H' ( 72) |11111100|01 [10] 3f1 [10] 792 'I' ( 73) |11110111|1 [9] 1ef [9] 793 'J' ( 74) |11111100|10 [10] 3f2 [10] 794 'K' ( 75) |11111111|010 [11] 7fa [11] 795 'L' ( 76) |11111100|11 [10] 3f3 [10] 796 'M' ( 77) |11111000|0 [9] 1f0 [9] 797 'N' ( 78) |11111101|00 [10] 3f4 [10] 798 'O' ( 79) |11111101|01 [10] 3f5 [10] 799 'P' ( 80) |11111000|1 [9] 1f1 [9] 800 'Q' ( 81) |11111101|10 [10] 3f6 [10] 801 'R' ( 82) |11111001|0 [9] 1f2 [9] 802 'S' ( 83) |11111001|1 [9] 1f3 [9] 803 'T' ( 84) |11111010|0 [9] 1f4 [9] 804 'U' ( 85) |11111101|11 [10] 3f7 [10] 805 'V' ( 86) |11111110|00 [10] 3f8 [10] 806 'W' ( 87) |11111110|01 [10] 3f9 [10] 807 'X' ( 88) |11111110|10 [10] 3fa [10] 808 'Y' ( 89) |11111110|11 [10] 3fb [10] 809 'Z' ( 90) |11111111|00 [10] 3fc [10] 810 '[' ( 91) |11111111|111011 [14] 3ffb [14] 811 '\' ( 92) |11111111|11111111|11111110 [24] fffffe [24] 812 ']' ( 93) |11111111|111100 [14] 3ffc [14] 813 '^' ( 94) |11111111|111101 [14] 3ffd [14] 814 '_' ( 95) |1011011 [7] 5b [7] 815 '`' ( 96) |11111111|11111111|110 [19] 7fffe [19] 816 'a' ( 97) |00100 [5] 4 [5] 817 'b' ( 98) |1011100 [7] 5c [7] 818 'c' ( 99) |00101 [5] 5 [5] 819 'd' (100) |100000 [6] 20 [6] 820 'e' (101) |0000 [4] 0 [4] 821 'f' (102) |100001 [6] 21 [6] 822 'g' (103) |100010 [6] 22 [6] 823 'h' (104) |100011 [6] 23 [6] 824 'i' (105) |00110 [5] 6 [5] 825 'j' (106) |10111110 [8] be [8] 826 'k' (107) |10111111 [8] bf [8] 827 'l' (108) |100100 [6] 24 [6] 828 'm' (109) |100101 [6] 25 [6] 829 'n' (110) |100110 [6] 26 [6] 830 'o' (111) |00111 [5] 7 [5] 831 'p' (112) |01000 [5] 8 [5] 832 'q' (113) |11111010|1 [9] 1f5 [9] 833 'r' (114) |01001 [5] 9 [5] 834 's' (115) |01010 [5] a [5] 835 't' (116) |01011 [5] b [5] 836 'u' (117) |100111 [6] 27 [6] 837 'v' (118) |11000000 [8] c0 [8] 838 'w' (119) |101000 [6] 28 [6] 839 'x' (120) |11000001 [8] c1 [8] 840 'y' (121) |11000010 [8] c2 [8] 841 'z' (122) |11111011|0 [9] 1f6 [9] 842 '{' (123) |11111111|11111110|1 [17] 1fffd [17] 843 '|' (124) |11111111|1100 [12] ffc [12] 844 '}' (125) |11111111|11111111|0 [17] 1fffe [17] 845 '~' (126) |11111111|1101 [12] ffd [12] 846 (127) |101001 [6] 29 [6] 847 (0xC2) |11000011 [8] c3 [8] 848 (0xC3) |11000100 [8] c4 [8] 849 (0xC4) |11000101 [8] c5 [8] 850 (0xC5) |11000110 [8] c6 [8] 851 (0xC6) |11000111 [8] c7 [8] 852 (0xC7) |11001000 [8] c8 [8] 853 (0xC8) |11001001 [8] c9 [8] 854 (0xC9) |11001010 [8] ca [8] 855 (0xCA) |11001011 [8] cb [8] 856 (0xCB) |11001100 [8] cc [8] 857 (0xCC) |11001101 [8] cd [8] 858 (0xCD) |11001110 [8] ce [8] 859 (0xCE) |11001111 [8] cf [8] 860 (0xCF) |11010000 [8] d0 [8] 861 (0xD0) |11010001 [8] d1 [8] 862 (0xD1) |11010010 [8] d2 [8] 863 (0xD2) |11010011 [8] d3 [8] 864 (0xD3) |11010100 [8] d4 [8] 865 (0xD4) |11010101 [8] d5 [8] 866 (0xD5) |11010110 [8] d6 [8] 867 (0xD6) |11010111 [8] d7 [8] 868 (0xD7) |11011000 [8] d8 [8] 869 (0xD8) |11011001 [8] d9 [8] 870 (0xD9) |11011010 [8] da [8] 871 (0xDA) |11011011 [8] db [8] 872 (0xDB) |11011100 [8] dc [8] 873 (0xDC) |11011101 [8] dd [8] 874 (0xDD) |11011110 [8] de [8] 875 (0xDE) |11011111 [8] df [8] 876 (0xDF) |11100000 [8] e0 [8] 877 (0xE0) |11100001 [8] e1 [8] 878 (0xE1) |11100010 [8] e2 [8] 879 (0xE2) |11100011 [8] e3 [8] 880 (0xE3) |11100100 [8] e4 [8] 881 (0xE4) |11100101 [8] e5 [8] 882 (0xE5) |11100110 [8] e6 [8] 883 (0xE6) |11100111 [8] e7 [8] 884 (0xE7) |11101000 [8] e8 [8] 885 (0xE8) |11101001 [8] e9 [8] 886 (0xE9) |11101010 [8] ea [8] 887 (0xEA) |11101011 [8] eb [8] 888 (0xEB) |11101100 [8] ec [8] 889 (0xEC) |11101101 [8] ed [8] 890 (0xED) |11101110 [8] ee [8] 891 (0xEE) |11101111 [8] ef [8] 892 (0xEF) |11110000 [8] f0 [8] 893 (0xF0) |11110001 [8] f1 [8] 894 (0xF1) |11110010 [8] f2 [8] 895 (0xF2) |11110011 [8] f3 [8] 896 (0xF3) |11110100 [8] f4 [8] 897 (0xF4) |11110101 [8] f5 [8] 899 Appendix B. Static Storage Cache 901 0x80 "date" = NIL 902 0x81 ":scheme" = "https" 903 0x82 ":scheme" = "http" 904 0x83 ":scheme" = "ftp" 905 0x84 ":method" = "get" 906 0x85 ":method" = "post" 907 0x86 ":method" = "put" 908 0x87 ":method" = "delete" 909 0x88 ":method" = "options" 910 0x89 ":method" = "patch" 911 0x8A ":method" = "connect" 912 0x8B ":path" = "/" 913 0x8C ":host" = NIL 914 0x8D "cookie" = NIL 915 0x8E ":status" = 100 916 0x8F ":status" = 101 917 0x90 ":status" = 102 918 0x91 ":status" = 200 919 0x92 ":status" = 201 920 0x93 ":status" = 202 921 0x94 ":status" = 203 922 0x95 ":status" = 204 923 0x96 ":status" = 205 924 0x97 ":status" = 206 925 0x98 ":status" = 207 926 0x99 ":status" = 208 927 0x9A ":status" = 300 928 0x9B ":status" = 301 929 0x9C ":status" = 302 930 0x9D ":status" = 303 931 0x9E ":status" = 304 932 0x9F ":status" = 305 933 0xA0 ":status" = 307 934 0xA1 ":status" = 308 935 0xA2 ":status" = 400 936 0xA3 ":status" = 401 937 0xA4 ":status" = 402 938 0xA5 ":status" = 403 939 0xA6 ":status" = 404 940 0xA7 ":status" = 405 941 0xA8 ":status" = 406 942 0xA9 ":status" = 407 943 0xAA ":status" = 408 944 0xAB ":status" = 409 945 0xAC ":status" = 410 946 0xAD ":status" = 411 947 0xAE ":status" = 412 948 0xAF ":status" = 413 949 0xB0 ":status" = 414 950 0xB1 ":status" = 415 951 0xB2 ":status" = 416 952 0xB3 ":status" = 417 953 0xB4 ":status" = 500 954 0xB5 ":status" = 501 955 0xB6 ":status" = 502 956 0xB7 ":status" = 503 957 0xB8 ":status" = 504 958 0xB9 ":status" = 505 959 0xBA ":status-text" = "OK" 960 0xBB ":version" = "1.1" 961 0xBC "accept" = NIL 962 0xBD "accept-charset" = NIL 963 0xBE "accept-encoding" = NIL 964 0xBF "accept-language" = NIL 965 0xC0 "accept-ranges" = NIL 966 0xC1 "allow" = NIL 967 0xC2 "authorization" = NIL 968 0xC3 "cache-control" = NIL 969 0xC4 "content-base" = NIL 970 0xC5 "content-encoding" = NIL 971 0xC6 "content-length" = NIL 972 0xC7 "content-location" = NIL 973 0xC8 "content-md5" = NIL 974 0xC9 "content-range" = NIL 975 0xCA "content-type" = NIL 976 0xCB "content-disposition" = NIL 977 0xCC "content-language" = NIL 978 0xCD "etag" = NIL 979 0xCE "expect" = NIL 980 0xCF "expires" = NIL 981 0xD0 "from" = NIL 982 0xD1 "if-match" = NIL 983 0xD2 "if-modified-since" = NIL 984 0xD3 "if-none-match" = NIL 985 0xD4 "if-range" = NIL 986 0xD5 "if-unmodified-since" = NIL 987 0xD6 "last-modified" = NIL 988 0xD7 "location" = NIL 989 0xD8 "max-forwards" = NIL 990 0xD9 "origin" = NIL 991 0xDA "pragma" = NIL 992 0xDB "proxy-authenticate" = NIL 993 0xDC "proxy-authorization" = NIL 994 0xDD "range" = NIL 995 0xDE "referer" = NIL 996 0xDF "retry-after" = NIL 997 0xE0 "server" = NIL 998 0xE1 "set-cookie" = NIL 999 0xE2 "status" = NIL 1000 0xE3 "te" = NIL 1001 0xE4 "trailer" = NIL 1002 0xE5 "transfer-encoding" = NIL 1003 0xE6 "upgrade" = NIL 1004 0xE7 "user-agent" = NIL 1005 0xE8 "vary" = NIL 1006 0xE9 "via" = NIL 1007 0xEA "warning" = NIL 1008 0xEB "www-authenticate" = NIL 1009 0xEC "access-control-allow-origin" = NIL 1010 0xED "get-dictionary" = NIL 1011 0xEE "p3p" = NIL 1012 0xEF "link" = NIL 1013 0xF0 "prefer" = NIL 1014 0xF1 "preference-applied" = NIL 1015 0xF2 "accept-patch" = NIL 1016 0xF3 NIL 1017 0xF4 NIL 1018 0xF5 NIL 1019 0xF6 NIL 1020 0xF7 NIL 1021 0xF8 NIL 1022 0xF9 NIL 1023 0xFA NIL 1024 0xFB NIL 1025 0xFC NIL 1026 0xFD NIL 1027 0xFE NIL 1028 0xFF NIL 1030 Author's Address 1032 James M Snell 1034 Email: jasnell@gmail.com