comparison h2.t @ 653:5ad620022234

Tests: HTTP/2 tests adapted to send ':authority' where needed. This follows HTTP/1.1 semantics and is expected in the latest HTTP/2 patch.
author Sergey Kandaurov <pluknet@nginx.com>
date Wed, 19 Aug 2015 23:51:40 +0300
parents 5a85ad9382a3
children a64fe1054fb4
comparison
equal deleted inserted replaced
652:5a85ad9382a3 653:5ad620022234
30 eval { IO::Socket::SSL::SSL_VERIFY_NONE(); }; 30 eval { IO::Socket::SSL::SSL_VERIFY_NONE(); };
31 plan(skip_all => 'IO::Socket::SSL too old') if $@; 31 plan(skip_all => 'IO::Socket::SSL too old') if $@;
32 32
33 my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 proxy cache/) 33 my $t = Test::Nginx->new()->has(qw/http http_ssl http_v2 proxy cache/)
34 ->has(qw/limit_conn rewrite realip shmem/) 34 ->has(qw/limit_conn rewrite realip shmem/)
35 ->has_daemon('openssl')->plan(148); 35 ->has_daemon('openssl')->plan(147);
36 36
37 $t->write_file_expand('nginx.conf', <<'EOF'); 37 $t->write_file_expand('nginx.conf', <<'EOF');
38 38
39 %%TEST_GLOBALS%% 39 %%TEST_GLOBALS%%
40 40
271 # 6.1. Indexed Header Field Representation 271 # 6.1. Indexed Header Field Representation
272 272
273 $sid = new_stream($sess, { headers => [ 273 $sid = new_stream($sess, { headers => [
274 { name => ':method', value => 'GET', mode => 0 }, 274 { name => ':method', value => 'GET', mode => 0 },
275 { name => ':scheme', value => 'http', mode => 0 }, 275 { name => ':scheme', value => 'http', mode => 0 },
276 { name => ':path', value => '/', mode => 0 }]}); 276 { name => ':path', value => '/', mode => 0 },
277 { name => ':authority', value => 'localhost', mode => 1 }]});
277 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 278 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
278 279
279 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 280 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
280 is($frame->{headers}->{':status'}, 200, 'indexed header field'); 281 is($frame->{headers}->{':status'}, 200, 'indexed header field');
281 282
282 # 6.2.1. Literal Header Field with Incremental Indexing 283 # 6.2.1. Literal Header Field with Incremental Indexing
283 284
284 $sid = new_stream($sess, { headers => [ 285 $sid = new_stream($sess, { headers => [
285 { name => ':method', value => 'GET', mode => 1, huff => 0 }, 286 { name => ':method', value => 'GET', mode => 1, huff => 0 },
286 { name => ':scheme', value => 'http', mode => 1, huff => 0 }, 287 { name => ':scheme', value => 'http', mode => 1, huff => 0 },
287 { name => ':path', value => '/', mode => 1, huff => 0 }]}); 288 { name => ':path', value => '/', mode => 1, huff => 0 },
289 { name => ':authority', value => 'localhost', mode => 1, huff => 0 }]});
288 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 290 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
289 291
290 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 292 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
291 is($frame->{headers}->{':status'}, 200, 'literal with indexing'); 293 is($frame->{headers}->{':status'}, 200, 'literal with indexing');
292 294
293 $sid = new_stream($sess, { headers => [ 295 $sid = new_stream($sess, { headers => [
294 { name => ':method', value => 'GET', mode => 1, huff => 1 }, 296 { name => ':method', value => 'GET', mode => 1, huff => 1 },
295 { name => ':scheme', value => 'http', mode => 1, huff => 1 }, 297 { name => ':scheme', value => 'http', mode => 1, huff => 1 },
296 { name => ':path', value => '/', mode => 1, huff => 1 }]}); 298 { name => ':path', value => '/', mode => 1, huff => 1 },
299 { name => ':authority', value => 'localhost', mode => 1, huff => 1 }]});
297 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 300 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
298 301
299 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 302 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
300 is($frame->{headers}->{':status'}, 200, 'literal with indexing - huffman'); 303 is($frame->{headers}->{':status'}, 200, 'literal with indexing - huffman');
301 304
302 # 6.2.1. Literal Header Field with Incremental Indexing -- New Name 305 # 6.2.1. Literal Header Field with Incremental Indexing -- New Name
303 306
304 $sid = new_stream($sess, { headers => [ 307 $sid = new_stream($sess, { headers => [
305 { name => ':method', value => 'GET', mode => 2, huff => 0 }, 308 { name => ':method', value => 'GET', mode => 2, huff => 0 },
306 { name => ':scheme', value => 'http', mode => 2, huff => 0 }, 309 { name => ':scheme', value => 'http', mode => 2, huff => 0 },
307 { name => ':path', value => '/', mode => 2, huff => 0 }]}); 310 { name => ':path', value => '/', mode => 2, huff => 0 },
311 { name => ':authority', value => 'localhost', mode => 2, huff => 0 }]});
308 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 312 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
309 313
310 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 314 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
311 is($frame->{headers}->{':status'}, 200, 'literal with indexing - new'); 315 is($frame->{headers}->{':status'}, 200, 'literal with indexing - new');
312 316
313 $sid = new_stream($sess, { headers => [ 317 $sid = new_stream($sess, { headers => [
314 { name => ':method', value => 'GET', mode => 2, huff => 1 }, 318 { name => ':method', value => 'GET', mode => 2, huff => 1 },
315 { name => ':scheme', value => 'http', mode => 2, huff => 1 }, 319 { name => ':scheme', value => 'http', mode => 2, huff => 1 },
316 { name => ':path', value => '/', mode => 2, huff => 1 }]}); 320 { name => ':path', value => '/', mode => 2, huff => 1 },
321 { name => ':authority', value => 'localhost', mode => 2, huff => 1 }]});
317 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 322 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
318 323
319 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 324 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
320 is($frame->{headers}->{':status'}, 200, 'literal with indexing - new huffman'); 325 is($frame->{headers}->{':status'}, 200, 'literal with indexing - new huffman');
321 326
322 # 6.2.2. Literal Header Field without Indexing 327 # 6.2.2. Literal Header Field without Indexing
323 328
324 $sid = new_stream($sess, { headers => [ 329 $sid = new_stream($sess, { headers => [
325 { name => ':method', value => 'GET', mode => 3, huff => 0 }, 330 { name => ':method', value => 'GET', mode => 3, huff => 0 },
326 { name => ':scheme', value => 'http', mode => 3, huff => 0 }, 331 { name => ':scheme', value => 'http', mode => 3, huff => 0 },
327 { name => ':path', value => '/', mode => 3, huff => 0 }]}); 332 { name => ':path', value => '/', mode => 3, huff => 0 },
333 { name => ':authority', value => 'localhost', mode => 3, huff => 0 }]});
328 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 334 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
329 335
330 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 336 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
331 is($frame->{headers}->{':status'}, 200, 'literal without indexing'); 337 is($frame->{headers}->{':status'}, 200, 'literal without indexing');
332 338
333 $sid = new_stream($sess, { headers => [ 339 $sid = new_stream($sess, { headers => [
334 { name => ':method', value => 'GET', mode => 3, huff => 1 }, 340 { name => ':method', value => 'GET', mode => 3, huff => 1 },
335 { name => ':scheme', value => 'http', mode => 3, huff => 1 }, 341 { name => ':scheme', value => 'http', mode => 3, huff => 1 },
336 { name => ':path', value => '/', mode => 3, huff => 1 }]}); 342 { name => ':path', value => '/', mode => 3, huff => 1 },
343 { name => ':authority', value => 'localhost', mode => 3, huff => 1 }]});
337 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 344 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
338 345
339 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 346 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
340 is($frame->{headers}->{':status'}, 200, 'literal without indexing - huffman'); 347 is($frame->{headers}->{':status'}, 200, 'literal without indexing - huffman');
341 348
342 # 6.2.2. Literal Header Field without Indexing -- New Name 349 # 6.2.2. Literal Header Field without Indexing -- New Name
343 350
344 $sid = new_stream($sess, { headers => [ 351 $sid = new_stream($sess, { headers => [
345 { name => ':method', value => 'GET', mode => 4, huff => 0 }, 352 { name => ':method', value => 'GET', mode => 4, huff => 0 },
346 { name => ':scheme', value => 'http', mode => 4, huff => 0 }, 353 { name => ':scheme', value => 'http', mode => 4, huff => 0 },
347 { name => ':path', value => '/', mode => 4, huff => 0 }]}); 354 { name => ':path', value => '/', mode => 4, huff => 0 },
355 { name => ':authority', value => 'localhost', mode => 4, huff => 0 }]});
348 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 356 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
349 357
350 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 358 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
351 is($frame->{headers}->{':status'}, 200, 'literal without indexing - new'); 359 is($frame->{headers}->{':status'}, 200, 'literal without indexing - new');
352 360
353 $sid = new_stream($sess, { headers => [ 361 $sid = new_stream($sess, { headers => [
354 { name => ':method', value => 'GET', mode => 4, huff => 1 }, 362 { name => ':method', value => 'GET', mode => 4, huff => 1 },
355 { name => ':scheme', value => 'http', mode => 4, huff => 1 }, 363 { name => ':scheme', value => 'http', mode => 4, huff => 1 },
356 { name => ':path', value => '/', mode => 4, huff => 1 }]}); 364 { name => ':path', value => '/', mode => 4, huff => 1 },
365 { name => ':authority', value => 'localhost', mode => 4, huff => 1 }]});
357 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 366 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
358 367
359 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 368 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
360 is($frame->{headers}->{':status'}, 200, 'literal without indexing - new huffman'); 369 is($frame->{headers}->{':status'}, 200, 'literal without indexing - new huffman');
361 370
362 # 6.2.3. Literal Header Field Never Indexed 371 # 6.2.3. Literal Header Field Never Indexed
363 372
364 $sid = new_stream($sess, { headers => [ 373 $sid = new_stream($sess, { headers => [
365 { name => ':method', value => 'GET', mode => 5, huff => 0 }, 374 { name => ':method', value => 'GET', mode => 5, huff => 0 },
366 { name => ':scheme', value => 'http', mode => 5, huff => 0 }, 375 { name => ':scheme', value => 'http', mode => 5, huff => 0 },
367 { name => ':path', value => '/', mode => 5, huff => 0 }]}); 376 { name => ':path', value => '/', mode => 5, huff => 0 },
377 { name => ':authority', value => 'localhost', mode => 5, huff => 0 }]});
368 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 378 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
369 379
370 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 380 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
371 is($frame->{headers}->{':status'}, 200, 'literal never indexed'); 381 is($frame->{headers}->{':status'}, 200, 'literal never indexed');
372 382
373 $sid = new_stream($sess, { headers => [ 383 $sid = new_stream($sess, { headers => [
374 { name => ':method', value => 'GET', mode => 5, huff => 1 }, 384 { name => ':method', value => 'GET', mode => 5, huff => 1 },
375 { name => ':scheme', value => 'http', mode => 5, huff => 1 }, 385 { name => ':scheme', value => 'http', mode => 5, huff => 1 },
376 { name => ':path', value => '/', mode => 5, huff => 1 }]}); 386 { name => ':path', value => '/', mode => 5, huff => 1 },
387 { name => ':authority', value => 'localhost', mode => 5, huff => 1 }]});
377 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 388 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
378 389
379 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 390 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
380 is($frame->{headers}->{':status'}, 200, 'literal never indexed - huffman'); 391 is($frame->{headers}->{':status'}, 200, 'literal never indexed - huffman');
381 392
382 # 6.2.2. Literal Header Field Never Indexed -- New Name 393 # 6.2.2. Literal Header Field Never Indexed -- New Name
383 394
384 $sid = new_stream($sess, { headers => [ 395 $sid = new_stream($sess, { headers => [
385 { name => ':method', value => 'GET', mode => 6, huff => 0 }, 396 { name => ':method', value => 'GET', mode => 6, huff => 0 },
386 { name => ':scheme', value => 'http', mode => 6, huff => 0 }, 397 { name => ':scheme', value => 'http', mode => 6, huff => 0 },
387 { name => ':path', value => '/', mode => 6, huff => 0 }]}); 398 { name => ':path', value => '/', mode => 6, huff => 0 },
399 { name => ':authority', value => 'localhost', mode => 6, huff => 0 }]});
388 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 400 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
389 401
390 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 402 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
391 is($frame->{headers}->{':status'}, 200, 'literal never indexed - new'); 403 is($frame->{headers}->{':status'}, 200, 'literal never indexed - new');
392 404
393 $sid = new_stream($sess, { headers => [ 405 $sid = new_stream($sess, { headers => [
394 { name => ':method', value => 'GET', mode => 6, huff => 1 }, 406 { name => ':method', value => 'GET', mode => 6, huff => 1 },
395 { name => ':scheme', value => 'http', mode => 6, huff => 1 }, 407 { name => ':scheme', value => 'http', mode => 6, huff => 1 },
396 { name => ':path', value => '/', mode => 6, huff => 1 }]}); 408 { name => ':path', value => '/', mode => 6, huff => 1 },
409 { name => ':authority', value => 'localhost', mode => 6, huff => 1 }]});
397 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 410 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
398 411
399 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 412 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
400 is($frame->{headers}->{':status'}, 200, 'literal never indexed - new huffman'); 413 is($frame->{headers}->{':status'}, 200, 'literal never indexed - new huffman');
401 414
404 $sess = new_session(); 417 $sess = new_session();
405 $sid = new_stream($sess, { headers => [ 418 $sid = new_stream($sess, { headers => [
406 { name => ':method', value => 'GET', mode => 0 }, 419 { name => ':method', value => 'GET', mode => 0 },
407 { name => ':scheme', value => 'http', mode => 0 }, 420 { name => ':scheme', value => 'http', mode => 0 },
408 { name => ':path', value => '/', mode => 0 }, 421 { name => ':path', value => '/', mode => 0 },
422 { name => ':authority', value => 'localhost', mode => 1 },
409 { name => 'referer', value => 'foo', mode => 1 }]}); 423 { name => 'referer', value => 'foo', mode => 1 }]});
410 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 424 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
411 425
412 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 426 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
413 is($frame->{headers}->{'x-referer'}, 'foo', 'value with indexing - new'); 427 is($frame->{headers}->{'x-referer'}, 'foo', 'value with indexing - new');
414 428
415 $sid = new_stream($sess, { headers => [ 429 $sid = new_stream($sess, { headers => [
416 { name => ':method', value => 'GET', mode => 0 }, 430 { name => ':method', value => 'GET', mode => 0 },
417 { name => ':scheme', value => 'http', mode => 0 }, 431 { name => ':scheme', value => 'http', mode => 0 },
418 { name => ':path', value => '/', mode => 0 }, 432 { name => ':path', value => '/', mode => 0 },
433 { name => ':authority', value => 'localhost', mode => 0 },
419 { name => 'referer', value => 'foo', mode => 0 }]}); 434 { name => 'referer', value => 'foo', mode => 0 }]});
420 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 435 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
421 436
422 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 437 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
423 is($frame->{headers}->{'x-referer'}, 'foo', 'value with indexing - indexed'); 438 is($frame->{headers}->{'x-referer'}, 'foo', 'value with indexing - indexed');
424 439
425 $sid = new_stream($sess, { headers => [ 440 $sid = new_stream($sess, { headers => [
426 { name => ':method', value => 'GET', mode => 0 }, 441 { name => ':method', value => 'GET', mode => 0 },
427 { name => ':scheme', value => 'http', mode => 0 }, 442 { name => ':scheme', value => 'http', mode => 0 },
428 { name => ':path', value => '/', mode => 0 }, 443 { name => ':path', value => '/', mode => 0 },
444 { name => ':authority', value => 'localhost', mode => 0 },
429 { name => 'x-foo', value => 'X-Bar', mode => 2 }]}); 445 { name => 'x-foo', value => 'X-Bar', mode => 2 }]});
430 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 446 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
431 447
432 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 448 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
433 is($frame->{headers}->{'x-sent-foo'}, 'X-Bar', 'name with indexing - new'); 449 is($frame->{headers}->{'x-sent-foo'}, 'X-Bar', 'name with indexing - new');
436 452
437 $sid = new_stream($sess, { headers => [ 453 $sid = new_stream($sess, { headers => [
438 { name => ':method', value => 'GET', mode => 0 }, 454 { name => ':method', value => 'GET', mode => 0 },
439 { name => ':scheme', value => 'http', mode => 0 }, 455 { name => ':scheme', value => 'http', mode => 0 },
440 { name => ':path', value => '/', mode => 0 }, 456 { name => ':path', value => '/', mode => 0 },
457 { name => ':authority', value => 'localhost', mode => 0 },
441 { name => 'x-foo', value => 'X-Bar', mode => 0 }]}); 458 { name => 'x-foo', value => 'X-Bar', mode => 0 }]});
442 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 459 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
443 460
444 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 461 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
445 is($frame->{headers}->{'x-sent-foo'}, 'X-Bar', 'name with indexing - indexed'); 462 is($frame->{headers}->{'x-sent-foo'}, 'X-Bar', 'name with indexing - indexed');
446 463
447 # reuse literal with indexing - reused value with moved index
448
449 $sid = new_stream($sess, { headers => [
450 { name => ':method', value => 'GET', mode => 0 },
451 { name => ':scheme', value => 'http', mode => 0 },
452 { name => ':path', value => '/', mode => 0 },
453 { name => 'referer', value => 'foo', mode => 0 }]});
454 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
455
456 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
457 is($frame->{headers}->{'x-referer'}, 'foo', 'moved index in dynamic table');
458
459 # 6.3. Dynamic Table Size Update 464 # 6.3. Dynamic Table Size Update
460 465
461 # remove one of two indexed headers from the dynamic table 466 # remove some indexed headers from the dynamic table
467 # by maintaining dynamic table space only for index 0
462 # 'x-foo' has index 0, and 'referer' has index 1 468 # 'x-foo' has index 0, and 'referer' has index 1
463 469
464 $sid = new_stream($sess, { table_size => 61, headers => [ 470 $sid = new_stream($sess, { table_size => 61, headers => [
465 { name => ':method', value => 'GET', mode => 0 }, 471 { name => ':method', value => 'GET', mode => 0 },
466 { name => ':scheme', value => 'http', mode => 0 }, 472 { name => ':scheme', value => 'http', mode => 0 },
467 { name => ':path', value => '/', mode => 0 }, 473 { name => ':path', value => '/', mode => 0 },
468 { name => 'x-foo', value => 'X-Bar', mode => 0 }]}); 474 { name => 'x-foo', value => 'X-Bar', mode => 0 },
475 { name => ':authority', value => 'localhost', mode => 1 }]});
469 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 476 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
470 477
471 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 478 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
472 isnt($frame, undef, 'updated table size - remaining index'); 479 isnt($frame, undef, 'updated table size - remaining index');
473 480
474 $sid = new_stream($sess, { headers => [ 481 $sid = new_stream($sess, { headers => [
475 { name => ':method', value => 'GET', mode => 0 }, 482 { name => ':method', value => 'GET', mode => 0 },
476 { name => ':scheme', value => 'http', mode => 0 }, 483 { name => ':scheme', value => 'http', mode => 0 },
477 { name => ':path', value => '/', mode => 0 }, 484 { name => ':path', value => '/', mode => 0 },
485 { name => ':authority', value => 'localhost', mode => 1 },
478 { name => 'referer', value => 'foo', mode => 0 }]}); 486 { name => 'referer', value => 'foo', mode => 0 }]});
479 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 487 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
480 488
481 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 489 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
482 is($frame, undef, 'updated table size - invalid index'); 490 is($frame, undef, 'updated table size - invalid index');
523 $sess = new_session(); 531 $sess = new_session();
524 $sid = new_stream($sess, { headers => [ 532 $sid = new_stream($sess, { headers => [
525 { name => ':method', value => 'GET', mode => 0 }, 533 { name => ':method', value => 'GET', mode => 0 },
526 { name => ':scheme', value => 'http', mode => 0 }, 534 { name => ':scheme', value => 'http', mode => 0 },
527 { name => ':path', value => '/t1.html', mode => 1 }, 535 { name => ':path', value => '/t1.html', mode => 1 },
536 { name => ':authority', value => 'localhost', mode => 1 },
528 { name => 'range', value => 'bytes=10-19', mode => 1 }]}); 537 { name => 'range', value => 'bytes=10-19', mode => 1 }]});
529 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 538 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
530 539
531 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 540 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
532 is($frame->{headers}->{':status'}, 206, 'range - HEADERS status'); 541 is($frame->{headers}->{':status'}, 206, 'range - HEADERS status');
589 598
590 $sess = new_session(); 599 $sess = new_session();
591 $sid = new_stream($sess, { continuation => 1, headers => [ 600 $sid = new_stream($sess, { continuation => 1, headers => [
592 { name => ':method', value => 'HEAD', mode => 1 }, 601 { name => ':method', value => 'HEAD', mode => 1 },
593 { name => ':scheme', value => 'http', mode => 0 }, 602 { name => ':scheme', value => 'http', mode => 0 },
594 { name => ':path', value => '/', mode => 0 }]}); 603 { name => ':path', value => '/', mode => 0 },
604 { name => ':authority', value => 'localhost', mode => 1 }]});
595 h2_continue($sess, $sid, { continuation => 1, headers => [ 605 h2_continue($sess, $sid, { continuation => 1, headers => [
596 { name => 'x-foo', value => 'X-Bar', mode => 2 }]}); 606 { name => 'x-foo', value => 'X-Bar', mode => 2 }]});
597 h2_continue($sess, $sid, { headers => [ 607 h2_continue($sess, $sid, { headers => [
598 { name => 'referer', value => 'foo', mode => 2 }]}); 608 { name => 'referer', value => 'foo', mode => 2 }]});
599 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 609 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
609 619
610 $sess = new_session(); 620 $sess = new_session();
611 $sid = new_stream($sess, { padding => 42, headers => [ 621 $sid = new_stream($sess, { padding => 42, headers => [
612 { name => ':method', value => 'GET', mode => 0 }, 622 { name => ':method', value => 'GET', mode => 0 },
613 { name => ':scheme', value => 'http', mode => 0 }, 623 { name => ':scheme', value => 'http', mode => 0 },
614 { name => ':path', value => '/', mode => 0 }]}); 624 { name => ':path', value => '/', mode => 0 },
625 { name => ':authority', value => 'localhost', mode => 1 }]});
615 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 626 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
616 627
617 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 628 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
618 is($frame->{headers}->{':status'}, 200, 'padding - HEADERS status'); 629 is($frame->{headers}->{':status'}, 200, 'padding - HEADERS status');
619 630
620 $sid = new_stream($sess, { headers => [ 631 $sid = new_stream($sess, { headers => [
621 { name => ':method', value => 'GET', mode => 0 }, 632 { name => ':method', value => 'GET', mode => 0 },
622 { name => ':scheme', value => 'http', mode => 0 }, 633 { name => ':scheme', value => 'http', mode => 0 },
623 { name => ':path', value => '/', mode => 0 }]}); 634 { name => ':path', value => '/', mode => 0 },
635 { name => ':authority', value => 'localhost', mode => 1 }]});
624 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 636 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
625 637
626 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 638 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
627 is($frame->{headers}->{':status'}, 200, 'padding - next stream'); 639 is($frame->{headers}->{':status'}, 200, 'padding - next stream');
628 640
635 $sess = new_session(); 647 $sess = new_session();
636 $sid = new_stream($sess, { headers => [ 648 $sid = new_stream($sess, { headers => [
637 { name => ':method', value => 'GET', mode => 0 }, 649 { name => ':method', value => 'GET', mode => 0 },
638 { name => ':scheme', value => 'http', mode => 0 }, 650 { name => ':scheme', value => 'http', mode => 0 },
639 { name => ':path', value => '/cookie', mode => 2 }, 651 { name => ':path', value => '/cookie', mode => 2 },
652 { name => ':authority', value => 'localhost', mode => 1 },
640 { name => 'cookie', value => 'a=b', mode => 2}, 653 { name => 'cookie', value => 'a=b', mode => 2},
641 { name => 'cookie', value => 'c=d', mode => 2}]}); 654 { name => 'cookie', value => 'c=d', mode => 2}]});
642 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 655 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
643 656
644 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 657 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
660 $sess = new_session(); 673 $sess = new_session();
661 $sid = new_stream($sess, { headers => [ 674 $sid = new_stream($sess, { headers => [
662 { name => ':method', value => 'GET', mode => 0 }, 675 { name => ':method', value => 'GET', mode => 0 },
663 { name => ':scheme', value => 'http', mode => 0 }, 676 { name => ':scheme', value => 'http', mode => 0 },
664 { name => ':path', value => '/proxy/cookie', mode => 2 }, 677 { name => ':path', value => '/proxy/cookie', mode => 2 },
678 { name => ':authority', value => 'localhost', mode => 1 },
665 { name => 'cookie', value => 'a=b', mode => 2 }, 679 { name => 'cookie', value => 'a=b', mode => 2 },
666 { name => 'cookie', value => 'c=d', mode => 2 }]}); 680 { name => 'cookie', value => 'c=d', mode => 2 }]});
667 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 681 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
668 682
669 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 683 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
836 $sess = new_session(); 850 $sess = new_session();
837 $sid = new_stream($sess, { headers => [ 851 $sid = new_stream($sess, { headers => [
838 { name => ':method', value => 'GET', mode => 0 }, 852 { name => ':method', value => 'GET', mode => 0 },
839 { name => ':scheme', value => 'http', mode => 0 }, 853 { name => ':scheme', value => 'http', mode => 0 },
840 { name => ':path', value => '/gzip.html' }, 854 { name => ':path', value => '/gzip.html' },
855 { name => ':authority', value => 'localhost', mode => 1 },
841 { name => 'accept-encoding', value => 'gzip' }]}); 856 { name => 'accept-encoding', value => 'gzip' }]});
842 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 857 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
843 858
844 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 859 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
845 is($frame->{headers}->{'content-encoding'}, 'gzip', 'gzip - encoding'); 860 is($frame->{headers}->{'content-encoding'}, 'gzip', 'gzip - encoding');
864 879
865 $sid = new_stream($sess, { headers => [ 880 $sid = new_stream($sess, { headers => [
866 { name => ':method', value => 'GET', mode => 0 }, 881 { name => ':method', value => 'GET', mode => 0 },
867 { name => ':scheme', value => 'http', mode => 0 }, 882 { name => ':scheme', value => 'http', mode => 0 },
868 { name => ':path', value => '/proxy2/t2.html?2' }, 883 { name => ':path', value => '/proxy2/t2.html?2' },
884 { name => ':authority', value => 'localhost', mode => 1 },
869 { name => 'if-none-match', value => $etag }]}); 885 { name => 'if-none-match', value => $etag }]});
870 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 886 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
871 887
872 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 888 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
873 is($frame->{headers}->{':status'}, 304, 'proxy cache conditional'); 889 is($frame->{headers}->{':status'}, 304, 'proxy cache conditional');
1355 local $TODO = 'not yet'; 1371 local $TODO = 'not yet';
1356 1372
1357 $sess = new_session(); 1373 $sess = new_session();
1358 $sid = new_stream($sess, { headers => [ 1374 $sid = new_stream($sess, { headers => [
1359 { name => ':method', value => 'GET', mode => 0 }, 1375 { name => ':method', value => 'GET', mode => 0 },
1360 { name => ':path', value => '/', mode => 0 }]}); 1376 { name => ':path', value => '/', mode => 0 },
1377 { name => ':authority', value => 'localhost', mode => 1 }]});
1361 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]); 1378 $frames = h2_read($sess, all => [{ sid => $sid, fin => 1 }]);
1362 1379
1363 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames; 1380 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
1364 is($frame->{headers}->{':status'}, 400, 'incomplete headers'); 1381 is($frame->{headers}->{':status'}, 400, 'incomplete headers');
1365 1382