tokuhirom's Blog

Shipped LWPx::ParanoidHandler/Net::DNS::Paranoid, alternative for LWPx::ParanoidAgent!!

LWPx::ParanoidAgent is not maintained well. Known issue was added at 3 years ago, but it's not resolved https://rt.cpan.org/Public/Bug/Display.html?id=44569.

I wrote a brand new LWPx::ParanoidHandler, most of code was taken from LWPx::ParanoidAgent, but it have better interface, and it is not replaces most part of LWP::UserAgent. It' using LWP's handler API.

You can use it very easily.

use LWPx::ParanoidHandler; # ← exports make_paranoid function

my $ua = LWP::UserAgent->new();
make_paranoid($ua);

And I split a most of features from LWP. It provides Net::DNS::Paranoid module. Here is complete example.

    my $dns = Net::DNS::Paranoid->new();
    $dns->blocked_hosts([
        'mixi.jp',
        qr{\.dev\.example\.com$},
    ]);
    $dns->whitelisted_hosts([
        'twitter.com',
    ]);
    my ($addrs, $errmsg) = $dns->resolve('mixi.jp');
    if ($addrs) {
        print @$addrs, $/;
    } else {
        die $errmsg;
    }

Then, you can use this module with all of the network related modules like Furl, Net::*, etc...
e.g. You can set the inet_aton arguments to use Net::DNS::Paranoid with Furl.

use Furl::HTTP;
use Net::DNS::Paranoid;

my $resolver = Net::DNS::Paranoid->new();
my $furl = Furl->new(
    inet_aton => sub {
        my ($host, $errmsg) = $resolver->resolve($_[0], time(), $_[1]);
        die $errmsg unless $host;
        Socket::inet_aton($host->[0]);
    }
);
{
    my $res = $furl->get('http://example.com/');
    say $res->status_line;
}
{
    my $res = $furl->get('http://127.0.0.1/');
    say $res->status_line;
}

Enjoy!