h2o/t/40chunked.t
2023-04-25 09:13:29 +09:00

65 lines
1.8 KiB
Perl

use strict;
use warnings;
use Net::EmptyPort qw(check_port);
use Test::More;
use t::Util;
plan skip_all => 'nc not found'
unless prog_exists('nc');
sub fetch {
my ($server, $path) = @_;
my $resp = `echo 'GET $path HTTP/1.1\r\n\r\n' | nc 127.0.0.1 $server->{port}`;
my ($headers, $body) = split(/^\r\n/m, $resp, 2);
return ($headers, $body);
}
subtest 'push mode' => sub {
plan skip_all => 'plackup not found'
unless prog_exists('plackup');
plan skip_all => 'Starlet not found'
unless system('perl -MStarlet /dev/null > /dev/null 2>&1') == 0;
my $upstream_port = empty_port();
my $upstream = spawn_server(
argv => [ qw(plackup -s Starlet --access-log /dev/null --listen), $upstream_port, ASSETS_DIR . "/upstream.psgi" ],
is_ready => sub { check_port($upstream_port) },
);
my $server = spawn_h2o(<< "EOT");
hosts:
default:
paths:
"/":
proxy.reverse.url: http://127.0.0.1:$upstream_port
EOT
my ($headers, $body) = fetch($server, '/streaming-body?sleep=0');
like $headers, qr/^transfer-encoding: chunked\r$/m;
my @list = split("\r\n", $body);
my $content = '';
while (scalar(@list) >= 2) {
my ($hlen, $data) = splice(@list, 0, 2);
is length($data), hex $hlen;
$content .= $data;
}
is $content, join("", (1..30));
};
subtest 'pull mode' => sub {
# server-timing forces chunked encoding in enforce mode
my $server = spawn_h2o(<< "EOT");
hosts:
default:
paths:
"/":
file.dir: @{[ DOC_ROOT ]}
server-timing: enforce
EOT
my ($headers, $body) = fetch($server, '/');
like $headers, qr/^transfer-encoding: chunked\r$/m;
my $content = "hello\n";
like $body, qr/^6\r\n$content\r\n0\r\nserver-timing: .+?\r\n\r\n$/;
pass;
};
done_testing;