Почему я не могу назначить IP для LWP :: UserAgent? - PullRequest
5 голосов
/ 03 марта 2012

У меня есть скрипт, который должен быть в состоянии делать некоторые вызовы в службу с разными IP-адресами. Мой код работает, когда я не устанавливаю ip для своих вызовов, я написал функцию для назначения IP-объекта перед выполнением вызовов, но он возвращает ошибку:

Can't locate object method "local_address" via package "LWP::UserAgent"

Это моя структура функций:

#!/usr/bin/perl -w

use LWP::UserAgent;
use HTTP::Headers;
use HTTP::Request::Common;
use HTTP::Cookies;
use URI::Escape;
use HTML::LinkExtor;

# set user agent object values
my $ua = new LWP::UserAgent;
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.10) Gecko/20050716 Firefox/1.0.6');
push @{ $ua->requests_redirectable }, 'POST';
$ua->cookie_jar({});


sub set_caller_ip {
    my($set_ip_address) = @_;

    $ua->local_address("$set_ip_address");
    return 1;
}


sub test_caller_ip {

    my $req = new HTTP::Request('GET', 'http://whatismyip.org/');
    $req->headers->push_header('Connection','Keep-Alive');
    $req->headers->push_header('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8');
    my $res = $ua->request($req) or die "$!";

    return $res->content();
}

И вот как я их называю:

set_caller_ip($caller_ip_address);

$caller_ip_tested = test_caller_ip();
print "\$caller_ip_tested=".$caller_ip_tested."\n";die;

Вы знаете, в чем проблема?!

Заранее спасибо за помощь!

Ответы [ 2 ]

8 голосов
/ 03 марта 2012

Атрибут local_address был добавлен в LWP :: UserAgent версия 5.834. Не могли бы вы использовать более старую версию?

Попробуйте:

use LWP::UserAgent 5.834; # need local_address

(Когда бы я ни указывал минимальную версию для модуля, я стараюсь добавить краткий комментарий, объясняющий, почему это минимальная версия.)

1 голос
/ 02 апреля 2013

@ cjm уже ответил на вопрос о вашей ошибке, но, возможно, было бы полезно отметить альтернативу для более старых версий LWP :: UserAgent.

Там нет (или, по крайней мере, недостаточно) задокументированоособенность LWP :: Protocol :: http, которая позволяет вам устанавливать «дополнительные параметры сокетов».Я делаю это в своем коде (используя 5.824), и он работает:

@LWP::Protocol::http::EXTRA_SOCK_OPTS = { LocalAddr => "10.11.12.13" };

Тот же код в LWP / Protocol / http.pm, кажется, также существует в гораздо более старом LWP, установленном с Perl 5.8на старой системе RHEL4, так что это было какое-то время ...: -)

...