mirror of
https://github.com/h2o/h2o.git
synced 2025-04-20 13:11:35 +08:00
65 lines
1.8 KiB
Perl
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;
|
|
|