2012-03-02 2 views
5

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

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; 

вы знаете, что этот вопрос ?!

Спасибо за вашу помощь заранее!

ответ

8

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

Try:

use LWP::UserAgent 5.834; # need local_address 

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

+0

спасибо за подсказку! это действительно возможно !!! позвольте мне проверить версию! – Monica

+0

вы абсолютно правы ... Спасибо человеку! Я боролся с этой проблемой в течение 3 часов ... И на самом деле я не администратор sys, поэтому теперь я должен научиться обновлять этот модуль !!! в любом случае ... спасибо за вашу помощь :) – Monica

+1

@Monica, когда вы видите сообщение 'Can not locate object method', есть 3 варианта: вы ошибочно написали имя метода, у вас есть неправильный тип объекта , или версия модуля не соответствует документации, которую вы читаете (и API изменился). – cjm

1

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

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

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

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

Смежные вопросы