comparison grpc.t @ 1676:816d6ceefe50

Tests: added grpc tests with malformed headers.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 18 May 2021 13:34:53 +0300
parents 0fae67763be5
children 5ac6efbe5552
comparison
equal deleted inserted replaced
1675:0d1cec688111 1676:816d6ceefe50
22 22
23 select STDERR; $| = 1; 23 select STDERR; $| = 1;
24 select STDOUT; $| = 1; 24 select STDOUT; $| = 1;
25 25
26 my $t = Test::Nginx->new()->has(qw/http rewrite http_v2 grpc/) 26 my $t = Test::Nginx->new()->has(qw/http rewrite http_v2 grpc/)
27 ->has(qw/upstream_keepalive/)->plan(116); 27 ->has(qw/upstream_keepalive/)->plan(123);
28 28
29 $t->write_file_expand('nginx.conf', <<'EOF'); 29 $t->write_file_expand('nginx.conf', <<'EOF');
30 30
31 %%TEST_GLOBALS%% 31 %%TEST_GLOBALS%%
32 32
380 $f->{http_start}('/LongField'); 380 $f->{http_start}('/LongField');
381 $f->{data}('Hello'); 381 $f->{data}('Hello');
382 $frames = $f->{field_len}(2**15); 382 $frames = $f->{field_len}(2**15);
383 ($frame) = grep { $_->{flags} & 0x4 } @$frames; 383 ($frame) = grep { $_->{flags} & 0x4 } @$frames;
384 is($frame->{headers}{'x' x 2**15}, 'y' x 2**15, 'long header field 3'); 384 is($frame->{headers}{'x' x 2**15}, 'y' x 2**15, 'long header field 3');
385
386 # Intermediary Encapsulation Attacks, malformed header fields
387
388 $f->{http_start}('/');
389 $f->{data}('Hello');
390 $frames = $f->{field_bad}(n => 'n:n');
391 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
392 is($frame->{headers}{':status'}, 502, 'invalid header name colon');
393
394 $f->{http_start}('/');
395 $f->{data}('Hello');
396 $frames = $f->{field_bad}(n => 'NN');
397 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
398 is($frame->{headers}{':status'}, 502, 'invalid header name uppercase');
399
400 $f->{http_start}('/');
401 $f->{data}('Hello');
402 $frames = $f->{field_bad}(n => "n\nn");
403 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
404 is($frame->{headers}{':status'}, 502, 'invalid header name ctl');
405
406 $f->{http_start}('/');
407 $f->{data}('Hello');
408 $frames = $f->{field_bad}(v => "v\nv");
409 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
410 is($frame->{headers}{':status'}, 502, 'invalid header value ctl');
411
412 # invalid HPACK index
413
414 $f->{http_start}('/');
415 $f->{data}('Hello');
416 $frames = $f->{field_bad}('m' => 0);
417 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
418 is($frame->{headers}{':status'}, 502, 'invalid index - indexed header');
419
420 $f->{http_start}('/');
421 $f->{data}('Hello');
422 $frames = $f->{field_bad}('m' => 1);
423 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
424 is($frame->{headers}{':status'}, 502, 'invalid index - with indexing');
425
426 $f->{http_start}('/');
427 $f->{data}('Hello');
428 $frames = $f->{field_bad}('m' => 3);
429 ($frame) = grep { $_->{type} eq "HEADERS" } @$frames;
430 is($frame->{headers}{':status'}, 502, 'invalid index - without indexing');
385 431
386 # flow control 432 # flow control
387 433
388 $f->{http_start}('/FlowControl'); 434 $f->{http_start}('/FlowControl');
389 $frames = $f->{data_len}(('Hello' x 13000) . ('x' x 550), 65535); 435 $frames = $f->{data_len}(('Hello' x 13000) . ('x' x 550), 65535);
782 mode => 2, huff => 1 }, 828 mode => 2, huff => 1 },
783 ]}, $sid); 829 ]}, $sid);
784 830
785 return $s->read(all => [{ fin => 1 }]); 831 return $s->read(all => [{ fin => 1 }]);
786 }; 832 };
833 $f->{field_bad} = sub {
834 my (%extra) = @_;
835 my $n = defined $extra{'n'} ? $extra{'n'} : 'n';
836 my $v = defined $extra{'v'} ? $extra{'v'} : 'v';
837 my $m = defined $extra{'m'} ? $extra{'m'} : 2;
838 $c->new_stream({ headers => [
839 { name => ':status', value => '200' },
840 { name => $n, value => $v, mode => $m },
841 ]}, $sid);
842
843 return $s->read(all => [{ fin => 1 }]);
844 };
787 $f->{discard} = sub { 845 $f->{discard} = sub {
788 my (%extra) = @_; 846 my (%extra) = @_;
789 $c->new_stream({ body_more => 1, %extra, headers => [ 847 $c->new_stream({ body_more => 1, %extra, headers => [
790 { name => ':status', value => '200', 848 { name => ':status', value => '200',
791 mode => $extra{mode} || 0 }, 849 mode => $extra{mode} || 0 },