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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use LWP::UserAgent;
use HTTP::Request;
my $localhost_ip = '127.0.0.1';
my $forward_ip = '140.211.11.130';
my $x_forwarded_for = "$localhost_ip; $forward_ip";
my $http_host = "$localhost_ip:2500";
my $x_host = 'www.apache.org';
my $test = shift || die("Missing a testcase");
my $ua;
if ($test ne 'test6') {
$ua = LWP::UserAgent->new();
} else {
$ua = LWP::UserAgent->new(keep_alive => 1);
}
my $request = HTTP::Request->new(GET => 'http://127.0.0.1:2500/cgi-bin/env.cgi');
run_test1() if $test eq 'test1';
run_test2() if $test eq 'test2';
run_test3() if $test eq 'test3';
run_test4() if $test eq 'test4';
run_test5() if $test eq 'test5';
run_test6() if $test eq 'test6';
run_test6() if $test eq 'test7';
sub run_test1 {
# two tests - one without X-Forwarded-For and one with
execute_test($request, { REMOTE_ADDR => $localhost_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => ''});
$request->header('X-Forwarded-For' => $x_forwarded_for);
execute_test($request, { REMOTE_ADDR => $localhost_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
}
sub run_test2 {
# three tests - one without X-Forwarded-For; one with; and one with X-Host
execute_test($request, { REMOTE_ADDR => $localhost_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => ''});
$request->header('X-Forwarded-For' => $x_forwarded_for);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
$request->header('X-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
}
sub run_test3 {
# three tests one without X-Host; one with; and one with X-Forwarded-Host
$request->header('X-Forwarded-For' => $x_forwarded_for);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
$request->header('X-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $x_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
$request->remove_header('X-Host');
$request->header('X-Forwarded-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $x_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
}
sub run_test4 {
# three tests one without X-Host; one with; and one with X-Forwarded-Host
$request->header('X-Forwarded-For' => $x_forwarded_for);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $http_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
$request->header('X-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $x_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
$request->remove_header('X-Host');
$request->header('X-Forwarded-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $x_host, HTTP_X_FORWARDED_FOR => $x_forwarded_for});
}
sub run_test5 {
# two tests with X-Real-IP; one without X-Host; one with
$request->remove_header('X-Forwarded-For');
$request->header('X-Real-IP' => $x_forwarded_for);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $http_host, HTTP_X_REAL_IP => $x_forwarded_for});
$request->header('X-Host' => $x_host);
execute_test($request, { REMOTE_ADDR => $forward_ip, HTTP_HOST => $x_host, HTTP_X_REAL_IP => $x_forwarded_for});
}
sub run_test6 {
# attempt to test keep-alive
print "Testing Keep-Alive\n";
my $static_request = HTTP::Request->new(GET => 'http://127.0.0.1:2500/index.html');
print "First using X-F-F: $x_forwarded_for\n";
$static_request->header('X-Forwarded-For' => $x_forwarded_for);
my $response = $ua->request($static_request);
if ($response->is_success()) {
} else {
print "Something went wrong in requesting file..";
}
my $reverse_xff = "$localhost_ip; " . (join ".", reverse split /\./, $forward_ip);
print "Then using X-F-F: $reverse_xff\n";
$static_request->header('X-Forwarded-For' => $reverse_xff);
$response = $ua->request($static_request);
if ($response->is_success()) {
} else {
print "Something went wrong in requesting file..";
}
print "Now requesting without X-F-F\n";
$static_request->remove_header('X-Forwarded-For');
$response = $ua->request($static_request);
if ($response->is_success()) {
} else {
print "Something went wrong in requesting file..";
}
print "Done\n";
}
sub execute_test {
my $request = shift;
my $expected = shift;
my $response = $ua->request($request);
if ($response->is_success()) {
my $returned = {};
my $content = $response->content();
my @rows = split /\n/, $content;
foreach my $row (@rows) {
my ($key,$value) = split / \= /, $row;
$returned->{$key} = $value;
}
# compare with $expected
foreach my $key (sort keys %$expected) {
print qq{Expected $key "$expected->{$key}" };
print qq{Response "$returned->{$key}" } if defined($returned->{$key});
my $status = (defined($returned->{$key}) && $returned->{$key} eq $expected->{$key} ? 'OK' : 'NOT OK' );
print qq{$status\n};
die(Dumper($response)) if $status ne 'OK';
}
# Everything looks like it worked
print qq{*** Test passed ***\n};
} else {
die($response);
}
}
|