1use strict;
2use warnings;
3use Test::More;
4use Plack::Builder;
5
6sub build_handler {
7  my @args = @_;
8  builder {
9    enable "Plack::Middleware::XForwardedFor", @args;
10    sub { my $env = shift; is($env->{REMOTE_ADDR}, $env->{__expect}) };
11  };
12}
13
14my @tests = (
15  { REMOTE_ADDR          => "1.2.3.4",
16    HTTP_X_FORWARDED_FOR => "9.8.7.6",
17    __expect             => "9.8.7.6",
18  },
19  { REMOTE_ADDR          => "127.0.0.1",
20    HTTP_X_FORWARDED_FOR => "10.55.1.2, 9.8.7.6",
21    __expect             => "10.55.1.2",
22  },
23  { REMOTE_ADDR          => "1.2.3.4",
24    HTTP_X_FORWARDED_FOR => "9.8.7.6",
25    __trust              => "127.0.0.1",
26    __expect             => "1.2.3.4",
27  },
28  { REMOTE_ADDR          => "127.0.0.1",
29    HTTP_X_FORWARDED_FOR => "9.8.7.6",
30    __trust              => "127.0.0.1",
31    __expect             => "9.8.7.6",
32  },
33  { REMOTE_ADDR          => "127.0.0.1",
34    HTTP_X_FORWARDED_FOR => "10.55.1.2, 9.8.7.6",
35    __trust              => "127.0.0.1",
36    __expect             => "9.8.7.6",
37  },
38  { REMOTE_ADDR          => "127.0.0.1",
39    HTTP_X_FORWARDED_FOR => "2601:647:4200:1::100",
40    __trust              => "127.0.0.1",
41    __expect             => "2601:647:4200:1::100",
42  },
43  { REMOTE_ADDR          => "127.0.0.1",
44    HTTP_X_FORWARDED_FOR => "9.8.7.6, 2601:647:4200:abcd::100",
45    __trust              => ["127.0.0.1", "2601:647:4200:abcd::/64"],
46    __expect             => "9.8.7.6",
47  },
48  { REMOTE_ADDR          => "2601:647:4200:abcd::100",
49    HTTP_X_FORWARDED_FOR => "not-an-ip,9.8.7.6,127.0.0.1",
50    __trust              => ["127.0.0.1", "2601:647:4200:abcd::/64"],
51    __expect             => "9.8.7.6",
52  },
53  { REMOTE_ADDR          => "10.0.0.1",
54    HTTP_X_FORWARDED_FOR => "::ffff:9.8.7.6",
55    __trust              => ["10.0.0.0/24"],
56    __expect             => "9.8.7.6",
57  },
58  { REMOTE_ADDR          => "127.0.0.1",
59    HTTP_X_FORWARDED_FOR => "10.55.1.2, 9.8.7.6",
60    __trust              => ["127.0.0.1", "9.8/16"],
61    __expect             => "10.55.1.2",
62  },
63);
64
65foreach my $env (@tests) {
66  build_handler(trust => $env->{__trust})->($env);
67}
68
69done_testing();
70