1package MyComponent; 2use strict; 3use warnings; 4use Test::More; 5use Scalar::Util qw/weaken/; 6use parent 'Plack::Component'; 7 8sub call { 9 my $self = shift; 10 my $env = shift; 11 12 if( $env->{PATH_INFO} eq '/run_response_cb' ){ 13 my $my; 14 15 # Record $res and $cb 16 $self->{res} = [200, ['Content-Type' => 'text/plain'], ['OK']]; 17 $self->{cb} = sub { $my }; # Contain $my to be regard as a closure. 18 19 return $self->response_cb($self->{res}, $self->{cb}); 20 }else{ 21 # Decrease REFCNT 22 weaken $self->{res}; 23 weaken $self->{cb}; 24 25 # Check if references are released. 26 return [ 200, [ 27 'Content-Type' => 'text/plain', 28 'X-Res-Freed' => ! $self->{res}, 29 'X-Cb-Freed' => ! $self->{cb}, 30 ], ['HELLO'] ]; 31 } 32} 33 34 35package main; 36use strict; 37use warnings; 38use Test::More; 39use Plack::Test; 40use HTTP::Request::Common; 41$Plack::Test::Impl = "Server"; 42local $ENV{PLACK_SERVER} = "HTTP::Server::PSGI"; 43 44my $app = MyComponent->new; 45test_psgi( $app->to_app, sub { 46 my $cb = shift; 47 $cb->(GET '/run_response_cb'); 48 49 my $req = $cb->(GET '/check'); 50 ok $req->header('X-Res-Freed'), '$res has been released.'; 51 ok $req->header('X-Cb-Freed') , '$cb has been released.'; 52} ); 53 54done_testing; 55