changeset 1623:3fe652bc9dae

Tests: introduced HTTP/2 frames buffering option in HTTP2 package.
author Sergey Kandaurov <pluknet@nginx.com>
date Tue, 24 Nov 2020 01:23:01 +0000
parents 5b3d33b5556c
children 81fd6615358e
files grpc.t lib/Test/Nginx/HTTP2.pm
diffstat 2 files changed, 39 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/grpc.t
+++ b/grpc.t
@@ -737,17 +737,16 @@ sub grpc {
 
 		# stick trailers and subsequent frames for reproducibility
 
-		my $fld = $c->hpack('grpc-status', '0', mode => 2);
-		my $trailers = pack("x2CCCN", length($fld), 1, 5, $sid) . $fld;
-		my $window = pack("xxCCCNN", 4, 8, 0, $sid, 42);
-		my $rst = pack("x2C2xNN", 4, 3, $sid, 0);
-		my $cnl = pack("x2C2xNN", 4, 3, $sid, 8);
-
-		$trailers .= $window if $uri eq '/Discard_WU';
-		$trailers .= $rst if $uri eq '/Discard_NE';
-		$trailers .= ($rst x 3) if $uri eq '/Discard_NE3';
-		$trailers .= $cnl if $uri eq '/Discard_CNL';
-		$c->raw_write($trailers);
+		$c->start_chain();
+		$c->new_stream({ headers => [
+			{ name => 'grpc-status', value => '0', mode => 2 }
+		]}, $sid);
+		$c->h2_window(42, $sid) if $uri eq '/Discard_WU';
+		$c->h2_rst($sid, 0) if $uri eq '/Discard_NE';
+		$c->h2_rst($sid, 0), $c->h2_rst($sid, 0), $c->h2_rst($sid, 0)
+			if $uri eq '/Discard_NE3';
+		$c->h2_rst($sid, 8) if $uri eq '/Discard_CNL';
+		$c->send_chain();
 
 		return $s->read(all => [{ fin => 1 }], wait => 2)
 			if $uri eq '/Discard_WU' || $uri eq '/Discard_NE';
--- a/lib/Test/Nginx/HTTP2.pm
+++ b/lib/Test/Nginx/HTTP2.pm
@@ -337,6 +337,11 @@ sub raw_read {
 
 sub raw_write {
 	my ($self, $message) = @_;
+
+	if ($self->{chaining}) {
+		return add_chain($self, $message);
+	}
+
 	my $s = $self->{socket};
 
 	local $SIG{PIPE} = 'IGNORE';
@@ -350,6 +355,30 @@ sub raw_write {
 	}
 }
 
+sub start_chain {
+	my ($self) = @_;
+
+	$self->{chaining} = 1;
+}
+
+sub add_chain {
+	my ($self, $buf) = @_;
+
+	if ($self->{chained_buf}) {
+		$self->{chained_buf} .= $buf;
+	} else {
+		$self->{chained_buf} = $buf;
+	}
+}
+
+sub send_chain {
+	my ($self) = @_;
+
+	undef $self->{chaining};
+	$self->raw_write($self->{chained_buf}) if $self->{chained_buf};
+	undef $self->{chained_buf};
+}
+
 ###############################################################################
 
 sub pack_body {