Почему я не могу назначить ip-адрес LWP:: UserAgent?
У меня есть скрипт, который должен быть в состоянии сделать несколько вызовов к службе с различными 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 ответа:
Атрибут
local_address
был добавлен вLWP::UserAgent версии 5.834. Может быть, вы используете более старую версию?Попробуйте:
use LWP::UserAgent 5.834; # need local_address
(всякий раз, когда я указываю минимальную версию для модуля, я пытаюсь добавить краткий комментарий, объясняющий, почему это минимальная версия.)
@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, так что он был вокруг какое-то время... :- )