# HG changeset patch # User Sergey Kandaurov # Date 1606180980 0 # Node ID 5b3d33b5556ca375d731d4d2adad547d5b6ea0d1 # Parent fd440d32470046bc2ab6e214198fbae4f3d3c937 Tests: converted HTTP2 raw_read() and raw_write() to class methods. diff --git a/grpc.t b/grpc.t --- a/grpc.t +++ b/grpc.t @@ -747,7 +747,7 @@ sub grpc { $trailers .= $rst if $uri eq '/Discard_NE'; $trailers .= ($rst x 3) if $uri eq '/Discard_NE3'; $trailers .= $cnl if $uri eq '/Discard_CNL'; - Test::Nginx::HTTP2::raw_write($client, $trailers); + $c->raw_write($trailers); return $s->read(all => [{ fin => 1 }], wait => 2) if $uri eq '/Discard_WU' || $uri eq '/Discard_NE'; diff --git a/lib/Test/Nginx/HTTP2.pm b/lib/Test/Nginx/HTTP2.pm --- a/lib/Test/Nginx/HTTP2.pm +++ b/lib/Test/Nginx/HTTP2.pm @@ -39,14 +39,6 @@ sub new { my $preface = defined $extra{preface} ? $extra{preface} : 'PRI * HTTP/2.0' . CRLF . CRLF . 'SM' . CRLF . CRLF; - if ($extra{proxy}) { - raw_write($s, $extra{proxy}); - } - - # preface - - raw_write($s, $preface); - my $self = bless { socket => $s, last_stream => -1, dynamic_encode => [ static_table() ], @@ -55,6 +47,14 @@ sub new { iws => 65535, conn_window => 65535, streams => {} }, $class; + if ($extra{proxy}) { + $self->raw_write($extra{proxy}); + } + + # preface + + $self->raw_write($preface); + return $self if $extra{pure}; # update windows, if any @@ -76,13 +76,13 @@ sub new { sub h2_ping { my ($self, $payload) = @_; - raw_write($self->{socket}, pack("x2C2x5a8", 8, 0x6, $payload)); + $self->raw_write(pack("x2C2x5a8", 8, 0x6, $payload)); } sub h2_rst { my ($self, $stream, $error) = @_; - raw_write($self->{socket}, pack("x2C2xNN", 4, 0x3, $stream, $error)); + $self->raw_write(pack("x2C2xNN", 4, 0x3, $stream, $error)); } sub h2_goaway { @@ -92,11 +92,11 @@ sub h2_goaway { my $buf = pack("x2C2xN3A*", $len, 0x7, $stream, $lstream, $err, $debug); my @bufs = map { - raw_write($self->{socket}, substr $buf, 0, $_, ""); + $self->raw_write(substr $buf, 0, $_, ""); select undef, undef, undef, 0.2; } @{$extra{split}}; - raw_write($self->{socket}, $buf); + $self->raw_write($buf); } sub h2_priority { @@ -105,14 +105,14 @@ sub h2_priority { $stream = 0 unless defined $stream; $dep = 0 unless defined $dep; $dep |= $extra{excl} << 31 if exists $extra{excl}; - raw_write($self->{socket}, pack("x2C2xNNC", 5, 0x2, $stream, $dep, $w)); + $self->raw_write(pack("x2C2xNNC", 5, 0x2, $stream, $dep, $w)); } sub h2_window { my ($self, $win, $stream) = @_; $stream = 0 unless defined $stream; - raw_write($self->{socket}, pack("x2C2xNN", 4, 0x8, $stream, $win)); + $self->raw_write(pack("x2C2xNN", 4, 0x8, $stream, $win)); } sub h2_settings { @@ -121,14 +121,14 @@ sub h2_settings { my $len = 6 * @pairs / 2; my $buf = pack_length($len) . pack "CCx4", 0x4, $ack ? 0x1 : 0x0; $buf .= pack "nN", splice @pairs, 0, 2 while @pairs; - raw_write($self->{socket}, $buf); + $self->raw_write($buf); } sub h2_unknown { my ($self, $payload) = @_; my $buf = pack_length(length($payload)) . pack("Cx5a*", 0xa, $payload); - raw_write($self->{socket}, $buf); + $self->raw_write($buf); } sub h2_continue { @@ -167,12 +167,12 @@ sub h2_body { $split = ref $extra->{split} && $extra->{split} || []; for (@$split) { - raw_write($self->{socket}, substr($buf, 0, $_, "")); + $self->raw_write(substr($buf, 0, $_, "")); return if $extra->{abort}; select undef, undef, undef, ($extra->{split_delay} || 0.2); } - raw_write($self->{socket}, $buf); + $self->raw_write($buf); } sub new_stream { @@ -268,12 +268,12 @@ sub new_stream { $split = ref $uri->{split} && $uri->{split} || []; for (@$split) { - raw_write($self->{socket}, substr($buf, 0, $_, "")); + $self->raw_write(substr($buf, 0, $_, "")); goto done if $uri->{abort}; select undef, undef, undef, ($uri->{split_delay} || 0.2); } - raw_write($self->{socket}, $buf); + $self->raw_write($buf); done: return $self->{last_stream}; } @@ -288,7 +288,7 @@ sub read { local $Data::Dumper::Terse = 1; while (1) { - $buf = raw_read($s, $buf, 9, $wait); + $buf = $self->raw_read($buf, 9, $wait); last if length $buf < 9; my $length = unpack_length($buf); @@ -299,7 +299,7 @@ sub read { substr($stream, 0, 1) = 0; $stream = unpack("N", pack("B32", $stream)); - $buf = raw_read($s, $buf, $length + 9, $wait); + $buf = $self->raw_read($buf, $length + 9, $wait); last if length($buf) < $length + 9; $buf = substr($buf, 9); @@ -321,6 +321,35 @@ sub read { return \@got; } +sub raw_read { + my ($self, $buf, $len, $timo) = @_; + $timo = 8 unless $timo; + my $got = ''; + my $s = $self->{socket}; + + while (length($buf) < $len && IO::Select->new($s)->can_read($timo)) { + $s->sysread($got, 16384) or last; + log_in($got); + $buf .= $got; + } + return $buf; +} + +sub raw_write { + my ($self, $message) = @_; + my $s = $self->{socket}; + + local $SIG{PIPE} = 'IGNORE'; + + while (IO::Select->new($s)->can_write(0.4)) { + log_out($message); + my $n = $s->syswrite($message); + last unless $n; + $message = substr($message, $n); + last unless length $message; + } +} + ############################################################################### sub pack_body { @@ -463,33 +492,6 @@ sub unpack_length { unpack 'N', pack 'xc3', unpack 'c3', $_[0]; } -sub raw_read { - my ($s, $buf, $len, $timo) = @_; - $timo = 8 unless $timo; - my $got = ''; - - while (length($buf) < $len && IO::Select->new($s)->can_read($timo)) { - $s->sysread($got, 16384) or last; - log_in($got); - $buf .= $got; - } - return $buf; -} - -sub raw_write { - my ($s, $message) = @_; - - local $SIG{PIPE} = 'IGNORE'; - - while (IO::Select->new($s)->can_write(0.4)) { - log_out($message); - my $n = $s->syswrite($message); - last unless $n; - $message = substr($message, $n); - last unless length $message; - } -} - sub new_socket { my ($port, %extra) = @_; my $npn = $extra{'npn'};