File Coverage

blib/lib/Perlbal/Plugin/ForwardedFor.pm
Criterion Covered Total %
statement 21 31 67.7
branch 1 2 50.0
condition n/a
subroutine 4 8 50.0
pod 3 3 100.0
total 29 44 65.9


line stmt bran cond sub pod time code
1             package Perlbal::Plugin::ForwardedFor;
2              
3 2     2   54737 use strict;
  2         5  
  2         74  
4 2     2   9 use warnings;
  2         4  
  2         85  
5 2     2   1820 use Perlbal;
  2         1005630  
  2         876  
6              
7             our $VERSION = '0.02';
8              
9             my $target_header;
10              
11             sub load {
12             Perlbal::register_global_hook( 'manage_command.forwarded_for', sub {
13 0     0   0 my $mc = shift->parse(qr/^forwarded_for\s+=\s+(.+)\s*$/,
14             "usage: FORWARDED_FOR = ");
15              
16 0         0 ($target_header) = $mc->args;
17              
18 0         0 return $mc->ok;
19 0     0 1 0 } );
20              
21 0         0 return 1;
22             }
23              
24             sub register {
25 0     0 1 0 my ( $self, $svc ) = @_;
26              
27             $svc->register_hook(
28             'ForwardedFor',
29             'backend_client_assigned',
30 0     0   0 sub { rewrite_header( @_, $target_header ) },
31 0         0 );
32              
33 0         0 return 1;
34             }
35              
36             sub rewrite_header {
37 1     1 1 577 my ( $svc, $target_header ) = @_;
38 1         4 my $headers = $svc->{'req_headers'};
39 1         3 my $header_name = 'X-Forwarded-For';
40 1         6 my $forwarded = $headers->header($header_name);
41 1         438 my $DELIMITER = q{, };
42 1         3 my $EMPTY = q{};
43              
44 1         16 my @ips = split /$DELIMITER/, $forwarded;
45 1         3 my $ip = pop @ips;
46              
47 1         7 $headers->header( $target_header, $ip );
48              
49 1 50       804 if (@ips) {
50 0         0 $headers->header( $header_name, join $DELIMITER, @ips );
51             } else {
52             # actually, i wish we could delete it
53 1         6 $headers->header( $header_name, $EMPTY );
54             }
55              
56 1         513 return 0;
57             }
58              
59             1;
60              
61             __END__