Skip to content

Commit

Permalink
Decode %ENV vars.
Browse files Browse the repository at this point in the history
  • Loading branch information
oalders committed Feb 10, 2014
1 parent fae859f commit d8c608b
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 49 deletions.
1 change: 1 addition & 0 deletions .tidyallrc
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[PerlTidy]
select = **/*.{pl,pm,t,psgi}
select = t/cgi-bin/json-env
ignore = **/blib/**/*.{pm}
argv = --profile=$ROOT/.perltidyallrc
12 changes: 9 additions & 3 deletions t/cgi-bin/json-env
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
#!/usr/bin/env perl
#!/usr/local/bin/mm-perl

use strict;
use warnings;
use JSON::XS;

#use utf8::all;

use Encode qw( decode );
use Cpanel::JSON::XS;

my %env = map { $_ => decode( 'UTF-8', $ENV{$_} ) } keys %ENV;

print "Content-type: application/json; charset=UTF-8\n\n";
print encode_json(\%ENV);
print Cpanel::JSON::XS->new->utf8->ascii->pretty->encode( \%env );

53 changes: 38 additions & 15 deletions t/conf/extra.conf.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,20 +18,43 @@ RemoteIPProxiesHeader X-Forwarded-By

MaxMindDBFile CITY_DB /usr/local/share/GeoIP/GeoIP2-City-Test.mmdb

MaxMindDBEnv MM_CONTINENT_CODE CITY_DB/continent/code
MaxMindDBEnv MM_CONTINENT_GEONAME_ID CITY_DB/continent/geoname_id
MaxMindDBEnv MM_COUNTRY_CODE CITY_DB/country/iso_code
MaxMindDBEnv MM_COUNTRY_GEONAME_ID CITY_DB/country/geoname_id
MaxMindDBEnv MM_COUNTRY_NAME CITY_DB/country/names/en
MaxMindDBEnv MM_COUNTRY_NAME_DE CITY_DB/country/names/de
MaxMindDBEnv MM_COUNTRY_NAME_EN CITY_DB/country/names/en
MaxMindDBEnv MM_COUNTRY_NAME_ES CITY_DB/country/names/es
MaxMindDBEnv MM_COUNTRY_NAME_FR CITY_DB/country/names/fr
MaxMindDBEnv MM_COUNTRY_NAME_JA CITY_DB/country/names/ja
MaxMindDBEnv MM_COUNTRY_NAME_PT_BR CITY_DB/country/names/pt-BR
MaxMindDBEnv MM_COUNTRY_NAME_RU CITY_DB/country/names/ru
MaxMindDBEnv MM_COUNTRY_NAME_ZH_CN CITY_DB/country/names/zh-CN
MaxMindDBEnv MM_LATITUDE CITY_DB/location/latitude
MaxMindDBEnv MM_LONGITUDE CITY_DB/location/longitude
MaxMindDBEnv MM_CITY_NAME_EN CITY_DB/city/names/en
MaxMindDBEnv MM_CONTINENT_CODE CITY_DB/continent/code
MaxMindDBEnv MM_CONTINENT_GEONAME_ID CITY_DB/continent/geoname_id
MaxMindDBEnv MM_CONTINENT_NAME_EN CITY_DB/continent/names/en
MaxMindDBEnv MM_COUNTRY_CODE CITY_DB/country/iso_code
MaxMindDBEnv MM_COUNTRY_GEONAME_ID CITY_DB/country/geoname_id
MaxMindDBEnv MM_COUNTRY_NAME CITY_DB/country/names/en
MaxMindDBEnv MM_COUNTRY_NAME_DE CITY_DB/country/names/de
MaxMindDBEnv MM_COUNTRY_NAME_EN CITY_DB/country/names/en
MaxMindDBEnv MM_COUNTRY_NAME_ES CITY_DB/country/names/es
MaxMindDBEnv MM_COUNTRY_NAME_FR CITY_DB/country/names/fr
MaxMindDBEnv MM_COUNTRY_NAME_JA CITY_DB/country/names/ja
MaxMindDBEnv MM_COUNTRY_NAME_PT_BR CITY_DB/country/names/pt-BR
MaxMindDBEnv MM_COUNTRY_NAME_RU CITY_DB/country/names/ru
MaxMindDBEnv MM_COUNTRY_NAME_ZH_CN CITY_DB/country/names/zh-CN
MaxMindDBEnv MM_LOCATION_LATITUDE CITY_DB/location/latitude
MaxMindDBEnv MM_LOCATION_LONGITUDE CITY_DB/location/longitude
MaxMindDBEnv MM_LOCATION_TIME_ZONE CITY_DB/location/time_zone
MaxMindDBEnv MM_POSTAL_CODE CITY_DB/postal/code
MaxMindDBEnv MM_REGISTERED_COUNTRY_ISO_CODE CITY_DB/registered_country/iso_code
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_DE CITY_DB/registered_country/names/de
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_EN CITY_DB/registered_country/names/en
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_ES CITY_DB/registered_country/names/es
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_FR CITY_DB/registered_country/names/fr
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_JA CITY_DB/registered_country/names/ja
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_PT_BR CITY_DB/registered_country/names/pt_br
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_RU CITY_DB/registered_country/names/ru
MaxMindDBEnv MM_REGISTERED_COUNTRY_NAMES_ZH_CN CITY_DB/registered_country/names/zh-CN
MaxMindDBEnv MM_SUBDIVISION_1_GEONAME_ID CITY_DB/subdivisions/0/geoname_id
MaxMindDBEnv MM_SUBDIVISION_1_ISO_CODE CITY_DB/subdivisions/0/iso_code
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_DE CITY_DB/subdivisions/0/names/de
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_EN CITY_DB/subdivisions/0/names/en
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_ES CITY_DB/subdivisions/0/names/es
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_FR CITY_DB/subdivisions/0/names/fr
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_JA CITY_DB/subdivisions/0/names/ja
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_PT_BR CITY_DB/subdivisions/0/names/pt_br
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_RU CITY_DB/subdivisions/0/names/ru
MaxMindDBEnv MM_SUBDIVISION_1_NAMES_ZH_CN CITY_DB/subdivisions/0/names/zh-CN

