Skip to content

Instantly share code, notes, and snippets.

@hiratara
Forked from miyagawa/gist:291417
Created February 1, 2010 04:31
Show Gist options
  • Save hiratara/291451 to your computer and use it in GitHub Desktop.
Save hiratara/291451 to your computer and use it in GitHub Desktop.
package Plack::Middleware::Proxy::Reproxy;
use strict;
use parent 'Plack::Middleware';
use Plack::Util;
sub call {
my($self, $env) = @_;
$env->{HTTP_X_PROXY_CAPABILITIES} = 'reproxy-file';
return sub {
my $orig_respond = shift;
my $cv = AE::cv;
my $orig_nonblocking = $env->{"psgi.nonblocking"};
$env->{"psgi.nonblocking"} = 1;
my $respond; $respond = sub {
my $res = shift;
if (my $url = Plack::Util::header_get($res->[1], 'X-Reproxy-URL')) {
$env->{'plack.proxy.url'} = $url;
$env->{REQUEST_METHOD} = 'GET';
my $cb = $self->app->($env);
$cb->($respond);
return Plack::Util::inline_object
write => sub { warn @_ },
close => sub { };
} else {
my $orig_writer = $orig_respond->( $res );
return Plack::Util::inline_object
write => sub { $orig_writer->write( @_ ) },
close => sub { $cv->send; };
}
};
my $cb = $self->app->($env);
$cb->($respond);
$cv->recv unless $orig_nonblocking;
$env->{"psgi.nonblocking"} = $orig_nonblocking;
};
}
1;
__END__
=head1 NAME
Plack::Middleware::Proxy::Reproxy - Adds reproxy behavior to Plack::App::Proxy
=head1 SYNOPSIS
use Plack::Builder;
use Plack::App::Proxy;
builder {
enable "Proxy::Reproxy";
Plack::App::Proxy->new(host => "http://10.0.1.2:8080/")->to_app;
};
=head1 DESCRIPTION
Plack::Middleware::Proxy::Reproxy adds reproxy capability to Plack::App::Proxy.
=head1 AUTHOR
Tatsuhiko Miyagawa
=head1 SEE ALSO
L<Plack::App::Proxy>
=cut
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment