Mojolicious-Plugin-ClientIP

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

{
   "abstract" : "Get client's IP address from X-Forwarded-For",
   "author" : [
      "ziguzagu <ziguzagu@cpan.org>"
   ],
   "dynamic_config" : 0,
   "generated_by" : "Minilla/v3.1.9",
   "license" : [
      "perl_5"
   ],
   "meta-spec" : {
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",

META.yml  view on Meta::CPAN

---
abstract: "Get client's IP address from X-Forwarded-For"
author:
  - 'ziguzagu <ziguzagu@cpan.org>'
build_requires:
  Test::More: '0.98'
configure_requires:
  Module::Build::Tiny: '0.035'
dynamic_config: 0
generated_by: 'Minilla/v3.1.9, CPAN::Meta::Converter version 2.150010'
license: perl
meta-spec:

README.md  view on Meta::CPAN

[![Build Status](https://travis-ci.org/sixapart/Mojolicious-Plugin-ClientIP.svg?branch=master)](https://travis-ci.org/sixapart/Mojolicious-Plugin-ClientIP)
# NAME

Mojolicious::Plugin::ClientIP - Get client's IP address from X-Forwarded-For

# SYNOPSIS

    use Mojolicious::Lite;

    plugin 'ClientIP';

    get '/' => sub {
        my $c = shift;
        $c->render(text => $c->client_ip);
    };

    app->start;

# DESCRIPTION

Mojolicious::Plugin::ClientIP is a Mojolicious plugin to get an IP address looks like client, not proxy, from X-Forwarded-For header.

# METHODS

## client\_ip

Find a client IP address from X-Forwarded-For. Private network addresses in XFF are ignored by default. If the good IP address is not found, it returns Mojo::Transaction#remote\_address.

# OPTIONS

## ignore

Specify IP list to be ignored with ArrayRef.

    plugin 'ClientIP', ignore => [qw(192.0.2.1 192.0.2.16/28)];

## private

lib/Mojolicious/Plugin/ClientIP.pm  view on Meta::CPAN

        @{$conf->{ignore} || []}
    ]);

    $app->helper(client_ip => sub {
        my ($c) = @_;

        state $key = '__plugin_clientip_ip';

        return $c->stash($key) if $c->stash($key);

        my $xff        = $c->req->headers->header('X-Forwarded-For') // '';
        my @candidates = reverse grep { $_ } split /,\s*/, $xff;
        my $ip         = $self->_find(\@candidates) // $c->tx->remote_address;
        $c->stash($key => $ip);

        return $ip;
    });
}

sub _find {
    my $self = shift;

lib/Mojolicious/Plugin/ClientIP.pm  view on Meta::CPAN

    join '', map { unpack('B8', pack('C', $_)) } split /\./, $ip;
}

1;
__END__

=encoding utf-8

=head1 NAME

Mojolicious::Plugin::ClientIP - Get client's IP address from X-Forwarded-For

=head1 SYNOPSIS

    use Mojolicious::Lite;

    plugin 'ClientIP';

    get '/' => sub {
        my $c = shift;
        $c->render(text => $c->client_ip);
    };

    app->start;

=head1 DESCRIPTION

Mojolicious::Plugin::ClientIP is a Mojolicious plugin to get an IP address looks like client, not proxy, from X-Forwarded-For header.

=head1 METHODS

=head2 client_ip

Find a client IP address from X-Forwarded-For. Private network addresses in XFF are ignored by default. If the good IP address is not found, it returns Mojo::Transaction#remote_address.

=head1 OPTIONS

=head2 ignore

Specify IP list to be ignored with ArrayRef.

    plugin 'ClientIP', ignore => [qw(192.0.2.1 192.0.2.16/28)];

=head2 private

t/01_get_client_ip.t  view on Meta::CPAN


    get '/' => sub {
        my $c = shift;
        $c->render(text => $c->client_ip);
    };

    app->start;
}

my $web = Test::Mojo->new;
my $xff = 'X-Forwarded-For';

$web->get_ok('/')
    ->content_is('127.0.0.1');

$web->get_ok('/', { $xff => '192.0.2.1' })
    ->content_is('192.0.2.1');

subtest 'ignore private IPs in XFF as default' => sub {
    $web->get_ok('/', { $xff => '127.0.0.2' })
        ->content_is('127.0.0.1');

t/02_ignore_ip.t  view on Meta::CPAN


    get '/' => sub {
        my $c = shift;
        $c->render(text => $c->client_ip);
    };

    app->start;
}

my $web = Test::Mojo->new;
my $xff = 'X-Forwarded-For';

$web->get_ok('/')
    ->content_is('127.0.0.1');

$web->get_ok('/', { $xff => '192.0.2.1' })
    ->content_is('192.0.2.1');

$web->get_ok('/', { $xff => '192.0.2.2' })
    ->content_is('127.0.0.1');

t/03_ignore_ip_private.t  view on Meta::CPAN


    get '/' => sub {
        my $c = shift;
        $c->render(text => $c->client_ip);
    };

    app->start;
}

my $web = Test::Mojo->new;
my $xff = 'X-Forwarded-For';

$web->get_ok('/')
    ->content_is('127.0.0.1');

$web->get_ok('/', { $xff => '192.0.2.1' })
    ->content_is('192.0.2.1');

$web->get_ok('/', { $xff => '192.0.2.2' })
    ->content_is('127.0.0.1');



( run in 0.331 second using v1.01-cache-2.11-cpan-5f2e87ce722 )