</IfModule>
95 changes: 64 additions & 31 deletions t/geoip-x-forwarded-for.t
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,18 @@ use utf8::all;
use Apache::Test qw(-withtestmore);
use Apache::TestModMaxMindDB;
use Apache::TestRequest;
use Cpanel::JSON::XS qw( decode_json );
use Cpanel::JSON::XS;
use Data::Validate::IP;
use DDP;
use Encode qw( decode_utf8 );
use Hash::Flatten;
use Net::Works::Network;

my $builder = Test::More->builder;
binmode $builder->output, ":encoding(utf8)";
binmode $builder->failure_output, ":encoding(utf8)";
binmode $builder->todo_output, ":encoding(utf8)";

my $url = '/cgi-bin/json-env';

my $get_with_xff_c = sub {
Expand All @@ -20,7 +27,7 @@ my $get_with_xff_c = sub {
# Allow request to be redirected.
my $res = GET $url, 'X-Forwarded-For' => $xff_ip;
ok( $res, '$res is defined' );
my $srv_env = decode_json $res->content;
my $srv_env = Cpanel::JSON::XS->new->decode( $res->content );

$code->( $res, $srv_env, $xff_ip );
}
Expand Down Expand Up @@ -48,54 +55,80 @@ $get_with_xff_c->(
);

my %mm_vars = (
MM_COUNTRY_CODE => 'country/iso_code',
MM_COUNTRY_GEONAME_ID => 'country/geoname_id',
MM_COUNTRY_NAME_DE => 'country/names/de',
MM_COUNTRY_NAME_EN => 'country/names/en',
MM_COUNTRY_NAME_ES => 'country/names/es',
MM_COUNTRY_NAME_FR => 'country/names/fr',
MM_COUNTRY_NAME_JA => 'country/names/ja',
MM_COUNTRY_NAME_PT_BR => 'country/names/pt-BR',
MM_COUNTRY_NAME_RU => 'country/names/ru',
MM_COUNTRY_NAME_ZH_CN => 'country/names/zh-CN',
MM_CONTINENT_CODE => 'continent/code',
MM_CONTINENT_GEONAME_ID => 'continent/geoname_id',
MM_COUNTRY_CODE => 'country/iso_code',
MM_COUNTRY_CODE => 'country/iso_code',
MM_COUNTRY_NAME => 'country/names/en',
MM_LATITUDE => 'location/latitude',
MM_LONGITUDE => 'location/longitude',
MM_CITY_NAME_EN => 'city/names/en',
MM_CONTINENT_CODE => 'continent/code',
MM_CONTINENT_GEONAME_ID => 'continent/geoname_id',
MM_CONTINENT_NAME_EN => 'continent/names/en',
MM_COUNTRY_CODE => 'country/iso_code',
MM_COUNTRY_GEONAME_ID => 'country/geoname_id',
MM_COUNTRY_NAME => 'country/names/en',
MM_COUNTRY_NAME_DE => 'country/names/de',
MM_COUNTRY_NAME_EN => 'country/names/en',
MM_COUNTRY_NAME_ES => 'country/names/es',
MM_COUNTRY_NAME_FR => 'country/names/fr',
MM_COUNTRY_NAME_JA => 'country/names/ja',
MM_COUNTRY_NAME_PT_BR => 'country/names/pt-BR',
MM_COUNTRY_NAME_RU => 'country/names/ru',
MM_COUNTRY_NAME_ZH_CN => 'country/names/zh-CN',
MM_LOCATION_LATITUDE => 'location/latitude',
MM_LOCATION_LONGITUDE => 'location/longitude',
MM_LOCATION_TIME_ZONE => 'location/time_zone',
MM_POSTAL_CODE => 'postal/code',
MM_REGISTERED_COUNTRY_ISO_CODE => 'registered_country/iso_code',
MM_REGISTERED_COUNTRY_NAMES_DE => 'registered_country/names/de',
MM_REGISTERED_COUNTRY_NAMES_EN => 'registered_country/names/en',
MM_REGISTERED_COUNTRY_NAMES_ES => 'registered_country/names/es',
MM_REGISTERED_COUNTRY_NAMES_FR => 'registered_country/names/fr',
MM_REGISTERED_COUNTRY_NAMES_JA => 'registered_country/names/ja',
MM_REGISTERED_COUNTRY_NAMES_PT_BR => 'registered_country/names/pt_br',
MM_REGISTERED_COUNTRY_NAMES_RU => 'registered_country/names/ru',
MM_REGISTERED_COUNTRY_NAMES_ZH_CN => 'registered_country/names/zh-CN',
MM_SUBDIVISION_1_GEONAME_ID => 'subdivisions/:0/geoname_id',
MM_SUBDIVISION_1_ISO_CODE => 'subdivisions/:0/iso_code',
MM_SUBDIVISION_1_NAMES_DE => 'subdivisions/:0/names/de',
MM_SUBDIVISION_1_NAMES_EN => 'subdivisions/:0/names/en',
MM_SUBDIVISION_1_NAMES_ES => 'subdivisions/:0/names/es',
MM_SUBDIVISION_1_NAMES_FR => 'subdivisions/:0/names/fr',
MM_SUBDIVISION_1_NAMES_JA => 'subdivisions/:0/names/ja',
MM_SUBDIVISION_1_NAMES_PT_BR => 'subdivisions/:0/names/pt_br',
MM_SUBDIVISION_1_NAMES_RU => 'subdivisions/:0/names/ru',
MM_SUBDIVISION_1_NAMES_ZH_CN => 'subdivisions/:0/names/zh-CN',
);

my $flattener = Hash::Flatten->new( { HashDelimiter => '/' } );

foreach my $range ( sort keys %{ $test_data->city_source_data } ) {

my $network = Net::Works::Network->new_from_string( string => $range );
my $first = $network->first->as_string;
next unless is_public_ipv4($first) || is_public_ipv6($first);

if ( $first =~ m{\A::} ) {
$first = Net::Works::Address->new_from_string(
string => substr( $first, 2 ) )->as_ipv4_string;
}

$get_with_xff_c->(
sub {
my ( $res, $srv_env, $xff_ip ) = @_;
use Data::Dump qw( dump );
diag p $srv_env;

my $expected = $flattener->flatten(
$test_data->city_source_data->{$range} );

foreach my $mm_key ( sort keys %mm_vars ) {
my $value = $srv_env->{$mm_key};
$value += 0 if $mm_key =~ m{TUDE};
is(
$value,
$expected->{ $mm_vars{$mm_key} },
"$mm_key is "
. $expected->{ $mm_vars{$mm_key} . ' ' . $value }
);
my $want = $expected->{ $mm_vars{$mm_key} };
next if !$want;

if ( $mm_key =~ m{TUDE} ) {
cmp_ok( $value, '==', $want, "$mm_key is $want" );
}
else {
is( $value, $want, "$mm_key is $want" );
}
}
},
$network->first->as_string
$first
);
last;
}

done_testing();
Expand Down

0 comments on commit d8c608b

Please sign in to comment.