Home | History | Annotate | Download | only in contrib
      1 % HTTP/2 Campaign
      2 # Frames expressed as binary str were generated using the solicit and hpack-rs
      3 # Rust crates (https://github.com/mlalic/solicit, https://github.com/mlalic/hpack-rs)
      4 # except Continuation Frames, Priority Frames and Push Promise Frames that we generated
      5 # using Go x/net/http2 and x/net/http2/hpack modules.
      6 
      7 + Syntax check
      8 = Configuring Scapy
      9 ~ http2 frame hpack build dissect data headers priority settings rststream pushpromise ping goaway winupdate continuation hpackhdrtable helpers
     10 
     11 import scapy.config
     12 scapy.config.conf.debug_dissector=True
     13 import scapy.packet
     14 import scapy.fields
     15 import scapy.contrib.http2 as h2
     16 import re
     17 flags_bit_pattern = re.compile(r'''^\s+flags\s+=\s+\[.*['"]bit [0-9]+['"].*\]$''', re.M)
     18 def expect_exception(e, c):
     19     try:
     20         eval(c)
     21         return False
     22     except e:
     23         return True
     24 
     25 + HTTP/2 UVarIntField Test Suite
     26 
     27 = HTTP/2 UVarIntField.any2i
     28 ~ http2 frame field uvarintfield
     29 
     30 f = h2.UVarIntField('value', 0, 5)
     31 expect_exception(AssertionError, 'f.any2i(None, None)')
     32 assert(f.any2i(None, 0) == 0)
     33 assert(f.any2i(None, 3) == 3)
     34 assert(f.any2i(None, 1<<5) == 1<<5)
     35 assert(f.any2i(None, 1<<16) == 1<<16)
     36 f = h2.UVarIntField('value', 0, 8)
     37 assert(f.any2i(None, b'\x1E') == 30)
     38 
     39 = HTTP/2 UVarIntField.m2i on full byte
     40 ~ http2 frame field uvarintfield
     41 
     42 f = h2.UVarIntField('value', 0, 8)
     43 assert(f.m2i(None, b'\x00') == 0)
     44 assert(f.m2i(None, b'\x03') == 3)
     45 assert(f.m2i(None, b'\xFE') == 254)
     46 assert(f.m2i(None, b'\xFF\x00') == 255)
     47 assert(f.m2i(None, b'\xFF\xFF\x03') == 766) #0xFF + (0xFF ^ 0x80) + (3<<7)
     48 
     49 = HTTP/2 UVarIntField.m2i on partial byte
     50 ~ http2 frame field uvarintfield
     51 
     52 f = h2.UVarIntField('value', 0, 5)
     53 assert(f.m2i(None, (b'\x00', 3)) == 0)
     54 assert(f.m2i(None, (b'\x03', 3)) == 3)
     55 assert(f.m2i(None, (b'\x1e', 3)) == 30)
     56 assert(f.m2i(None, (b'\x1f\x00', 3)) == 31)
     57 assert(f.m2i(None, (b'\x1f\xe1\xff\x03', 3)) == 65536)
     58 
     59 = HTTP/2 UVarIntField.getfield on full byte
     60 ~ http2 frame field uvarintfield
     61 
     62 f = h2.UVarIntField('value', 0, 8)
     63 
     64 r = f.getfield(None, b'\x00\x00')
     65 assert(r[0] == b'\x00')
     66 assert(r[1] == 0)
     67 
     68 r = f.getfield(None, b'\x03\x00')
     69 assert(r[0] == b'\x00')
     70 assert(r[1] == 3)
     71 
     72 r = f.getfield(None, b'\xFE\x00')
     73 assert(r[0] == b'\x00')
     74 assert(r[1] == 254)
     75 
     76 r = f.getfield(None, b'\xFF\x00\x00')
     77 assert(r[0] == b'\x00')
     78 assert(r[1] == 255)
     79 
     80 r = f.getfield(None, b'\xFF\xFF\x03\x00')
     81 assert(r[0] == b'\x00')
     82 assert(r[1] == 766)
     83 
     84 = HTTP/2 UVarIntField.getfield on partial byte
     85 ~ http2 frame field uvarintfield
     86 
     87 f = h2.UVarIntField('value', 0, 5)
     88 
     89 r = f.getfield(None, (b'\x00\x00', 3))
     90 assert(r[0] == b'\x00')
     91 assert(r[1] == 0)
     92 
     93 r = f.getfield(None, (b'\x03\x00', 3))
     94 assert(r[0] == b'\x00')
     95 assert(r[1] == 3)
     96 
     97 r = f.getfield(None, (b'\x1e\x00', 3))
     98 assert(r[0] == b'\x00')
     99 assert(r[1] == 30)
    100 
    101 r = f.getfield(None, (b'\x1f\x00\x00', 3))
    102 assert(r[0] == b'\x00')
    103 assert(r[1] == 31)
    104 
    105 r = f.getfield(None, (b'\x1f\xe1\xff\x03\x00', 3))
    106 assert(r[0] == b'\x00')
    107 assert(r[1] == 65536)
    108 
    109 = HTTP/2 UVarIntField.i2m on full byte
    110 ~ http2 frame field uvarintfield
    111 
    112 f = h2.UVarIntField('value', 0, 8)
    113 assert(f.i2m(None, 0) == b'\x00')
    114 assert(f.i2m(None, 3) == b'\x03')
    115 assert(f.i2m(None, 254).lower() == b'\xfe')
    116 assert(f.i2m(None, 255).lower() == b'\xff\x00')
    117 assert(f.i2m(None, 766).lower() == b'\xff\xff\x03')
    118 
    119 = HTTP/2 UVarIntField.i2m on partial byte
    120 ~ http2 frame field uvarintfield
    121 
    122 f = h2.UVarIntField('value', 0, 5)
    123 assert(f.i2m(None, 0) == b'\x00')
    124 assert(f.i2m(None, 3) == b'\x03')
    125 assert(f.i2m(None, 30).lower() == b'\x1e')
    126 assert(f.i2m(None, 31).lower() == b'\x1f\x00')
    127 assert(f.i2m(None, 65536).lower() == b'\x1f\xe1\xff\x03')
    128 
    129 = HTTP/2 UVarIntField.addfield on full byte
    130 ~ http2 frame field uvarintfield
    131 
    132 f = h2.UVarIntField('value', 0, 8)
    133 
    134 assert(f.addfield(None, b'Toto', 0) == b'Toto\x00')
    135 assert(f.addfield(None, b'Toto', 3) == b'Toto\x03')
    136 assert(f.addfield(None, b'Toto', 254).lower() == b'toto\xfe')
    137 assert(f.addfield(None, b'Toto', 255).lower() == b'toto\xff\x00')
    138 assert(f.addfield(None, b'Toto', 766).lower() == b'toto\xff\xff\x03')
    139 
    140 = HTTP/2 UVarIntField.addfield on partial byte
    141 ~ http2 frame field uvarintfield
    142 
    143 f = h2.UVarIntField('value', 0, 5)
    144 
    145 assert(f.addfield(None, (b'Toto', 3, 4), 0) == b'Toto\x80')
    146 assert(f.addfield(None, (b'Toto', 3, 4), 3) == b'Toto\x83')
    147 assert(f.addfield(None, (b'Toto', 3, 4), 30).lower() == b'toto\x9e')
    148 assert(f.addfield(None, (b'Toto', 3, 4), 31).lower() == b'toto\x9f\x00')
    149 assert(f.addfield(None, (b'Toto', 3, 4), 65536).lower() == b'toto\x9f\xe1\xff\x03')
    150 
    151 = HTTP/2 UVarIntField.i2len on full byte
    152 ~ http2 frame field uvarintfield
    153 
    154 f = h2.UVarIntField('value', 0, 8)
    155 
    156 assert(f.i2len(None, 0) == 1)
    157 assert(f.i2len(None, 3) == 1)
    158 assert(f.i2len(None, 254) == 1)
    159 assert(f.i2len(None, 255) == 2)
    160 assert(f.i2len(None, 766) == 3)
    161 
    162 = HTTP/2 UVarIntField.i2len on partial byte
    163 ~ http2 frame field uvarintfield
    164 
    165 f = h2.UVarIntField('value', 0, 5)
    166 
    167 assert(f.i2len(None, 0) == 1)
    168 assert(f.i2len(None, 3) == 1)
    169 assert(f.i2len(None, 30) == 1)
    170 assert(f.i2len(None, 31) == 2)
    171 assert(f.i2len(None, 65536) == 4)
    172 
    173 + HTTP/2 FieldUVarLenField Test Suite
    174 
    175 = HTTP/2 FieldUVarLenField.i2m without adjustment
    176 ~ http2 frame field fielduvarlenfield
    177 
    178 
    179 f = h2.FieldUVarLenField('len', None, 8, length_of='data')
    180 class TrivialPacket(Packet):
    181     name = 'Trivial Packet'
    182     fields_desc= [
    183         f,
    184         StrField('data', '')
    185     ]
    186 
    187 assert(f.i2m(TrivialPacket(data='a'*5), None) == b'\x05')
    188 assert(f.i2m(TrivialPacket(data='a'*255), None).lower() == b'\xff\x00')
    189 assert(f.i2m(TrivialPacket(data='a'), 2) == b'\x02')
    190 assert(f.i2m(None, 2) == b'\x02')
    191 assert(f.i2m(None, 0) == b'\x00')
    192 
    193 = HTTP/2 FieldUVarLenField.i2m with adjustment
    194 ~ http2 frame field fielduvarlenfield
    195 
    196 class TrivialPacket(Packet):
    197     name = 'Trivial Packet'
    198     fields_desc= [
    199         f,
    200         StrField('data', '')
    201     ]
    202 
    203 f = h2.FieldUVarLenField('value', None, 8, length_of='data', adjust=lambda x: x-1)
    204 assert(f.i2m(TrivialPacket(data='a'*5), None) == b'\x04')
    205 assert(f.i2m(TrivialPacket(data='a'*255), None).lower() == b'\xfe')
    206 #Adjustement does not affect non-None value!
    207 assert(f.i2m(TrivialPacket(data='a'*3), 2) == b'\x02')
    208 
    209 + HTTP/2 HPackZString Test Suite
    210 
    211 = HTTP/2 HPackZString Compression
    212 ~ http2 hpack huffman
    213 
    214 string = 'Test'
    215 s = h2.HPackZString(string)
    216 assert(len(s) == 3)
    217 assert(raw(s) == b"\xdeT'")
    218 assert(s.origin() == string)
    219 
    220 string = 'a'*65535
    221 s = h2.HPackZString(string)
    222 assert(len(s) == 40960)
    223 assert(raw(s) == (b'\x18\xc61\x8cc' * 8191) + b'\x18\xc61\x8c\x7f')
    224 assert(s.origin() == string)
    225 
    226 = HTTP/2 HPackZString Decompression
    227 ~ http2 hpack huffman
    228 
    229 s = b"\xdeT'"
    230 i, ibl = h2.HPackZString.huffman_conv2bitstring(s)
    231 assert(b'Test' == h2.HPackZString.huffman_decode(i, ibl))
    232 
    233 s = (b'\x18\xc61\x8cc' * 8191) + b'\x18\xc61\x8c\x7f'
    234 i, ibl = h2.HPackZString.huffman_conv2bitstring(s)
    235 assert(b'a'*65535 == h2.HPackZString.huffman_decode(i, ibl))
    236 
    237 assert(
    238     expect_exception(h2.InvalidEncodingException,
    239     'h2.HPackZString.huffman_decode(*h2.HPackZString.huffman_conv2bitstring(b"\\xdeT"))')
    240 )
    241 
    242 + HTTP/2 HPackStrLenField Test Suite
    243 
    244 = HTTP/2 HPackStrLenField.m2i
    245 ~ http2 hpack field hpackstrlenfield
    246 
    247 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    248 class TrivialPacket(Packet):
    249     name = 'Trivial Packet'
    250     fields_desc = [
    251         IntField('type', None),
    252         IntField('len', None),
    253         f
    254     ]
    255 
    256 s = f.m2i(TrivialPacket(type=0, len=4), b'Test')
    257 assert(isinstance(s, h2.HPackLiteralString))
    258 assert(s.origin() == 'Test')
    259 
    260 s = f.m2i(TrivialPacket(type=1, len=3), b"\xdeT'")
    261 assert(isinstance(s, h2.HPackZString))
    262 assert(s.origin() == 'Test')
    263 
    264 = HTTP/2 HPackStrLenField.any2i
    265 ~ http2 hpack field hpackstrlenfield
    266 
    267 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    268 class TrivialPacket(Packet):
    269     name = 'Trivial Packet'
    270     fields_desc = [
    271         IntField('type', None),
    272         IntField('len', None),
    273         f
    274     ]
    275 
    276 s = f.any2i(TrivialPacket(type=0, len=4), b'Test')
    277 assert(isinstance(s, h2.HPackLiteralString))
    278 assert(s.origin() == 'Test')
    279 
    280 s = f.any2i(TrivialPacket(type=1, len=3), b"\xdeT'")
    281 assert(isinstance(s, h2.HPackZString))
    282 assert(s.origin() == 'Test')
    283 
    284 s = h2.HPackLiteralString('Test')
    285 s2 = f.any2i(TrivialPacket(type=0, len=4), s)
    286 assert(s.origin() == s2.origin())
    287 
    288 s = h2.HPackZString('Test')
    289 s2 = f.any2i(TrivialPacket(type=1, len=3), s)
    290 assert(s.origin() == s2.origin())
    291 
    292 s = h2.HPackLiteralString('Test')
    293 s2 = f.any2i(None, s)
    294 assert(s.origin() == s2.origin())
    295 
    296 s = h2.HPackZString('Test')
    297 s2 = f.any2i(None, s)
    298 assert(s.origin() == s2.origin())
    299 
    300 # Verifies that one can fuzz
    301 s = h2.HPackLiteralString('Test')
    302 s2 = f.any2i(TrivialPacket(type=1, len=1), s)
    303 assert(s.origin() == s2.origin())
    304 
    305 = HTTP/2 HPackStrLenField.i2m
    306 ~ http2 hpack field hpackstrlenfield
    307 
    308 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    309 
    310 s = b'Test'
    311 s2 = f.i2m(None, h2.HPackLiteralString(s))
    312 assert(s == s2)
    313 
    314 s = b'Test'
    315 s2 = f.i2m(None, h2.HPackZString(s))
    316 assert(s2 == b"\xdeT'")
    317 
    318 = HTTP/2 HPackStrLenField.addfield
    319 ~ http2 hpack field hpackstrlenfield
    320 
    321 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    322 
    323 s = b'Test'
    324 s2 = f.addfield(None, b'Toto', h2.HPackLiteralString(s))
    325 assert(b'Toto' + s == s2)
    326 
    327 s = b'Test'
    328 s2 = f.addfield(None, b'Toto', h2.HPackZString(s))
    329 assert(s2 == b"Toto\xdeT'")
    330 
    331 = HTTP/2 HPackStrLenField.getfield
    332 ~ http2 hpack field hpackstrlenfield
    333 
    334 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    335 class TrivialPacket(Packet):
    336     name = 'Trivial Packet'
    337     fields_desc = [
    338         IntField('type', None),
    339         IntField('len', None),
    340         f
    341     ]
    342 
    343 r = f.getfield(TrivialPacket(type=0, len=4), b'TestToto')
    344 assert(isinstance(r, tuple))
    345 assert(r[0] == b'Toto')
    346 assert(isinstance(r[1], h2.HPackLiteralString))
    347 assert(r[1].origin() == 'Test')
    348 
    349 r = f.getfield(TrivialPacket(type=1, len=3), b"\xdeT'Toto")
    350 assert(isinstance(r, tuple))
    351 assert(r[0] == b'Toto')
    352 assert(isinstance(r[1], h2.HPackZString))
    353 assert(r[1].origin() == 'Test')
    354 
    355 = HTTP/2 HPackStrLenField.i2h / i2repr
    356 ~ http2 hpack field hpackstrlenfield
    357 
    358 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    359 
    360 s = b'Test'
    361 assert(f.i2h(None, h2.HPackLiteralString(s)) == 'HPackLiteralString(Test)')
    362 assert(f.i2repr(None, h2.HPackLiteralString(s)) == repr('HPackLiteralString(Test)'))
    363 
    364 assert(f.i2h(None, h2.HPackZString(s)) == 'HPackZString(Test)')
    365 assert(f.i2repr(None, h2.HPackZString(s)) == repr('HPackZString(Test)'))
    366 
    367 = HTTP/2 HPackStrLenField.i2len
    368 ~ http2 hpack field hpackstrlenfield
    369 
    370 f = h2.HPackStrLenField('data', h2.HPackLiteralString(''), length_from=lambda p: p.len, type_from='type')
    371 
    372 s = b'Test'
    373 assert(f.i2len(None, h2.HPackLiteralString(s)) == 4)
    374 assert(f.i2len(None, h2.HPackZString(s)) == 3)
    375 
    376 + HTTP/2 HPackMagicBitField Test Suite
    377 # Magic bits are not supposed to be modified and if they are anyway, they must
    378 # be assigned the magic|default value only...
    379 
    380 = HTTP/2 HPackMagicBitField.addfield
    381 ~ http2 hpack field hpackmagicbitfield
    382 
    383 f = h2.HPackMagicBitField('value', 3, 2)
    384 r = f.addfield(None, b'Toto', 3)
    385 assert(isinstance(r, tuple))
    386 assert(r[0] == b'Toto')
    387 assert(r[1] == 2)
    388 assert(r[2] == 3)
    389 
    390 r = f.addfield(None, (b'Toto', 2, 1) , 3)
    391 assert(isinstance(r, tuple))
    392 assert(r[0] == b'Toto')
    393 assert(r[1] == 4)
    394 assert(r[2] == 7)
    395 
    396 assert(expect_exception(AssertionError, 'f.addfield(None, "toto", 2)'))
    397 
    398 = HTTP/2 HPackMagicBitField.getfield
    399 ~ http2 hpack field hpackmagicbitfield
    400 
    401 f = h2.HPackMagicBitField('value', 3, 2)
    402 
    403 r = f.getfield(None, b'\xc0')
    404 assert(isinstance(r, tuple))
    405 assert(len(r) == 2)
    406 assert(isinstance(r[0], tuple))
    407 assert(len(r[0]) == 2)
    408 assert(r[0][0] == b'\xc0')
    409 assert(r[0][1] == 2)
    410 assert(r[1] == 3)
    411 
    412 r = f.getfield(None, (b'\x03', 6))
    413 assert(isinstance(r, tuple))
    414 assert(len(r) == 2)
    415 assert(isinstance(r[0], bytes))
    416 assert(r[0] == b'')
    417 assert(r[1] == 3)
    418 
    419 expect_exception(AssertionError, 'f.getfield(None, b"\\x80")')
    420 
    421 = HTTP/2 HPackMagicBitField.h2i
    422 ~ http2 hpack field hpackmagicbitfield
    423 
    424 f = h2.HPackMagicBitField('value', 3, 2)
    425 assert(f.h2i(None, 3) == 3)
    426 expect_exception(AssertionError, 'f.h2i(None, 2)')
    427 
    428 = HTTP/2 HPackMagicBitField.m2i
    429 ~ http2 hpack field hpackmagicbitfield
    430 
    431 f = h2.HPackMagicBitField('value', 3, 2)
    432 assert(f.m2i(None, 3) == 3)
    433 expect_exception(AssertionError, 'f.m2i(None, 2)')
    434 
    435 = HTTP/2 HPackMagicBitField.i2m
    436 ~ http2 hpack field hpackmagicbitfield
    437 
    438 f = h2.HPackMagicBitField('value', 3, 2)
    439 assert(f.i2m(None, 3) == 3)
    440 expect_exception(AssertionError, 'f.i2m(None, 2)')
    441 
    442 = HTTP/2 HPackMagicBitField.any2i
    443 ~ http2 hpack field hpackmagicbitfield
    444 
    445 f = h2.HPackMagicBitField('value', 3, 2)
    446 assert(f.any2i(None, 3) == 3)
    447 expect_exception(AssertionError, 'f.any2i(None, 2)')
    448 
    449 + HTTP/2 HPackHdrString Test Suite
    450 
    451 = HTTP/2 Dissect HPackHdrString
    452 ~ http2 pack dissect hpackhdrstring
    453 
    454 p = h2.HPackHdrString(b'\x04Test')
    455 assert(p.type == 0)
    456 assert(p.len == 4)
    457 assert(isinstance(p.getfieldval('data'), h2.HPackLiteralString))
    458 assert(p.getfieldval('data').origin() == 'Test')
    459 
    460 p = h2.HPackHdrString(b"\x83\xdeT'")
    461 assert(p.type == 1)
    462 assert(p.len == 3)
    463 assert(isinstance(p.getfieldval('data'), h2.HPackZString))
    464 assert(p.getfieldval('data').origin() == 'Test')
    465 
    466 = HTTP/2 Build HPackHdrString
    467 ~ http2 hpack build hpackhdrstring
    468 
    469 p = h2.HPackHdrString(data=h2.HPackLiteralString('Test'))
    470 assert(raw(p) == b'\x04Test')
    471 
    472 p = h2.HPackHdrString(data=h2.HPackZString('Test'))
    473 assert(raw(p) == b"\x83\xdeT'")
    474 
    475 #Fuzzing-able tests
    476 p = h2.HPackHdrString(type=1, len=3, data=h2.HPackLiteralString('Test'))
    477 assert(raw(p) == b'\x83Test')
    478 
    479 + HTTP/2 HPackIndexedHdr Test Suite
    480 
    481 = HTTP/2 Dissect HPackIndexedHdr
    482 ~ http2 hpack dissect hpackindexedhdr
    483 
    484 p = h2.HPackIndexedHdr(b'\x80')
    485 assert(p.magic == 1)
    486 assert(p.index == 0)
    487 
    488 p = h2.HPackIndexedHdr(b'\xFF\x00')
    489 assert(p.magic == 1)
    490 assert(p.index == 127)
    491 
    492 = HTTP/2 Build HPackIndexedHdr
    493 ~ http2 hpack build hpackindexedhdr
    494 
    495 p = h2.HPackIndexedHdr(index=0)
    496 assert(raw(p) == b'\x80')
    497 
    498 p = h2.HPackIndexedHdr(index=127)
    499 assert(raw(p) == b'\xFF\x00')
    500 
    501 + HTTP/2 HPackLitHdrFldWithIncrIndexing Test Suite
    502 
    503 = HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing without indexed name
    504 ~ http2 hpack dissect hpacklithdrfldwithincrindexing
    505 
    506 p = h2.HPackLitHdrFldWithIncrIndexing(b'\x40\x04Test\x04Toto')
    507 assert(p.magic == 1)
    508 assert(p.index == 0)
    509 assert(isinstance(p.hdr_name, h2.HPackHdrString))
    510 assert(p.hdr_name.type == 0)
    511 assert(p.hdr_name.len == 4)
    512 assert(p.hdr_name.getfieldval('data').origin() == 'Test')
    513 assert(isinstance(p.hdr_value, h2.HPackHdrString))
    514 assert(p.hdr_value.type == 0)
    515 assert(p.hdr_value.len == 4)
    516 assert(p.hdr_value.getfieldval('data').origin() == 'Toto')
    517 
    518 = HTTP/2 Dissect HPackLitHdrFldWithIncrIndexing with indexed name
    519 ~ http2 hpack dissect hpacklithdrfldwithincrindexing
    520 
    521 p = h2.HPackLitHdrFldWithIncrIndexing(b'\x41\x04Toto')
    522 assert(p.magic == 1)
    523 assert(p.index == 1)
    524 assert(p.hdr_name is None)
    525 assert(isinstance(p.hdr_value, h2.HPackHdrString))
    526 assert(p.hdr_value.type == 0)
    527 assert(p.hdr_value.len == 4)
    528 assert(p.hdr_value.getfieldval('data').origin() == 'Toto')
    529 
    530 
    531 = HTTP/2 Build HPackLitHdrFldWithIncrIndexing without indexed name
    532 ~ http2 hpack build hpacklithdrfldwithincrindexing
    533 
    534 p = h2.HPackLitHdrFldWithIncrIndexing(
    535     hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')),
    536     hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto'))
    537 )
    538 assert(raw(p) == b'\x40\x04Test\x04Toto')
    539 
    540 = HTTP/2 Build HPackLitHdrFldWithIncrIndexing with indexed name
    541 ~ http2 hpack build hpacklithdrfldwithincrindexing
    542 
    543 p = h2.HPackLitHdrFldWithIncrIndexing(
    544     index=1,
    545     hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto'))
    546 )
    547 assert(raw(p) == b'\x41\x04Toto')
    548 
    549 + HTTP/2 HPackLitHdrFldWithoutIndexing Test Suite
    550 
    551 = HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : don't index and no index
    552 ~ http2 hpack dissect hpacklithdrfldwithoutindexing
    553 
    554 p = h2.HPackLitHdrFldWithoutIndexing(b'\x00\x04Test\x04Toto')
    555 assert(p.magic == 0)
    556 assert(p.never_index == 0)
    557 assert(p.index == 0)
    558 assert(isinstance(p.hdr_name, h2.HPackHdrString))
    559 assert(p.hdr_name.type == 0)
    560 assert(p.hdr_name.len == 4)
    561 assert(isinstance(p.hdr_name.getfieldval('data'), h2.HPackLiteralString))
    562 assert(p.hdr_name.getfieldval('data').origin() == 'Test')
    563 assert(isinstance(p.hdr_value, h2.HPackHdrString))
    564 assert(p.hdr_value.type == 0)
    565 assert(p.hdr_value.len == 4)
    566 assert(isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString))
    567 assert(p.hdr_value.getfieldval('data').origin() == 'Toto')
    568 
    569 = HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index index and no index
    570 ~ http2 hpack dissect hpacklithdrfldwithoutindexing
    571 
    572 p = h2.HPackLitHdrFldWithoutIndexing(b'\x10\x04Test\x04Toto')
    573 assert(p.magic == 0)
    574 assert(p.never_index == 1)
    575 assert(p.index == 0)
    576 assert(isinstance(p.hdr_name, h2.HPackHdrString))
    577 assert(p.hdr_name.type == 0)
    578 assert(p.hdr_name.len == 4)
    579 assert(isinstance(p.hdr_name.getfieldval('data'), h2.HPackLiteralString))
    580 assert(p.hdr_name.getfieldval('data').origin() == 'Test')
    581 assert(isinstance(p.hdr_value, h2.HPackHdrString))
    582 assert(p.hdr_value.type == 0)
    583 assert(p.hdr_value.len == 4)
    584 assert(isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString))
    585 assert(p.hdr_value.getfieldval('data').origin() == 'Toto')
    586 
    587 = HTTP/2 Dissect HPackLitHdrFldWithoutIndexing : never index and indexed name
    588 ~ http2 hpack dissect hpacklithdrfldwithoutindexing
    589 
    590 p = h2.HPackLitHdrFldWithoutIndexing(b'\x11\x04Toto')
    591 assert(p.magic == 0)
    592 assert(p.never_index == 1)
    593 assert(p.index == 1)
    594 assert(p.hdr_name is None)
    595 assert(isinstance(p.hdr_value, h2.HPackHdrString))
    596 assert(p.hdr_value.type == 0)
    597 assert(p.hdr_value.len == 4)
    598 assert(isinstance(p.hdr_value.getfieldval('data'), h2.HPackLiteralString))
    599 assert(p.hdr_value.getfieldval('data').origin() == 'Toto')
    600 
    601 = HTTP/2 Build HPackLitHdrFldWithoutIndexing : don't index and no index
    602 ~ http2 hpack build hpacklithdrfldwithoutindexing
    603 
    604 p = h2.HPackLitHdrFldWithoutIndexing(
    605     hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')),
    606     hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto'))
    607 )
    608 assert(raw(p) == b'\x00\x04Test\x04Toto')
    609 
    610 = HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index index and no index
    611 ~ http2 hpack build hpacklithdrfldwithoutindexing
    612 
    613 p = h2.HPackLitHdrFldWithoutIndexing(
    614     never_index=1,
    615     hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('Test')),
    616     hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto'))
    617 )
    618 assert(raw(p) == b'\x10\x04Test\x04Toto')
    619 
    620 = HTTP/2 Build HPackLitHdrFldWithoutIndexing : never index and indexed name
    621 ~ http2 hpack build hpacklithdrfldwithoutindexing
    622 
    623 p = h2.HPackLitHdrFldWithoutIndexing(
    624     never_index=1,
    625     index=1,
    626     hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString(b'Toto'))
    627 )
    628 assert(raw(p) == b'\x11\x04Toto')
    629 
    630 + HTTP/2 HPackDynamicSizeUpdate Test Suite
    631 
    632 = HTTP/2 Dissect HPackDynamicSizeUpdate
    633 ~ http2 hpack dissect hpackdynamicsizeupdate
    634 
    635 p = h2.HPackDynamicSizeUpdate(b'\x25')
    636 assert(p.magic == 1)
    637 assert(p.max_size == 5)
    638 p = h2.HPackDynamicSizeUpdate(b'\x3F\x00')
    639 assert(p.magic == 1)
    640 assert(p.max_size == 31)
    641 
    642 = HTTP/2 Build HPackDynamicSizeUpdate
    643 ~ http2 hpack build hpackdynamicsizeupdate
    644 
    645 p = h2.HPackDynamicSizeUpdate(max_size=5)
    646 assert(raw(p) == b'\x25')
    647 p = h2.HPackDynamicSizeUpdate(max_size=31)
    648 assert(raw(p) == b'\x3F\x00')
    649 
    650 + HTTP/2 Data Frame Test Suite
    651 
    652 = HTTP/2 Dissect Data Frame: Simple data frame
    653 ~ http2 frame dissect data
    654 
    655 pkt = h2.H2Frame(b'\x00\x00\x04\x00\x00\x00\x00\x00\x01ABCD')
    656 assert(pkt.type == 0)
    657 assert(pkt.len == 4)
    658 assert(len(pkt.flags) == 0)
    659 assert(pkt.reserved == 0)
    660 assert(pkt.stream_id == 1)
    661 assert(isinstance(pkt.payload, h2.H2DataFrame))
    662 assert(pkt[h2.H2DataFrame])
    663 assert(pkt.payload.data == b'ABCD')
    664 assert(isinstance(pkt.payload.payload, scapy.packet.NoPayload))
    665 
    666 = HTTP/2 Build Data Frame: Simple data frame
    667 ~ http2 frame build data
    668 
    669 pkt = h2.H2Frame(stream_id = 1)/h2.H2DataFrame(data='ABCD')
    670 assert(raw(pkt) == b'\x00\x00\x04\x00\x00\x00\x00\x00\x01ABCD')
    671 try:
    672     pkt.show2(dump=True)
    673     assert(True)
    674 except:
    675     assert(False)
    676 
    677 = HTTP/2 Dissect Data Frame: Simple data frame with padding
    678 ~ http2 frame dissect data
    679 
    680 pkt = h2.H2Frame(b'\x00\x00\r\x00\x08\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00') #Padded data frame
    681 assert(pkt.type == 0)
    682 assert(pkt.len == 13)
    683 assert(len(pkt.flags) ==  1)
    684 assert('P' in pkt.flags)
    685 assert(pkt.reserved == 0)
    686 assert(pkt.stream_id == 1)
    687 assert(isinstance(pkt.payload, h2.H2PaddedDataFrame))
    688 assert(pkt[h2.H2PaddedDataFrame])
    689 assert(pkt.payload.padlen == 8)
    690 assert(pkt.payload.data == b'ABCD')
    691 assert(pkt.payload.padding == b'\x00'*8)
    692 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
    693 assert(isinstance(pkt.payload.payload, scapy.packet.NoPayload))
    694 
    695 = HTTP/2 Build Data Frame: Simple data frame with padding
    696 ~ http2 frame build data
    697 
    698 pkt = h2.H2Frame(flags = {'P'}, stream_id = 1)/h2.H2PaddedDataFrame(data='ABCD', padding=b'\x00'*8)
    699 assert(raw(pkt) == b'\x00\x00\r\x00\x08\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00')
    700 try:
    701     pkt.show2(dump=True)
    702     assert(True)
    703 except:
    704     assert(False)
    705 
    706 = HTTP/2 Dissect Data Frame: Simple data frame with padding and end stream flag
    707 ~ http2 frame dissect data
    708 
    709 pkt = h2.H2Frame(b'\x00\x00\r\x00\t\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00') #Padded data frame with end stream flag
    710 assert(pkt.type == 0)
    711 assert(pkt.len == 13)
    712 assert(len(pkt.flags) == 2)
    713 assert('P' in pkt.flags)
    714 assert('ES' in pkt.flags)
    715 assert(pkt.reserved == 0)
    716 assert(pkt.stream_id == 1)
    717 assert(isinstance(pkt.payload, h2.H2PaddedDataFrame))
    718 assert(pkt[h2.H2PaddedDataFrame])
    719 assert(pkt.payload.padlen == 8)
    720 assert(pkt.payload.data == b'ABCD')
    721 assert(pkt.payload.padding == b'\x00'*8)
    722 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
    723 assert(isinstance(pkt.payload.payload, scapy.packet.NoPayload))
    724 
    725 = HTTP/2 Build Data Frame: Simple data frame with padding and end stream flag
    726 ~ http2 frame build data
    727 
    728 pkt = h2.H2Frame(flags = {'P', 'ES'}, stream_id=1)/h2.H2PaddedDataFrame(data='ABCD', padding=b'\x00'*8)
    729 assert(raw(pkt) == b'\x00\x00\r\x00\t\x00\x00\x00\x01\x08ABCD\x00\x00\x00\x00\x00\x00\x00\x00')
    730 try:
    731     pkt.show2(dump=True)
    732     assert(True)
    733 except:
    734     assert(False)
    735 
    736 + HTTP/2 Headers Frame Test Suite
    737 
    738 = HTTP/2 Dissect Headers Frame: Simple header frame
    739 ~ http2 frame dissect headers
    740 
    741 pkt = h2.H2Frame(b'\x00\x00\x0e\x01\x00\x00\x00\x00\x01\x88\x0f\x10\ntext/plain') #Header frame
    742 assert(pkt.type == 1)
    743 assert(pkt.len == 14)
    744 assert(len(pkt.flags) == 0)
    745 assert(pkt.reserved == 0)
    746 assert(pkt.stream_id == 1)
    747 assert(isinstance(pkt.payload, h2.H2HeadersFrame))
    748 assert(pkt[h2.H2HeadersFrame])
    749 hf = pkt[h2.H2HeadersFrame]
    750 assert(len(hf.hdrs) == 2)
    751 assert(isinstance(hf.hdrs[0], h2.HPackIndexedHdr))
    752 assert(hf.hdrs[0].magic == 1)
    753 assert(hf.hdrs[0].index == 8)
    754 assert(isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing))
    755 assert(hf.hdrs[1].magic == 0)
    756 assert(hf.hdrs[1].never_index == 0)
    757 assert(hf.hdrs[1].index == 31)
    758 assert(hf.hdrs[1].hdr_name is None)
    759 assert(expect_exception(AttributeError, 'hf.hdrs[1].non_existant'))
    760 assert(isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString))
    761 s = hf.hdrs[1].hdr_value
    762 assert(s.type == 0)
    763 assert(s.len == 10)
    764 assert(s.getfieldval('data').origin() == 'text/plain')
    765 assert(isinstance(hf.payload, scapy.packet.NoPayload))
    766 
    767 = HTTP/2 Build Headers Frame: Simple header frame
    768 ~ http2 frame build headers
    769 
    770 p = h2.H2Frame(stream_id=1)/h2.H2HeadersFrame(hdrs=[
    771         h2.HPackIndexedHdr(index=8),
    772         h2.HPackLitHdrFldWithoutIndexing(
    773             index=31,
    774             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain'))
    775         )
    776     ]
    777 )
    778 assert(raw(p) == b'\x00\x00\x0e\x01\x00\x00\x00\x00\x01\x88\x0f\x10\ntext/plain')
    779 
    780 = HTTP/2 Dissect Headers Frame: Header frame with padding
    781 ~ http2 frame dissect headers
    782 
    783 pkt = h2.H2Frame(b'\x00\x00\x17\x01\x08\x00\x00\x00\x01\x08\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00') #Header frame with padding
    784 assert(pkt.type == 1)
    785 assert(pkt.len == 23)
    786 assert(len(pkt.flags) == 1)
    787 assert('P' in pkt.flags)
    788 assert(pkt.reserved == 0)
    789 assert(pkt.stream_id == 1)
    790 assert(isinstance(pkt.payload, h2.H2PaddedHeadersFrame))
    791 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
    792 assert(pkt[h2.H2PaddedHeadersFrame])
    793 hf = pkt[h2.H2PaddedHeadersFrame]
    794 assert(hf.padlen == 8)
    795 assert(hf.padding == b'\x00' * 8)
    796 assert(len(hf.hdrs) == 2)
    797 assert(isinstance(hf.hdrs[0], h2.HPackIndexedHdr))
    798 assert(hf.hdrs[0].magic == 1)
    799 assert(hf.hdrs[0].index == 8)
    800 assert(isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing))
    801 assert(hf.hdrs[1].magic == 0)
    802 assert(hf.hdrs[1].never_index == 0)
    803 assert(hf.hdrs[1].index == 31)
    804 assert(hf.hdrs[1].hdr_name is None)
    805 assert(expect_exception(AttributeError, 'hf.hdrs[1].non_existant'))
    806 assert(isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString))
    807 s = hf.hdrs[1].hdr_value
    808 assert(s.type == 0)
    809 assert(s.len == 10)
    810 assert(s.getfieldval('data').origin() == 'text/plain')
    811 assert(isinstance(hf.payload, scapy.packet.NoPayload))
    812 
    813 = HTTP/2 Build Headers Frame: Header frame with padding
    814 ~ http2 frame build headers
    815 
    816 p = h2.H2Frame(flags={'P'}, stream_id=1)/h2.H2PaddedHeadersFrame(
    817     hdrs=[
    818         h2.HPackIndexedHdr(index=8),
    819         h2.HPackLitHdrFldWithoutIndexing(
    820             index=31,
    821             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain'))
    822         )
    823     ],
    824     padding=b'\x00'*8,
    825 )
    826 assert(raw(p) == b'\x00\x00\x17\x01\x08\x00\x00\x00\x01\x08\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00')
    827 
    828 = HTTP/2 Dissect Headers Frame: Header frame with priority
    829 ~ http2 frame dissect headers
    830 
    831 pkt = h2.H2Frame(b'\x00\x00\x13\x01 \x00\x00\x00\x01\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain') #Header frame with priority
    832 assert(pkt.type == 1)
    833 assert(pkt.len == 19)
    834 assert(len(pkt.flags) == 1)
    835 assert('+' in pkt.flags)
    836 assert(pkt.reserved == 0)
    837 assert(pkt.stream_id == 1)
    838 assert(isinstance(pkt.payload, h2.H2PriorityHeadersFrame))
    839 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
    840 assert(pkt[h2.H2PriorityHeadersFrame])
    841 hf = pkt[h2.H2PriorityHeadersFrame]
    842 assert(hf.exclusive == 0)
    843 assert(hf.stream_dependency == 2)
    844 assert(hf.weight == 100)
    845 assert(len(hf.hdrs) == 2)
    846 assert(isinstance(hf.hdrs[0], h2.HPackIndexedHdr))
    847 assert(hf.hdrs[0].magic == 1)
    848 assert(hf.hdrs[0].index == 8)
    849 assert(isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing))
    850 assert(hf.hdrs[1].magic == 0)
    851 assert(hf.hdrs[1].never_index == 0)
    852 assert(hf.hdrs[1].index == 31)
    853 assert(hf.hdrs[1].hdr_name is None)
    854 assert(expect_exception(AttributeError, 'hf.hdrs[1].non_existant'))
    855 assert(isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString))
    856 s = hf.hdrs[1].hdr_value
    857 assert(s.type == 0)
    858 assert(s.len == 10)
    859 assert(s.getfieldval('data').origin() == 'text/plain')
    860 assert(isinstance(hf.payload, scapy.packet.NoPayload))
    861 
    862 = HTTP/2 Build Headers Frame: Header frame with priority
    863 ~ http2 frame build headers
    864 
    865 p = h2.H2Frame(flags={'+'}, stream_id=1)/h2.H2PriorityHeadersFrame(
    866     exclusive=0,
    867     stream_dependency=2,
    868     weight=100,
    869     hdrs=[
    870         h2.HPackIndexedHdr(index=8),
    871         h2.HPackLitHdrFldWithoutIndexing(
    872             index=31,
    873             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain'))
    874         )
    875     ]
    876 )
    877 assert(raw(p) == b'\x00\x00\x13\x01 \x00\x00\x00\x01\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain')
    878 
    879 = HTTP/2 Dissect Headers Frame: Header frame with priority and padding and flags
    880 ~ http2 frame dissect headers
    881 
    882 pkt = h2.H2Frame(b'\x00\x00\x1c\x01-\x00\x00\x00\x01\x08\x00\x00\x00\x02d\x88\x0f\x10\ntext/plain\x00\x00\x00\x00\x00\x00\x00\x00') #Header frame with priority and padding and flags ES|EH
    883 assert(pkt.type == 1)
    884 assert(pkt.len == 28)
    885 assert(len(pkt.flags) == 4)
    886 assert('+' in pkt.flags)
    887 assert('P' in pkt.flags)
    888 assert('ES' in pkt.flags)
    889 assert('EH' in pkt.flags)
    890 assert(pkt.reserved == 0)
    891 assert(pkt.stream_id == 1)
    892 assert(isinstance(pkt.payload, h2.H2PaddedPriorityHeadersFrame))
    893 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
    894 assert(pkt[h2.H2PaddedPriorityHeadersFrame])
    895 hf = pkt[h2.H2PaddedPriorityHeadersFrame]
    896 assert(hf.padlen == 8)
    897 assert(hf.padding == b'\x00' * 8)
    898 assert(hf.exclusive == 0)
    899 assert(hf.stream_dependency == 2)
    900 assert(hf.weight == 100)
    901 assert(len(hf.hdrs) == 2)
    902 assert(isinstance(hf.hdrs[0], h2.HPackIndexedHdr))
    903 assert(hf.hdrs[0].magic == 1)
    904 assert(hf.hdrs[0].index == 8)
    905 assert(isinstance(hf.hdrs[1], h2.HPackLitHdrFldWithoutIndexing))
    906 assert(hf.hdrs[1].magic == 0)
    907 assert(hf.hdrs[1].never_index == 0)
    908 assert(hf.hdrs[1].index == 31)
    909 assert(hf.hdrs[1].hdr_name is None)
    910 assert(expect_exception(AttributeError, 'hf.hdrs[1].non_existant'))
    911 assert(isinstance(hf.hdrs[1].hdr_value, h2.HPackHdrString))
    912 s = hf.hdrs[1].hdr_value
    913 assert(s.type == 0)
    914 assert(s.len == 10)
    915 assert(s.getfieldval('data').origin() == 'text/plain')
    916 assert(isinstance(hf.payload, scapy.packet.NoPayload))
    917 
    918 = HTTP/2 Build Headers Frame: Header frame with priority and padding and flags
    919 ~ http2 frame build headers
    920 
    921 p = h2.H2Frame(flags={'P', '+', 'ES', 'EH'}, stream_id=1)/h2.H2PaddedPriorityHeadersFrame(
    922     exclusive=0,
    923     stream_dependency=2,
    924     weight=100,
    925     padding=b'\x00'*8,
    926     hdrs=[
    927         h2.HPackIndexedHdr(index=8),
    928         h2.HPackLitHdrFldWithoutIndexing(
    929             index=31,
    930             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('text/plain'))
    931         )
    932     ]
    933 )
    934 
    935 + HTTP/2 Priority Frame Test Suite
    936 
    937 = HTTP/2 Dissect Priority Frame
    938 ~ http2 frame dissect priority
    939 
    940 pkt = h2.H2Frame(b'\x00\x00\x05\x02\x00\x00\x00\x00\x03\x80\x00\x00\x01d')
    941 assert(pkt.type == 2)
    942 assert(pkt.len == 5)
    943 assert(len(pkt.flags) == 0)
    944 assert(pkt.reserved == 0)
    945 assert(pkt.stream_id == 3)
    946 assert(isinstance(pkt.payload, h2.H2PriorityFrame))
    947 assert(pkt[h2.H2PriorityFrame])
    948 pp = pkt[h2.H2PriorityFrame]
    949 assert(pp.stream_dependency == 1)
    950 assert(pp.exclusive == 1)
    951 assert(pp.weight == 100)
    952 
    953 = HTTP/2 Build Priority Frame
    954 ~ http2 frame build priority
    955 
    956 p = h2.H2Frame(stream_id=3)/h2.H2PriorityFrame(
    957     exclusive=1,
    958     stream_dependency=1,
    959     weight=100
    960 )
    961 assert(raw(p) == b'\x00\x00\x05\x02\x00\x00\x00\x00\x03\x80\x00\x00\x01d')
    962 
    963 + HTTP/2 Reset Stream Frame Test Suite
    964 
    965 = HTTP/2 Dissect Reset Stream Frame: Protocol Error
    966 ~ http2 frame dissect rststream
    967 
    968 pkt = h2.H2Frame(b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01') #Reset stream with protocol error
    969 assert(pkt.type == 3)
    970 assert(pkt.len == 4)
    971 assert(len(pkt.flags) == 0)
    972 assert(pkt.reserved == 0)
    973 assert(pkt.stream_id == 1)
    974 assert(isinstance(pkt.payload, h2.H2ResetFrame))
    975 assert(pkt[h2.H2ResetFrame])
    976 rf = pkt[h2.H2ResetFrame]
    977 assert(rf.error == 1)
    978 assert(isinstance(rf.payload, scapy.packet.NoPayload))
    979 
    980 = HTTP/2 Build Reset Stream Frame: Protocol Error
    981 ~ http2 frame build rststream
    982 
    983 p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error='Protocol error')
    984 assert(raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01')
    985 
    986 p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error=1)
    987 assert(raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x00\x00\x01')
    988 
    989 = HTTP/2 Dissect Reset Stream Frame: Raw 123456 error
    990 ~ http2 frame dissect rststream
    991 
    992 pkt = h2.H2Frame(b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x01\xe2@') #Reset stream with raw error
    993 assert(pkt.type == 3)
    994 assert(pkt.len == 4)
    995 assert(len(pkt.flags) == 0)
    996 assert(pkt.reserved == 0)
    997 assert(pkt.stream_id == 1)
    998 assert(isinstance(pkt.payload, h2.H2ResetFrame))
    999 assert(pkt[h2.H2ResetFrame])
   1000 rf = pkt[h2.H2ResetFrame]
   1001 assert(rf.error == 123456)
   1002 assert(isinstance(rf.payload, scapy.packet.NoPayload))
   1003 
   1004 = HTTP/2 Dissect Reset Stream Frame: Raw 123456 error
   1005 ~ http2 frame dissect rststream
   1006 
   1007 p = h2.H2Frame(stream_id=1)/h2.H2ResetFrame(error=123456)
   1008 assert(raw(p) == b'\x00\x00\x04\x03\x00\x00\x00\x00\x01\x00\x01\xe2@')
   1009 
   1010 + HTTP/2 Settings Frame Test Suite
   1011 
   1012 = HTTP/2 Dissect Settings Frame: Settings Frame
   1013 ~ http2 frame dissect settings
   1014 
   1015 pkt = h2.H2Frame(b'\x00\x00$\x04\x00\x00\x00\x00\x00\x00\x01\x07[\xcd\x15\x00\x02\x00\x00\x00\x01\x00\x03\x00\x00\x00{\x00\x04\x00\x12\xd6\x87\x00\x05\x00\x01\xe2@\x00\x06\x00\x00\x00{') #Settings frame
   1016 assert(pkt.type == 4)
   1017 assert(pkt.len == 36)
   1018 assert(len(pkt.flags) == 0)
   1019 assert(pkt.reserved == 0)
   1020 assert(pkt.stream_id == 0)
   1021 assert(isinstance(pkt.payload, h2.H2SettingsFrame))
   1022 assert(pkt[h2.H2SettingsFrame])
   1023 sf = pkt[h2.H2SettingsFrame]
   1024 assert(len(sf.settings) == 6)
   1025 assert(isinstance(sf.settings[0], h2.H2Setting))
   1026 assert(sf.settings[0].id == 1)
   1027 assert(sf.settings[0].value == 123456789)
   1028 assert(isinstance(sf.settings[1], h2.H2Setting))
   1029 assert(sf.settings[1].id == 2)
   1030 assert(sf.settings[1].value == 1)
   1031 assert(isinstance(sf.settings[2], h2.H2Setting))
   1032 assert(sf.settings[2].id == 3)
   1033 assert(sf.settings[2].value == 123)
   1034 assert(isinstance(sf.settings[3], h2.H2Setting))
   1035 assert(sf.settings[3].id == 4)
   1036 assert(sf.settings[3].value == 1234567)
   1037 assert(isinstance(sf.settings[4], h2.H2Setting))
   1038 assert(sf.settings[4].id == 5)
   1039 assert(sf.settings[4].value == 123456)
   1040 assert(isinstance(sf.settings[5], h2.H2Setting))
   1041 assert(sf.settings[5].id == 6)
   1042 assert(sf.settings[5].value == 123)
   1043 assert(isinstance(sf.payload, scapy.packet.NoPayload))
   1044 
   1045 = HTTP/2 Build Settings Frame: Settings Frame
   1046 ~ http2 frame build settings
   1047 
   1048 p = h2.H2Frame()/h2.H2SettingsFrame(settings=[
   1049         h2.H2Setting(id='Header table size',value=123456789),
   1050         h2.H2Setting(id='Enable push', value=1),
   1051         h2.H2Setting(id='Max concurrent streams', value=123),
   1052         h2.H2Setting(id='Initial window size', value=1234567),
   1053         h2.H2Setting(id='Max frame size', value=123456),
   1054         h2.H2Setting(id='Max header list size', value=123)
   1055     ]
   1056 )
   1057 assert(raw(p) == b'\x00\x00$\x04\x00\x00\x00\x00\x00\x00\x01\x07[\xcd\x15\x00\x02\x00\x00\x00\x01\x00\x03\x00\x00\x00{\x00\x04\x00\x12\xd6\x87\x00\x05\x00\x01\xe2@\x00\x06\x00\x00\x00{')
   1058 
   1059 = HTTP/2 Dissect Settings Frame: Incomplete Settings Frame
   1060 ~ http2 frame dissect settings
   1061 
   1062 #We use here the decode('hex') method because null-bytes are rejected by eval()
   1063 assert(expect_exception(AssertionError, 'h2.H2Frame(bytes_hex("0000240400000000000001075bcd1500020000000100030000007b00040012d68700050001e2400006000000"))'))
   1064 
   1065 = HTTP/2 Dissect Settings Frame: Settings Frame acknowledgement
   1066 ~ http2 frame dissect settings
   1067 
   1068 pkt = h2.H2Frame(b'\x00\x00\x00\x04\x01\x00\x00\x00\x00') #Settings frame w/ ack flag
   1069 assert(pkt.type == 4)
   1070 assert(pkt.len == 0)
   1071 assert(len(pkt.flags) == 1)
   1072 assert('A' in pkt.flags)
   1073 assert(pkt.reserved == 0)
   1074 assert(pkt.stream_id == 0)
   1075 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
   1076 assert(isinstance(pkt.payload, scapy.packet.NoPayload))
   1077 
   1078 = HTTP/2 Build Settings Frame: Settings Frame acknowledgement
   1079 ~ http2 frame build settings
   1080 
   1081 p = h2.H2Frame(type=h2.H2SettingsFrame.type_id, flags={'A'})
   1082 assert(raw(p) == b'\x00\x00\x00\x04\x01\x00\x00\x00\x00')
   1083 
   1084 + HTTP/2 Push Promise Frame Test Suite
   1085 
   1086 = HTTP/2 Dissect Push Promise Frame: no flag & headers with compression and hdr_name
   1087 ~ http2 frame dissect pushpromise
   1088 
   1089 pkt = h2.H2Frame(b'\x00\x00\x15\x05\x00\x00\x00\x00\x01\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1090 assert(pkt.type == 5)
   1091 assert(pkt.len == 21)
   1092 assert(len(pkt.flags) == 0)
   1093 assert(pkt.reserved == 0)
   1094 assert(pkt.stream_id == 1)
   1095 assert(isinstance(pkt.payload, h2.H2PushPromiseFrame))
   1096 assert(pkt[h2.H2PushPromiseFrame])
   1097 pf = pkt[h2.H2PushPromiseFrame]
   1098 assert(pf.reserved == 0)
   1099 assert(pf.stream_id == 3)
   1100 assert(len(pf.hdrs) == 1)
   1101 assert(isinstance(pf.payload, scapy.packet.NoPayload))
   1102 hdr = pf.hdrs[0]
   1103 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   1104 assert(hdr.magic == 1)
   1105 assert(hdr.index == 0)
   1106 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1107 assert(hdr.hdr_name.type == 1)
   1108 assert(hdr.hdr_name.len == 12)
   1109 assert(hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With')
   1110 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1111 assert(hdr.hdr_value.type == 0)
   1112 assert(hdr.hdr_value.len == 2)
   1113 assert(hdr.hdr_value.getfieldval('data').origin() == 'Me')
   1114 
   1115 = HTTP/2 Build Push Promise Frame: no flag & headers with compression and hdr_name
   1116 ~ http2 frame build pushpromise
   1117 
   1118 p = h2.H2Frame(stream_id=1)/h2.H2PushPromiseFrame(stream_id=3,hdrs=[
   1119     h2.HPackLitHdrFldWithIncrIndexing(
   1120         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')),
   1121         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me')),
   1122     )
   1123 ])
   1124 assert(raw(p) == b'\x00\x00\x15\x05\x00\x00\x00\x00\x01\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1125 
   1126 = HTTP/2 Dissect Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name
   1127 ~ http2 frame dissect pushpromise
   1128 
   1129 pkt = h2.H2Frame(b'\x00\x00\x1e\x05\x0c\x00\x00\x00\x01\x08\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me\x00\x00\x00\x00\x00\x00\x00\x00')
   1130 assert(pkt.type == 5)
   1131 assert(pkt.len == 30)
   1132 assert(len(pkt.flags) == 2)
   1133 assert('P' in pkt.flags)
   1134 assert('EH' in pkt.flags)
   1135 assert(pkt.reserved == 0)
   1136 assert(pkt.stream_id == 1)
   1137 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
   1138 assert(isinstance(pkt.payload, h2.H2PaddedPushPromiseFrame))
   1139 assert(pkt[h2.H2PaddedPushPromiseFrame])
   1140 pf = pkt[h2.H2PaddedPushPromiseFrame]
   1141 assert(pf.padlen == 8)
   1142 assert(pf.padding == b'\x00'*8)
   1143 assert(pf.stream_id == 3)
   1144 assert(len(pf.hdrs) == 1)
   1145 hdr = pf.hdrs[0]
   1146 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   1147 assert(hdr.magic == 1)
   1148 assert(hdr.index == 0)
   1149 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1150 assert(hdr.hdr_name.type == 1)
   1151 assert(hdr.hdr_name.len == 12)
   1152 assert(hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With')
   1153 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1154 assert(hdr.hdr_value.type == 0)
   1155 assert(hdr.hdr_value.len == 2)
   1156 assert(hdr.hdr_value.getfieldval('data').origin() == 'Me')
   1157 
   1158 = HTTP/2 Build Push Promise Frame: with padding, the flag END_Header & headers with compression and hdr_name
   1159 ~ http2 frame build pushpromise
   1160 
   1161 p = h2.H2Frame(flags={'P', 'EH'}, stream_id=1)/h2.H2PaddedPushPromiseFrame(
   1162     stream_id=3,
   1163     hdrs=[
   1164         h2.HPackLitHdrFldWithIncrIndexing(
   1165             hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')),
   1166             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me'))
   1167         )
   1168     ],
   1169     padding=b'\x00'*8
   1170 )
   1171 assert(raw(p) == b'\x00\x00\x1e\x05\x0c\x00\x00\x00\x01\x08\x00\x00\x00\x03@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me\x00\x00\x00\x00\x00\x00\x00\x00')
   1172 
   1173 + HTTP/2 Ping Frame Test Suite
   1174 
   1175 = HTTP/2 Dissect Ping Frame: Ping frame
   1176 ~ http2 frame dissect ping
   1177 
   1178 pkt = h2.H2Frame(b'\x00\x00\x08\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@') #Ping frame with payload
   1179 assert(pkt.type == 6)
   1180 assert(pkt.len == 8)
   1181 assert(len(pkt.flags) == 0)
   1182 assert(pkt.reserved == 0)
   1183 assert(pkt.stream_id == 0)
   1184 assert(isinstance(pkt.payload, h2.H2PingFrame))
   1185 assert(pkt[h2.H2PingFrame])
   1186 pf = pkt[h2.H2PingFrame]
   1187 assert(pf.opaque == 123456)
   1188 assert(isinstance(pf.payload, scapy.packet.NoPayload))
   1189 
   1190 = HTTP/2 Build Ping Frame: Ping frame
   1191 ~ http2 frame build ping
   1192 
   1193 p = h2.H2Frame()/h2.H2PingFrame(opaque=123456)
   1194 assert(raw(p) == b'\x00\x00\x08\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@')
   1195 
   1196 = HTTP/2 Dissect Ping Frame: Pong frame
   1197 ~ http2 frame dissect ping
   1198 
   1199 pkt = h2.H2Frame(b'\x00\x00\x08\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@') #Pong frame
   1200 assert(pkt.type == 6)
   1201 assert(pkt.len == 8)
   1202 assert(len(pkt.flags) == 1)
   1203 assert('A' in pkt.flags)
   1204 assert(pkt.reserved == 0)
   1205 assert(pkt.stream_id == 0)
   1206 assert(isinstance(pkt.payload, h2.H2PingFrame))
   1207 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
   1208 assert(pkt[h2.H2PingFrame])
   1209 pf = pkt[h2.H2PingFrame]
   1210 assert(pf.opaque == 123456)
   1211 assert(isinstance(pf.payload, scapy.packet.NoPayload))
   1212 
   1213 = HTTP/2 Dissect Ping Frame: Pong frame
   1214 ~ http2 frame dissect ping
   1215 
   1216 p = h2.H2Frame(flags={'A'})/h2.H2PingFrame(opaque=123456)
   1217 assert(raw(p) == b'\x00\x00\x08\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\xe2@')
   1218 
   1219 + HTTP/2 Go Away Frame Test Suite
   1220 
   1221 = HTTP/2 Dissect Go Away Frame: No error
   1222 ~ http2 frame dissect goaway
   1223 
   1224 pkt = h2.H2Frame(b'\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00') #Go Away for no particular reason :)
   1225 assert(pkt.type == 7)
   1226 assert(pkt.len == 8)
   1227 assert(len(pkt.flags) == 0)
   1228 assert(pkt.reserved == 0)
   1229 assert(pkt.stream_id == 0)
   1230 assert(isinstance(pkt.payload, h2.H2GoAwayFrame))
   1231 assert(pkt[h2.H2GoAwayFrame])
   1232 gf = pkt[h2.H2GoAwayFrame]
   1233 assert(gf.reserved == 0)
   1234 assert(gf.last_stream_id == 1)
   1235 assert(gf.error == 0)
   1236 assert(len(gf.additional_data) == 0)
   1237 assert(isinstance(gf.payload, scapy.packet.NoPayload))
   1238 
   1239 = HTTP/2 Build Go Away Frame: No error
   1240 ~ http2 frame build goaway
   1241 
   1242 p = h2.H2Frame()/h2.H2GoAwayFrame(last_stream_id=1, error='No error')
   1243 assert(raw(p) == b'\x00\x00\x08\x07\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00')
   1244 
   1245 = HTTP/2 Dissect Go Away Frame: Arbitrary error with additional data
   1246 ~ http2 frame dissect goaway
   1247 
   1248 pkt = h2.H2Frame(b'\x00\x00\x10\x07\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\xe2@\x00\x00\x00\x00\x00\x00\x00\x00') #Go Away with debug data
   1249 assert(pkt.type == 7)
   1250 assert(pkt.len == 16)
   1251 assert(len(pkt.flags) == 0)
   1252 assert(pkt.reserved == 0)
   1253 assert(pkt.stream_id == 0)
   1254 assert(isinstance(pkt.payload, h2.H2GoAwayFrame))
   1255 assert(pkt[h2.H2GoAwayFrame])
   1256 gf = pkt[h2.H2GoAwayFrame]
   1257 assert(gf.reserved == 0)
   1258 assert(gf.last_stream_id == 2)
   1259 assert(gf.error == 123456)
   1260 assert(gf.additional_data == 8*b'\x00')
   1261 assert(isinstance(gf.payload, scapy.packet.NoPayload))
   1262 
   1263 = HTTP/2 Build Go Away Frame: Arbitrary error with additional data
   1264 ~ http2 frame build goaway
   1265 
   1266 p = h2.H2Frame()/h2.H2GoAwayFrame(
   1267     last_stream_id=2,
   1268     error=123456,
   1269     additional_data=b'\x00'*8
   1270 )
   1271 assert(raw(p) == b'\x00\x00\x10\x07\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x01\xe2@\x00\x00\x00\x00\x00\x00\x00\x00')
   1272 
   1273 + HTTP/2 Window Update Frame Test Suite
   1274 
   1275 = HTTP/2 Dissect Window Update Frame: global
   1276 ~ http2 frame dissect winupdate
   1277 
   1278 pkt = h2.H2Frame(b'\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\x01\xe2@') #Window update with increment for connection
   1279 assert(pkt.type == 8)
   1280 assert(pkt.len == 4)
   1281 assert(len(pkt.flags) == 0)
   1282 assert(pkt.reserved == 0)
   1283 assert(pkt.stream_id == 0)
   1284 assert(isinstance(pkt.payload, h2.H2WindowUpdateFrame))
   1285 assert(pkt[h2.H2WindowUpdateFrame])
   1286 wf = pkt[h2.H2WindowUpdateFrame]
   1287 assert(wf.reserved == 0)
   1288 assert(wf.win_size_incr == 123456)
   1289 assert(isinstance(wf.payload, scapy.packet.NoPayload))
   1290 
   1291 = HTTP/2 Build Window Update Frame: global
   1292 ~ http2 frame build winupdate
   1293 
   1294 p = h2.H2Frame()/h2.H2WindowUpdateFrame(win_size_incr=123456)
   1295 assert(raw(p) == b'\x00\x00\x04\x08\x00\x00\x00\x00\x00\x00\x01\xe2@')
   1296 
   1297 = HTTP/2 Dissect Window Update Frame: a stream
   1298 ~ http2 frame dissect winupdate
   1299 
   1300 pkt = h2.H2Frame(b'\x00\x00\x04\x08\x00\x00\x00\x00\x01\x00\x01\xe2@') #Window update with increment for a stream
   1301 assert(pkt.type == 8)
   1302 assert(pkt.len == 4)
   1303 assert(len(pkt.flags) == 0)
   1304 assert(pkt.reserved == 0)
   1305 assert(pkt.stream_id == 1)
   1306 assert(isinstance(pkt.payload, h2.H2WindowUpdateFrame))
   1307 assert(pkt[h2.H2WindowUpdateFrame])
   1308 wf = pkt[h2.H2WindowUpdateFrame]
   1309 assert(wf.reserved == 0)
   1310 assert(wf.win_size_incr == 123456)
   1311 assert(isinstance(wf.payload, scapy.packet.NoPayload))
   1312 
   1313 = HTTP/2 Build Window Update Frame: a stream
   1314 ~ http2 frame build winupdate
   1315 
   1316 p = h2.H2Frame(stream_id=1)/h2.H2WindowUpdateFrame(win_size_incr=123456)
   1317 assert(raw(p) == b'\x00\x00\x04\x08\x00\x00\x00\x00\x01\x00\x01\xe2@')
   1318 
   1319 + HTTP/2 Continuation Frame Test Suite
   1320 
   1321 = HTTP/2 Dissect Continuation Frame: no flag & headers with compression and hdr_name
   1322 ~ http2 frame dissect continuation
   1323 
   1324 pkt = h2.H2Frame(b'\x00\x00\x11\t\x00\x00\x00\x00\x01@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1325 assert(pkt.type == 9)
   1326 assert(pkt.len == 17)
   1327 assert(len(pkt.flags) == 0)
   1328 assert(pkt.reserved == 0)
   1329 assert(pkt.stream_id == 1)
   1330 assert(isinstance(pkt.payload, h2.H2ContinuationFrame))
   1331 assert(pkt[h2.H2ContinuationFrame])
   1332 hf = pkt[h2.H2ContinuationFrame]
   1333 assert(len(hf.hdrs) == 1)
   1334 assert(isinstance(hf.payload, scapy.packet.NoPayload))
   1335 hdr = hf.hdrs[0]
   1336 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   1337 assert(hdr.magic == 1)
   1338 assert(hdr.index == 0)
   1339 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1340 assert(hdr.hdr_name.type == 1)
   1341 assert(hdr.hdr_name.len == 12)
   1342 assert(hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With')
   1343 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1344 assert(hdr.hdr_value.type == 0)
   1345 assert(hdr.hdr_value.len == 2)
   1346 assert(hdr.hdr_value.getfieldval('data').origin() == 'Me')
   1347 
   1348 = HTTP/2 Build Continuation Frame: no flag & headers with compression and hdr_name
   1349 ~ http2 frame build continuation
   1350 
   1351 p = h2.H2Frame(stream_id=1)/h2.H2ContinuationFrame(
   1352     hdrs=[
   1353         h2.HPackLitHdrFldWithIncrIndexing(
   1354             hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')),
   1355             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me'))
   1356         )
   1357     ]
   1358 )
   1359 assert(raw(p) == b'\x00\x00\x11\t\x00\x00\x00\x00\x01@\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1360 
   1361 = HTTP/2 Dissect Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name
   1362 ~ http2 frame dissect continuation
   1363 
   1364 pkt = h2.H2Frame(b'\x00\x00\x11\t\x04\x00\x00\x00\x01\x10\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1365 assert(pkt.type == 9)
   1366 assert(pkt.len == 17)
   1367 assert(len(pkt.flags) == 1)
   1368 assert('EH' in pkt.flags)
   1369 assert(pkt.reserved == 0)
   1370 assert(pkt.stream_id == 1)
   1371 assert(flags_bit_pattern.search(pkt.show(dump=True)) is None)
   1372 assert(isinstance(pkt.payload, h2.H2ContinuationFrame))
   1373 assert(pkt[h2.H2ContinuationFrame])
   1374 hf = pkt[h2.H2ContinuationFrame]
   1375 assert(len(hf.hdrs) == 1)
   1376 assert(isinstance(hf.payload, scapy.packet.NoPayload))
   1377 hdr = hf.hdrs[0]
   1378 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1379 assert(hdr.magic == 0)
   1380 assert(hdr.never_index == 1)
   1381 assert(hdr.index == 0)
   1382 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1383 assert(hdr.hdr_name.type == 1)
   1384 assert(hdr.hdr_name.len == 12)
   1385 assert(hdr.hdr_name.getfieldval('data').origin() == 'X-Requested-With')
   1386 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1387 assert(hdr.hdr_value.type == 0)
   1388 assert(hdr.hdr_value.len == 2)
   1389 assert(hdr.hdr_value.getfieldval('data').origin() == 'Me')
   1390 
   1391 = HTTP/2 Build Continuation Frame: flag END_Header & headers with compression, sensitive flag and hdr_name
   1392 ~ http2 frame build continuation
   1393 
   1394 p = h2.H2Frame(flags={'EH'}, stream_id=1)/h2.H2ContinuationFrame(
   1395     hdrs=[
   1396         h2.HPackLitHdrFldWithoutIndexing(
   1397             never_index=1,
   1398             hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Requested-With')),
   1399             hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me'))
   1400         )
   1401     ]
   1402 )
   1403 assert(raw(p) == b'\x00\x00\x11\t\x04\x00\x00\x00\x01\x10\x8c\xfc[i{ZT$\xb2-\xc8\xc9\x9f\x02Me')
   1404 
   1405 + HTTP/2 HPackHdrTable Test Suite
   1406 
   1407 = HTTP/2 HPackHdrEntry Tests
   1408 ~ http2 hpack hpackhdrtable
   1409 
   1410 n = 'X-Requested-With'
   1411 v = 'Me'
   1412 h = h2.HPackHdrEntry(n, v)
   1413 assert(len(h) == 32 + len(n) + len(v))
   1414 assert(h.name() == n.lower())
   1415 assert(h.value() == v)
   1416 assert(str(h) == '{}: {}'.format(n.lower(), v))
   1417 
   1418 n = ':status'
   1419 v = '200'
   1420 h = h2.HPackHdrEntry(n, v)
   1421 assert(len(h) == 32 + len(n) + len(v))
   1422 assert(h.name() == n.lower())
   1423 assert(h.value() == v)
   1424 assert(str(h) == '{} {}'.format(n.lower(), v))
   1425 
   1426 = HTTP/2 HPackHdrTable : Querying Static Entries
   1427 ~ http2 hpack hpackhdrtable
   1428 
   1429 # In RFC7541, the table is 1-based
   1430 assert(expect_exception(KeyError, 'h2.HPackHdrTable()[0]'))
   1431 
   1432 h = h2.HPackHdrTable()
   1433 assert(h[1].name() == ':authority')
   1434 assert(h[7].name() == ':scheme')
   1435 assert(h[7].value() == 'https')
   1436 assert(str(h[14]) == ':status 500')
   1437 assert(str(h[16]) == 'accept-encoding: gzip, deflate')
   1438 
   1439 assert(expect_exception(KeyError, 'h2.HPackHdrTable()[h2.HPackHdrTable._static_entries_last_idx+1]'))
   1440 
   1441 = HTTP/2 HPackHdrTable : Addind Dynamic Entries without overflowing the table
   1442 ~ http2 hpack hpackhdrtable
   1443 
   1444 tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32)
   1445 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1446     index=32,
   1447     hdr_value=h2.HPackHdrString(data=h2.HPackZString('PHPSESSID=abcdef0123456789'))
   1448 )
   1449 tbl.register(hdr)
   1450 
   1451 tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32)
   1452 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1453     index=32,
   1454     hdr_value=h2.HPackHdrString(data=h2.HPackZString('JSESSID=abcdef0123456789'))
   1455 )
   1456 tbl.register([hdr,hdr2])
   1457 
   1458 tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32)
   1459 hdr3 = h2.HPackLitHdrFldWithIncrIndexing(
   1460     index=32,
   1461     hdr_value=h2.HPackHdrString(data=h2.HPackZString('Test=abcdef0123456789'))
   1462 )
   1463 frm = h2.H2Frame(stream_id=1)/h2.H2HeadersFrame(hdrs=[hdr, hdr2, hdr3])
   1464 tbl.register(frm)
   1465 
   1466 
   1467 = HTTP/2 HPackHdrTable : Querying Dynamic Entries
   1468 ~ http2 hpack hpackhdrtable
   1469 
   1470 tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32)
   1471 hdrv = 'PHPSESSID=abcdef0123456789'
   1472 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1473     index=32,
   1474     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv))
   1475 )
   1476 tbl.register(hdr)
   1477 
   1478 hdrv2 = 'JSESSID=abcdef0123456789'
   1479 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1480     index=32,
   1481     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2))
   1482 )
   1483 tbl.register(hdr2)
   1484 
   1485 hdr3 = h2.HPackLitHdrFldWithIncrIndexing(
   1486     index=0,
   1487     hdr_name=h2.HPackHdrString(data=h2.HPackLiteralString('x-requested-by')),
   1488     hdr_value=h2.HPackHdrString(data=h2.HPackZString('me'))
   1489 )
   1490 tbl.register(hdr3)
   1491 
   1492 assert(tbl.get_idx_by_name('x-requested-by') == h2.HPackHdrTable._static_entries_last_idx+1)
   1493 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv2)
   1494 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+3].value() == hdrv)
   1495 
   1496 = HTTP/2 HPackHdrTable : Addind already registered Dynamic Entries without overflowing the table
   1497 ~ http2 hpack hpackhdrtable
   1498 
   1499 tbl = h2.HPackHdrTable(dynamic_table_max_size=1<<32, dynamic_table_cap_size=1<<32)
   1500 
   1501 assert(len(tbl) == 0)
   1502 
   1503 hdrv = 'PHPSESSID=abcdef0123456789'
   1504 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1505     index=32,
   1506     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv))
   1507 )
   1508 tbl.register(hdr)
   1509 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv)
   1510 
   1511 hdr2v = 'JSESSID=abcdef0123456789'
   1512 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1513     index=32,
   1514     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdr2v))
   1515 )
   1516 tbl.register(hdr2)
   1517 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdr2v)
   1518 
   1519 l = len(tbl)
   1520 tbl.register(hdr)
   1521 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv)
   1522 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdr2v)
   1523 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+3].value() == hdrv)
   1524 
   1525 = HTTP/2 HPackHdrTable : Addind Dynamic Entries and overflowing the table
   1526 ~ http2 hpack hpackhdrtable
   1527 
   1528 tbl = h2.HPackHdrTable(dynamic_table_max_size=80, dynamic_table_cap_size=80)
   1529 hdrv = 'PHPSESSID=abcdef0123456789'
   1530 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1531     index=32,
   1532     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv))
   1533 )
   1534 tbl.register(hdr)
   1535 assert(len(tbl) <= 80)
   1536 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv)
   1537 
   1538 hdrv2 = 'JSESSID=abcdef0123456789'
   1539 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1540     index=32,
   1541     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2))
   1542 )
   1543 tbl.register(hdr2)
   1544 assert(len(tbl) <= 80)
   1545 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1546 try:
   1547     tbl[h2.HPackHdrTable._static_entries_last_idx+2]
   1548     ret = False
   1549 except:
   1550     ret = True
   1551 
   1552 assert(ret)
   1553 
   1554 
   1555 = HTTP/2 HPackHdrTable : Resizing
   1556 ~ http2 hpack hpackhdrtable
   1557 
   1558 tbl = h2.HPackHdrTable()
   1559 hdrv = 'PHPSESSID=abcdef0123456789'
   1560 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1561     index=32,
   1562     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv))
   1563 )
   1564 tbl.register(hdr)
   1565 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv)
   1566 
   1567 hdrv2 = 'JSESSID=abcdef0123456789'
   1568 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1569     index=32,
   1570     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2))
   1571 )
   1572 tbl.register(hdr2)
   1573 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1574 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1575 
   1576 #Resizing to a value higher than cap (default:4096)
   1577 try:
   1578     tbl.resize(8192)
   1579     ret = False
   1580 except AssertionError:
   1581     ret = True
   1582 
   1583 assert(ret)
   1584 #Resizing to a lower value by that is not small enough to cause eviction
   1585 tbl.resize(1024)
   1586 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1587 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1588 #Resizing to a higher value but thatt is lower than cap
   1589 tbl.resize(2048)
   1590 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1591 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1592 #Resizing to a lower value that causes eviction
   1593 tbl.resize(80)
   1594 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1595 try:
   1596     tbl[h2.HPackHdrTable._static_entries_last_idx+2]
   1597     ret = False
   1598 except:
   1599     ret = True
   1600 
   1601 assert(ret)
   1602 
   1603 = HTTP/2 HPackHdrTable : Recapping
   1604 ~ http2 hpack hpackhdrtable
   1605 
   1606 tbl = h2.HPackHdrTable()
   1607 hdrv = 'PHPSESSID=abcdef0123456789'
   1608 hdr = h2.HPackLitHdrFldWithIncrIndexing(
   1609     index=32,
   1610     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv))
   1611 )
   1612 tbl.register(hdr)
   1613 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv)
   1614 
   1615 hdrv2 = 'JSESSID=abcdef0123456789'
   1616 hdr2 = h2.HPackLitHdrFldWithIncrIndexing(
   1617     index=32,
   1618     hdr_value=h2.HPackHdrString(data=h2.HPackZString(hdrv2))
   1619 )
   1620 tbl.register(hdr2)
   1621 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1622 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1623 
   1624 #Recapping to a higher value
   1625 tbl.recap(8192)
   1626 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1627 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1628 
   1629 #Recapping to a low value but without causing eviction
   1630 tbl.recap(1024)
   1631 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1632 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+2].value() == hdrv)
   1633 
   1634 #Recapping to a low value that causes evictiontbl.recap(1024)
   1635 tbl.recap(80)
   1636 assert(tbl[h2.HPackHdrTable._static_entries_last_idx+1].value() == hdrv2)
   1637 try:
   1638     tbl[h2.HPackHdrTable._static_entries_last_idx+2]
   1639     ret = False
   1640 except:
   1641     ret = True
   1642 
   1643 assert(ret)
   1644 
   1645 = HTTP/2 HPackHdrTable : Generating Textual Representation
   1646 ~ http2 hpack hpackhdrtable helpers
   1647 
   1648 h = h2.HPackHdrTable()
   1649 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   1650         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   1651         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   1652 ))
   1653 
   1654 hdrs_lst = [
   1655     h2.HPackIndexedHdr(index=2), #Method Get
   1656     h2.HPackLitHdrFldWithIncrIndexing(
   1657         index=h.get_idx_by_name(':path'),
   1658         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('/index.php'))
   1659     ),
   1660     h2.HPackIndexedHdr(index=7), #Scheme HTTPS
   1661     h2.HPackIndexedHdr(index=h2.HPackHdrTable._static_entries_last_idx+2),
   1662     h2.HPackLitHdrFldWithIncrIndexing(
   1663         index=58,
   1664         hdr_value=h2.HPackHdrString(data=h2.HPackZString('Mozilla/5.0 Generated by hand'))
   1665     ),
   1666     h2.HPackLitHdrFldWithoutIndexing(
   1667         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generated-By')),
   1668         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('Me'))
   1669     )
   1670 ]
   1671 
   1672 p = h2.H2Frame(stream_id = 1)/h2.H2HeadersFrame(hdrs=hdrs_lst)
   1673 
   1674 expected_output = ''':method GET
   1675 :path /index.php
   1676 :scheme https
   1677 x-generation-date: 2016-08-11
   1678 user-agent: Mozilla/5.0 Generated by hand
   1679 X-Generated-By: Me'''
   1680 
   1681 assert(h.gen_txt_repr(p) == expected_output)
   1682 
   1683 = HTTP/2 HPackHdrTable : Parsing Textual Representation
   1684 ~ http2 hpack hpackhdrtable helpers
   1685 
   1686 body = b'login=titi&passwd=toto'
   1687 hdrs = raw(''':method POST
   1688 :path /login.php
   1689 :scheme https
   1690 content-type: application/x-www-form-urlencoded
   1691 content-length: {}
   1692 user-agent: Mozilla/5.0 Generated by hand
   1693 x-generated-by: Me
   1694 x-generation-date: 2016-08-11
   1695 x-generation-software: scapy
   1696 '''.format(len(body)))
   1697 
   1698 h = h2.HPackHdrTable()
   1699 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   1700         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   1701         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   1702 ))
   1703 seq = h.parse_txt_hdrs(
   1704     hdrs,
   1705     stream_id=1,
   1706     body=body,
   1707     should_index=lambda name: name in ['user-agent', 'x-generation-software'],
   1708     is_sensitive=lambda name, value: name in ['x-generated-by', ':path']
   1709 )
   1710 assert(isinstance(seq, h2.H2Seq))
   1711 assert(len(seq.frames) == 2)
   1712 p = seq.frames[0]
   1713 assert(isinstance(p, h2.H2Frame))
   1714 assert(p.type == 1)
   1715 assert(len(p.flags) == 1)
   1716 assert('EH' in p.flags)
   1717 assert(p.stream_id == 1)
   1718 assert(isinstance(p.payload, h2.H2HeadersFrame))
   1719 hdrs_frm = p[h2.H2HeadersFrame]
   1720 assert(len(p.hdrs) == 9)
   1721 hdr = p.hdrs[0]
   1722 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1723 assert(hdr.magic == 1)
   1724 assert(hdr.index == 3)
   1725 hdr = p.hdrs[1]
   1726 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1727 assert(hdr.magic == 0)
   1728 assert(hdr.never_index == 1)
   1729 assert(hdr.index in [4, 5])
   1730 assert(hdr.hdr_name is None)
   1731 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1732 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   1733 hdr = p.hdrs[2]
   1734 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1735 assert(hdr.magic == 1)
   1736 assert(hdr.index == 7)
   1737 hdr = p.hdrs[3]
   1738 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1739 assert(hdr.magic == 0)
   1740 assert(hdr.never_index == 0)
   1741 assert(hdr.index == 31)
   1742 assert(hdr.hdr_name is None)
   1743 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1744 assert(hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)')
   1745 hdr = p.hdrs[4]
   1746 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1747 assert(hdr.magic == 0)
   1748 assert(hdr.never_index == 0)
   1749 assert(hdr.index == 28)
   1750 assert(hdr.hdr_name is None)
   1751 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1752 assert(hdr.hdr_value.data == 'HPackLiteralString(22)')
   1753 hdr = p.hdrs[5]
   1754 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   1755 assert(hdr.magic == 1)
   1756 assert(hdr.index == 58)
   1757 assert(hdr.hdr_name is None)
   1758 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1759 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   1760 hdr = p.hdrs[6]
   1761 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1762 assert(hdr.magic == 0)
   1763 assert(hdr.never_index == 1)
   1764 assert(hdr.index == 0)
   1765 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1766 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   1767 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1768 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   1769 hdr = p.hdrs[7]
   1770 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1771 assert(hdr.magic == 1)
   1772 assert(hdr.index == 63)
   1773 hdr = p.hdrs[8]
   1774 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   1775 assert(hdr.magic == 1)
   1776 assert(hdr.index == 0)
   1777 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1778 assert(hdr.hdr_name.data == 'HPackZString(x-generation-software)')
   1779 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1780 assert(hdr.hdr_value.data == 'HPackZString(scapy)')
   1781 
   1782 p = seq.frames[1]
   1783 assert(isinstance(p, h2.H2Frame))
   1784 assert(p.type == 0)
   1785 assert(len(p.flags) == 1)
   1786 assert('ES' in p.flags)
   1787 assert(p.stream_id == 1)
   1788 assert(isinstance(p.payload, h2.H2DataFrame))
   1789 pay = p[h2.H2DataFrame]
   1790 assert(pay.data == body)
   1791 
   1792 = HTTP/2 HPackHdrTable : Parsing Textual Representation without body
   1793 ~ http2 hpack hpackhdrtable helpers
   1794 
   1795 hdrs = b''':method POST
   1796 :path /login.php
   1797 :scheme https
   1798 user-agent: Mozilla/5.0 Generated by hand
   1799 x-generated-by: Me
   1800 x-generation-date: 2016-08-11
   1801 '''
   1802 
   1803 h = h2.HPackHdrTable()
   1804 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   1805         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   1806         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   1807 ))
   1808 
   1809 # Without body
   1810 seq = h.parse_txt_hdrs(hdrs, stream_id=1)
   1811 assert(isinstance(seq, h2.H2Seq))
   1812 #This is the first major difference with the first test
   1813 assert(len(seq.frames) == 1)
   1814 p = seq.frames[0]
   1815 assert(isinstance(p, h2.H2Frame))
   1816 assert(p.type == 1)
   1817 assert(len(p.flags) == 2)
   1818 assert('EH' in p.flags)
   1819 #This is the second major difference with the first test
   1820 assert('ES' in p.flags)
   1821 assert(p.stream_id == 1)
   1822 assert(isinstance(p.payload, h2.H2HeadersFrame))
   1823 hdrs_frm = p[h2.H2HeadersFrame]
   1824 assert(len(p.hdrs) == 6)
   1825 hdr = p.hdrs[0]
   1826 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1827 assert(hdr.magic == 1)
   1828 assert(hdr.index == 3)
   1829 hdr = p.hdrs[1]
   1830 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1831 assert(hdr.magic == 0)
   1832 assert(hdr.never_index == 0)
   1833 assert(hdr.index in [4, 5])
   1834 assert(hdr.hdr_name is None)
   1835 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1836 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   1837 hdr = p.hdrs[2]
   1838 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1839 assert(hdr.magic == 1)
   1840 assert(hdr.index == 7)
   1841 hdr = p.hdrs[3]
   1842 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1843 assert(hdr.magic == 0)
   1844 assert(hdr.never_index == 0)
   1845 assert(hdr.index == 58)
   1846 assert(hdr.hdr_name is None)
   1847 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1848 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   1849 hdr = p.hdrs[4]
   1850 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1851 assert(hdr.magic == 0)
   1852 assert(hdr.never_index == 0)
   1853 assert(hdr.index == 0)
   1854 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1855 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   1856 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1857 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   1858 hdr = p.hdrs[5]
   1859 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1860 assert(hdr.magic == 1)
   1861 assert(hdr.index == 62)
   1862 
   1863 
   1864 = HTTP/2 HPackHdrTable : Parsing Textual Representation with too small max frame
   1865 ~ http2 hpack hpackhdrtable helpers
   1866 
   1867 body = b'login=titi&passwd=toto'
   1868 hdrs = raw(''':method POST
   1869 :path /login.php
   1870 :scheme https
   1871 content-type: application/x-www-form-urlencoded
   1872 content-length: {}
   1873 user-agent: Mozilla/5.0 Generated by hand
   1874 x-generated-by: Me
   1875 x-generation-date: 2016-08-11
   1876 x-long-header: {}
   1877 '''.format(len(body), 'a'*5000))
   1878 
   1879 h = h2.HPackHdrTable()
   1880 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   1881         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   1882         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   1883 ))
   1884 
   1885 #x-long-header is too long to fit in any frames (whose default max size is 4096)
   1886 expect_exception(Exception, "seq = h.parse_txt_hdrs('''{}''', stream_id=1".format(hdrs))
   1887 
   1888 = HTTP/2 HPackHdrTable : Parsing Textual Representation with very large header and a large authorized frame size
   1889 ~ http2 hpack hpackhdrtable helpers
   1890 
   1891 body = b'login=titi&passwd=toto'
   1892 hdrs = raw(''':method POST
   1893 :path /login.php
   1894 :scheme https
   1895 content-type: application/x-www-form-urlencoded
   1896 content-length: {}
   1897 user-agent: Mozilla/5.0 Generated by hand
   1898 x-generated-by: Me
   1899 x-generation-date: 2016-08-11
   1900 x-long-header: {}
   1901 '''.format(len(body), 'a'*5000))
   1902 
   1903 h = h2.HPackHdrTable()
   1904 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   1905         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   1906         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   1907 ))
   1908 
   1909 # Now trying to parse it with a max frame size large enough for x-long-header to
   1910 # fit in a frame
   1911 seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192)
   1912 assert(isinstance(seq, h2.H2Seq))
   1913 assert(len(seq.frames) == 1)
   1914 p = seq.frames[0]
   1915 assert(isinstance(p, h2.H2Frame))
   1916 assert(p.type == 1)
   1917 assert(len(p.flags) == 2)
   1918 assert('EH' in p.flags)
   1919 assert('ES' in p.flags)
   1920 assert(p.stream_id == 1)
   1921 assert(isinstance(p.payload, h2.H2HeadersFrame))
   1922 hdrs_frm = p[h2.H2HeadersFrame]
   1923 assert(len(p.hdrs) == 9)
   1924 hdr = p.hdrs[0]
   1925 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1926 assert(hdr.magic == 1)
   1927 assert(hdr.index == 3)
   1928 hdr = p.hdrs[1]
   1929 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1930 assert(hdr.magic == 0)
   1931 assert(hdr.never_index == 0)
   1932 assert(hdr.index in [4, 5])
   1933 assert(hdr.hdr_name is None)
   1934 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1935 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   1936 hdr = p.hdrs[2]
   1937 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1938 assert(hdr.magic == 1)
   1939 assert(hdr.index == 7)
   1940 hdr = p.hdrs[3]
   1941 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1942 assert(hdr.magic == 0)
   1943 assert(hdr.never_index == 0)
   1944 assert(hdr.index == 31)
   1945 assert(hdr.hdr_name is None)
   1946 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1947 assert(hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)')
   1948 hdr = p.hdrs[4]
   1949 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1950 assert(hdr.magic == 0)
   1951 assert(hdr.never_index == 0)
   1952 assert(hdr.index == 28)
   1953 assert(hdr.hdr_name is None)
   1954 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1955 assert(hdr.hdr_value.data == 'HPackLiteralString(22)')
   1956 hdr = p.hdrs[5]
   1957 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1958 assert(hdr.magic == 0)
   1959 assert(hdr.never_index == 0)
   1960 assert(hdr.index == 58)
   1961 assert(hdr.hdr_name is None)
   1962 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1963 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   1964 hdr = p.hdrs[6]
   1965 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1966 assert(hdr.magic == 0)
   1967 assert(hdr.never_index == 0)
   1968 assert(hdr.index == 0)
   1969 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1970 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   1971 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1972 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   1973 hdr = p.hdrs[7]
   1974 assert(isinstance(hdr, h2.HPackIndexedHdr))
   1975 assert(hdr.magic == 1)
   1976 assert(hdr.index == 62)
   1977 hdr = p.hdrs[8]
   1978 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   1979 assert(hdr.magic == 0)
   1980 assert(hdr.never_index == 0)
   1981 assert(hdr.index == 0)
   1982 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   1983 assert(hdr.hdr_name.data == 'HPackZString(x-long-header)')
   1984 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   1985 assert(hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000))
   1986 
   1987 = HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers and a large authorized frame size
   1988 ~ http2 hpack hpackhdrtable helpers
   1989 
   1990 body = b'login=titi&passwd=toto'
   1991 hdrs = raw(''':method POST
   1992 :path /login.php
   1993 :scheme https
   1994 content-type: application/x-www-form-urlencoded
   1995 content-length: {}
   1996 user-agent: Mozilla/5.0 Generated by hand
   1997 x-generated-by: Me
   1998 x-generation-date: 2016-08-11
   1999 x-long-header: {}
   2000 x-long-header: {}
   2001 '''.format(len(body), 'a'*5000, 'b'*5000))
   2002 
   2003 h = h2.HPackHdrTable()
   2004 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   2005         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   2006         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   2007 ))
   2008 
   2009 # Now trying to parse it with a max frame size large enough for x-long-header to
   2010 # fit in a frame but a maximum header fragment size that is not large enough to
   2011 # store two x-long-header
   2012 seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192)
   2013 assert(isinstance(seq, h2.H2Seq))
   2014 assert(len(seq.frames) == 2)
   2015 p = seq.frames[0]
   2016 assert(isinstance(p, h2.H2Frame))
   2017 assert(p.type == 1)
   2018 assert(len(p.flags) == 1)
   2019 assert('ES' in p.flags)
   2020 assert(p.stream_id == 1)
   2021 assert(isinstance(p.payload, h2.H2HeadersFrame))
   2022 hdrs_frm = p[h2.H2HeadersFrame]
   2023 assert(len(p.hdrs) == 9)
   2024 hdr = p.hdrs[0]
   2025 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2026 assert(hdr.magic == 1)
   2027 assert(hdr.index == 3)
   2028 hdr = p.hdrs[1]
   2029 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2030 assert(hdr.magic == 0)
   2031 assert(hdr.never_index == 0)
   2032 assert(hdr.index in [4, 5])
   2033 assert(hdr.hdr_name is None)
   2034 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2035 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   2036 hdr = p.hdrs[2]
   2037 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2038 assert(hdr.magic == 1)
   2039 assert(hdr.index == 7)
   2040 hdr = p.hdrs[3]
   2041 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2042 assert(hdr.magic == 0)
   2043 assert(hdr.never_index == 0)
   2044 assert(hdr.index == 31)
   2045 assert(hdr.hdr_name is None)
   2046 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2047 assert(hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)')
   2048 hdr = p.hdrs[4]
   2049 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2050 assert(hdr.magic == 0)
   2051 assert(hdr.never_index == 0)
   2052 assert(hdr.index == 28)
   2053 assert(hdr.hdr_name is None)
   2054 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2055 assert(hdr.hdr_value.data == 'HPackLiteralString(22)')
   2056 hdr = p.hdrs[5]
   2057 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2058 assert(hdr.magic == 0)
   2059 assert(hdr.never_index == 0)
   2060 assert(hdr.index == 58)
   2061 assert(hdr.hdr_name is None)
   2062 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2063 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   2064 hdr = p.hdrs[6]
   2065 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2066 assert(hdr.magic == 0)
   2067 assert(hdr.never_index == 0)
   2068 assert(hdr.index == 0)
   2069 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2070 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   2071 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2072 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   2073 hdr = p.hdrs[7]
   2074 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2075 assert(hdr.magic == 1)
   2076 assert(hdr.index == 62)
   2077 hdr = p.hdrs[8]
   2078 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2079 assert(hdr.magic == 0)
   2080 assert(hdr.never_index == 0)
   2081 assert(hdr.index == 0)
   2082 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2083 assert(hdr.hdr_name.data == 'HPackZString(x-long-header)')
   2084 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2085 assert(hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000))
   2086 p = seq.frames[1]
   2087 assert(isinstance(p, h2.H2Frame))
   2088 assert(p.type == 9)
   2089 assert(len(p.flags) == 1)
   2090 assert('EH' in p.flags)
   2091 assert(p.stream_id == 1)
   2092 assert(isinstance(p.payload, h2.H2ContinuationFrame))
   2093 hdrs_frm = p[h2.H2ContinuationFrame]
   2094 assert(len(p.hdrs) == 1)
   2095 hdr = p.hdrs[0]
   2096 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2097 assert(hdr.magic == 0)
   2098 assert(hdr.never_index == 0)
   2099 assert(hdr.index == 0)
   2100 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2101 assert(hdr.hdr_name.data == 'HPackZString(x-long-header)')
   2102 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2103 assert(hdr.hdr_value.data == 'HPackZString({})'.format('b'*5000))
   2104 
   2105 = HTTP/2 HPackHdrTable : Parsing Textual Representation with two very large headers, a large authorized frame size and a "small" max header list size
   2106 ~ http2 hpack hpackhdrtable helpers
   2107 
   2108 body = b'login=titi&passwd=toto'
   2109 hdrs = raw(''':method POST
   2110 :path /login.php
   2111 :scheme https
   2112 content-type: application/x-www-form-urlencoded
   2113 content-length: {}
   2114 user-agent: Mozilla/5.0 Generated by hand
   2115 x-generated-by: Me
   2116 x-generation-date: 2016-08-11
   2117 x-long-header: {}
   2118 x-long-header: {}
   2119 '''.format(len(body), 'a'*5000, 'b'*5000))
   2120 
   2121 h = h2.HPackHdrTable()
   2122 h.register(h2.HPackLitHdrFldWithIncrIndexing(
   2123         hdr_name=h2.HPackHdrString(data=h2.HPackZString('X-Generation-Date')),
   2124         hdr_value=h2.HPackHdrString(data=h2.HPackLiteralString('2016-08-11'))
   2125 ))
   2126 
   2127 # Now trying to parse it with a max frame size large enough for x-long-header to
   2128 # fit in a frame but and a max header list size that is large enough to fit one
   2129 # but not two
   2130 seq = h.parse_txt_hdrs(hdrs, stream_id=1, max_frm_sz=8192, max_hdr_lst_sz=5050)
   2131 assert(isinstance(seq, h2.H2Seq))
   2132 assert(len(seq.frames) == 3)
   2133 p = seq.frames[0]
   2134 assert(isinstance(p, h2.H2Frame))
   2135 assert(p.type == 1)
   2136 assert(len(p.flags) == 1)
   2137 assert('ES' in p.flags)
   2138 assert(p.stream_id == 1)
   2139 assert(isinstance(p.payload, h2.H2HeadersFrame))
   2140 hdrs_frm = p[h2.H2HeadersFrame]
   2141 assert(len(p.hdrs) == 8)
   2142 hdr = p.hdrs[0]
   2143 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2144 assert(hdr.magic == 1)
   2145 assert(hdr.index == 3)
   2146 hdr = p.hdrs[1]
   2147 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2148 assert(hdr.magic == 0)
   2149 assert(hdr.never_index == 0)
   2150 assert(hdr.index in [4, 5])
   2151 assert(hdr.hdr_name is None)
   2152 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2153 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   2154 hdr = p.hdrs[2]
   2155 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2156 assert(hdr.magic == 1)
   2157 assert(hdr.index == 7)
   2158 hdr = p.hdrs[3]
   2159 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2160 assert(hdr.magic == 0)
   2161 assert(hdr.never_index == 0)
   2162 assert(hdr.index == 31)
   2163 assert(hdr.hdr_name is None)
   2164 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2165 assert(hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)')
   2166 hdr = p.hdrs[4]
   2167 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2168 assert(hdr.magic == 0)
   2169 assert(hdr.never_index == 0)
   2170 assert(hdr.index == 28)
   2171 assert(hdr.hdr_name is None)
   2172 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2173 assert(hdr.hdr_value.data == 'HPackLiteralString(22)')
   2174 hdr = p.hdrs[5]
   2175 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2176 assert(hdr.magic == 0)
   2177 assert(hdr.never_index == 0)
   2178 assert(hdr.index == 58)
   2179 assert(hdr.hdr_name is None)
   2180 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2181 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   2182 hdr = p.hdrs[6]
   2183 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2184 assert(hdr.magic == 0)
   2185 assert(hdr.never_index == 0)
   2186 assert(hdr.index == 0)
   2187 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2188 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   2189 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2190 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   2191 hdr = p.hdrs[7]
   2192 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2193 assert(hdr.magic == 1)
   2194 assert(hdr.index == 62)
   2195 p = seq.frames[1]
   2196 assert(isinstance(p, h2.H2Frame))
   2197 assert(p.type == 9)
   2198 assert(len(p.flags) == 0)
   2199 assert(p.stream_id == 1)
   2200 assert(isinstance(p.payload, h2.H2ContinuationFrame))
   2201 hdrs_frm = p[h2.H2ContinuationFrame]
   2202 assert(len(p.hdrs) == 1)
   2203 hdr = p.hdrs[0]
   2204 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2205 assert(hdr.magic == 0)
   2206 assert(hdr.never_index == 0)
   2207 assert(hdr.index == 0)
   2208 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2209 assert(hdr.hdr_name.data == 'HPackZString(x-long-header)')
   2210 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2211 assert(hdr.hdr_value.data == 'HPackZString({})'.format('a'*5000))
   2212 p = seq.frames[2]
   2213 assert(isinstance(p, h2.H2Frame))
   2214 assert(p.type == 9)
   2215 assert(len(p.flags) == 1)
   2216 assert('EH' in p.flags)
   2217 assert(p.stream_id == 1)
   2218 assert(isinstance(p.payload, h2.H2ContinuationFrame))
   2219 hdrs_frm = p[h2.H2ContinuationFrame]
   2220 assert(len(p.hdrs) == 1)
   2221 hdr = p.hdrs[0]
   2222 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2223 assert(hdr.magic == 0)
   2224 assert(hdr.never_index == 0)
   2225 assert(hdr.index == 0)
   2226 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2227 assert(hdr.hdr_name.data == 'HPackZString(x-long-header)')
   2228 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2229 assert(hdr.hdr_value.data == 'HPackZString({})'.format('b'*5000))
   2230 
   2231 = HTTP/2 HPackHdrTable : Parsing Textual Representation with sensitive headers and non-indexable ones
   2232 ~ http2 hpack hpackhdrtable helpers
   2233 
   2234 hdrs = raw(''':method POST
   2235 :path /login.php
   2236 :scheme https
   2237 content-type: application/x-www-form-urlencoded
   2238 content-length: {}
   2239 user-agent: Mozilla/5.0 Generated by hand
   2240 x-generated-by: Me
   2241 x-generation-date: 2016-08-11
   2242 '''.format(len(body)))
   2243 
   2244 h = h2.HPackHdrTable()
   2245 seq = h.parse_txt_hdrs(hdrs, stream_id=1, body=body, is_sensitive=lambda n,v: n in ['x-generation-date'], should_index=lambda x: x != 'x-generated-by')
   2246 assert(isinstance(seq, h2.H2Seq))
   2247 assert(len(seq.frames) == 2)
   2248 p = seq.frames[0]
   2249 assert(isinstance(p, h2.H2Frame))
   2250 assert(p.type == 1)
   2251 assert(len(p.flags) == 1)
   2252 assert('EH' in p.flags)
   2253 assert(p.stream_id == 1)
   2254 assert(isinstance(p.payload, h2.H2HeadersFrame))
   2255 hdrs_frm = p[h2.H2HeadersFrame]
   2256 assert(len(p.hdrs) == 8)
   2257 hdr = p.hdrs[0]
   2258 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2259 assert(hdr.magic == 1)
   2260 assert(hdr.index == 3)
   2261 hdr = p.hdrs[1]
   2262 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   2263 assert(hdr.magic == 1)
   2264 assert(hdr.index in [4, 5])
   2265 assert(hdr.hdr_name is None)
   2266 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2267 assert(hdr.hdr_value.data == 'HPackZString(/login.php)')
   2268 hdr = p.hdrs[2]
   2269 assert(isinstance(hdr, h2.HPackIndexedHdr))
   2270 assert(hdr.magic == 1)
   2271 assert(hdr.index == 7)
   2272 hdr = p.hdrs[3]
   2273 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   2274 assert(hdr.magic == 1)
   2275 assert(hdr.index == 31)
   2276 assert(hdr.hdr_name is None)
   2277 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2278 assert(hdr.hdr_value.data == 'HPackZString(application/x-www-form-urlencoded)')
   2279 hdr = p.hdrs[4]
   2280 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   2281 assert(hdr.magic == 1)
   2282 assert(hdr.index == 28)
   2283 assert(hdr.hdr_name is None)
   2284 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2285 assert(hdr.hdr_value.data == 'HPackLiteralString(22)')
   2286 hdr = p.hdrs[5]
   2287 assert(isinstance(hdr, h2.HPackLitHdrFldWithIncrIndexing))
   2288 assert(hdr.magic == 1)
   2289 assert(hdr.index == 58)
   2290 assert(hdr.hdr_name is None)
   2291 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2292 assert(hdr.hdr_value.data == 'HPackZString(Mozilla/5.0 Generated by hand)')
   2293 hdr = p.hdrs[6]
   2294 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2295 assert(hdr.magic == 0)
   2296 assert(hdr.never_index == 0)
   2297 assert(hdr.index == 0)
   2298 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2299 assert(hdr.hdr_name.data == 'HPackZString(x-generated-by)')
   2300 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2301 assert(hdr.hdr_value.data == 'HPackLiteralString(Me)')
   2302 hdr = p.hdrs[7]
   2303 assert(isinstance(hdr, h2.HPackLitHdrFldWithoutIndexing))
   2304 assert(hdr.magic == 0)
   2305 assert(hdr.never_index == 1)
   2306 assert(hdr.index == 0)
   2307 assert(isinstance(hdr.hdr_name, h2.HPackHdrString))
   2308 assert(hdr.hdr_name.data == 'HPackZString(x-generation-date)')
   2309 assert(isinstance(hdr.hdr_value, h2.HPackHdrString))
   2310 assert(hdr.hdr_value.data == 'HPackZString(2016-08-11)')
   2311 p = seq.frames[1]
   2312 assert(isinstance(p, h2.H2Frame))
   2313 assert(p.type == 0)
   2314 assert(len(p.flags) == 1)
   2315 assert('ES' in p.flags)
   2316 assert(p.stream_id == 1)
   2317 assert(isinstance(p.payload, h2.H2DataFrame))
   2318 pay = p[h2.H2DataFrame]
   2319 assert(pay.data == body)
   2320