PAGI-Server
view release on metacpan or search on metacpan
t/integration/psgi-bridge.t view on Meta::CPAN
};
# Test 5: PSGI filehandle body response works
subtest 'PSGI filehandle body response works' => sub {
my $content = "Hello from filehandle";
open my $fh, '<', \$content;
my $fh_body_psgi = sub {
my ($env) = @_;
open my $body_fh, '<', \$content;
return [200, ['Content-Type' => 'text/plain'], $body_fh];
};
my $wrapper = PAGI::App::WrapPSGI->new(psgi_app => $fh_body_psgi);
my $pagi_app = $wrapper->to_app;
# Wrap with lifespan handler
my $wrapped_app = async sub {
my ($scope, $receive, $send) = @_;
if ($scope->{type} eq 'lifespan') {
while (1) {
my $event = await $receive->();
if ($event->{type} eq 'lifespan.startup') {
await $send->({ type => 'lifespan.startup.complete' });
}
elsif ($event->{type} eq 'lifespan.shutdown') {
await $send->({ type => 'lifespan.shutdown.complete' });
last;
}
}
return;
}
await $pagi_app->($scope, $receive, $send);
};
my $server = PAGI::Server->new(
app => $wrapped_app,
host => '127.0.0.1',
port => 0,
quiet => 1,
);
$loop->add($server);
$server->listen->get;
my $port = $server->port;
my $http = Net::Async::HTTP->new;
$loop->add($http);
my $response = $http->GET("http://127.0.0.1:$port/")->get;
is($response->code, 200, 'Response status is 200 OK');
is($response->decoded_content, 'Hello from filehandle', 'Filehandle body is read correctly');
$server->shutdown->get;
$loop->remove($server);
$loop->remove($http);
};
# Test 6: PSGI streaming response (coderef body) works
subtest 'PSGI streaming response (coderef body) works' => sub {
my $streaming_psgi = sub {
my ($env) = @_;
return sub {
my ($responder) = @_;
# Immediate response with streaming body
my $writer = $responder->([200, ['Content-Type' => 'text/plain']]);
$writer->write("Streaming ");
$writer->write("response");
$writer->close;
};
};
my $wrapper = PAGI::App::WrapPSGI->new(psgi_app => $streaming_psgi);
my $pagi_app = $wrapper->to_app;
# Wrap with lifespan handler
my $wrapped_app = async sub {
my ($scope, $receive, $send) = @_;
if ($scope->{type} eq 'lifespan') {
while (1) {
my $event = await $receive->();
if ($event->{type} eq 'lifespan.startup') {
await $send->({ type => 'lifespan.startup.complete' });
}
elsif ($event->{type} eq 'lifespan.shutdown') {
await $send->({ type => 'lifespan.shutdown.complete' });
last;
}
}
return;
}
await $pagi_app->($scope, $receive, $send);
};
my $server = PAGI::Server->new(
app => $wrapped_app,
host => '127.0.0.1',
port => 0,
quiet => 1,
);
$loop->add($server);
$server->listen->get;
my $port = $server->port;
my $http = Net::Async::HTTP->new;
$loop->add($http);
my $response = $http->GET("http://127.0.0.1:$port/")->get;
is($response->code, 200, 'Streaming response status is 200 OK');
is($response->decoded_content, 'Streaming response', 'Streaming body is collected correctly');
$server->shutdown->get;
$loop->remove($server);
$loop->remove($http);
};
done_testing;
( run in 0.571 second using v1.01-cache-2.11-cpan-995e09ba956 )