Skip to content

Instantly share code, notes, and snippets.

@typester
Created August 12, 2009 16:35
Show Gist options
  • Save typester/166602 to your computer and use it in GitHub Desktop.
Save typester/166602 to your computer and use it in GitHub Desktop.
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Request::Common;
use AnyEvent::HTTP;
use AnyEvent::ReverseHTTP;
use Digest::SHA1 qw/sha1_hex/;
my $proxy_to = $ARGV[0] or die 'require proxy target';
my $num_processed = abs($ARGV[1] || 1);
sub handler {
my ($req) = @_;
my $resback = AnyEvent->condvar;
my $target = $proxy_to . $req->uri;
# proxy
my %headers = map { $_ => $req->header($_) } $req->headers->header_field_names;
http_request(
$req->method, $target,
headers => \%headers,
body => $req->content,
sub {
my ($body, $hdr) = @_;
my $res = HTTP::Response->new( $hdr->{Status} );
for my $header (keys %{ $hdr || {} }) {
$res->header( $header => $hdr->{$header} );
}
$res->content( $body );
$resback->send($res);
}
);
$resback;
}
my $master = AnyEvent::ReverseHTTP->new(
token => sha1_hex($0),
on_request => \&handler,
);
my $w = $master->connect; # guard
while (--$num_processed) {
my $guard; $guard = AnyEvent::ReverseHTTP->new(
token => sha1_hex($0),
label => $master->label,
on_request => sub {
scalar $guard;
goto \&handler;
},
)->connect;
}
AnyEvent->condvar->recv;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment