typester (owner)

Revisions

gist: 166602 Download_button fork
public
Public Clone URL: git://gist.github.com/166602.git
Embed All Files: show embed
proxy.pl #
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/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;