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