Skip to content

Commit

Permalink
support streaming and real recurse
Browse files Browse the repository at this point in the history
  • Loading branch information
miyagawa committed Feb 17, 2010
1 parent 4512980 commit 5363186
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 10 deletions.
28 changes: 22 additions & 6 deletions lib/Plack/Middleware/Recursive.pm
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,37 @@ open my $null_io, "<", \"";
sub call {
my($self, $env) = @_;

$env->{'plack.recursive.include'} = $self->recurse_callback($env);
$env->{'plack.recursive.include'} = $self->recurse_callback($env, 1);

my $res = try {
$self->app->($env);
} catch {
if (blessed $_ && $_->isa('Plack::Recursive::ForwardRequest')) {
return $env->{'plack.recursive.include'}->($_->path);
return $self->recurse_callback($env)->($_->path);
}
};

return $res;
return $res if ref $res eq 'ARRAY';

return sub {
my $respond = shift;

my $writer;
try {
$res->(sub { return $writer = $respond->(@_) });
} catch {
if (!$writer && blessed $_ && $_->isa('Plack::Recursive::ForwardRequest')) {
$res = $self->recurse_callback($env)->($_->path);
return ref $res eq 'CODE' ? $res->($respond) : $respond->($res);
} else {
die $_;
}
};
};
}

sub recurse_callback {
my($self, $env) = @_;
my($self, $env, $include) = @_;

my $old_path_info = $env->{PATH_INFO};

Expand All @@ -40,9 +56,9 @@ sub recurse_callback {
$env->{CONTENT_LENGTH} = 0;
$env->{CONTENT_TYPE} = '';
$env->{'psgi.input'} = $null_io;
$env->{'plack.recursive.old_path_info'} = $old_path_info;
push @{$env->{'plack.recursive.old_path_info'}}, $old_path_info;

$self->app->($env);
$include ? $self->app->($env) : $self->call($env);
};
}

Expand Down
2 changes: 1 addition & 1 deletion t/Plack-Middleware/recursive/base.t
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ my $app = sub {
my $env = shift;

if ($env->{PATH_INFO} eq '/forwarded') {
is $env->{'plack.recursive.old_path_info'}, '/';
is_deeply $env->{'plack.recursive.old_path_info'}, [ '/' ];
return [ 200, [ 'Content-Type', 'text/plain' ], [ "Hello $env->{QUERY_STRING}" ] ];
}

Expand Down
2 changes: 1 addition & 1 deletion t/Plack-Middleware/recursive/streaming.t
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ my $app = sub {
my $env = shift;

if ($env->{PATH_INFO} eq '/forwarded') {
is $env->{'plack.recursive.old_path_info'}, '/';
is_deeply $env->{'plack.recursive.old_path_info'}, [ '/' ];
return sub { $_[0]->([ 200, [ 'Content-Type', 'text/plain' ], [ "Hello $env->{QUERY_STRING}" ] ]) };
}

Expand Down
6 changes: 4 additions & 2 deletions t/Plack-Middleware/recursive/throw.t
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ use Plack::Middleware::Recursive;
my $app = sub {
my $env = shift;

if ($env->{PATH_INFO} eq '/forwarded') {
is $env->{'plack.recursive.old_path_info'}, '/';
if ($env->{PATH_INFO} eq '/forwarded2') {
is_deeply $env->{'plack.recursive.old_path_info'}, [ '/', '/forwarded' ];
return [ 200, [ 'Content-Type', 'text/plain' ], [ "Hello $env->{QUERY_STRING}" ] ];
} elsif ($env->{PATH_INFO} eq '/forwarded') {
Plack::Recursive::ForwardRequest->throw("/forwarded2?q=bar");
}

Plack::Recursive::ForwardRequest->throw("/forwarded?q=bar");
Expand Down

0 comments on commit 5363186

Please sign in to comment.