2012-03-02 9 views
5

Ho uno script che dovrebbe essere in grado di effettuare alcune chiamate a un servizio con diversi indirizzi IP. Il mio codice funziona quando non impostare qualsiasi ip alle mie chiamate, ho scritto una funzione per assegnare un IP all'oggetto prima di fare chiamate, ma restituisce un errore:Perché non riesco ad assegnare un IP a LWP :: UserAgent?

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

Questa è la mia struttura di funzioni:

#!/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(); 
} 

E questo è il modo in cui li chiamo:

set_caller_ip($caller_ip_address); 

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

sai qual è il problema ?!

Grazie per il vostro aiuto in anticipo!

risposta

8

L'attributo local_address è stato aggiunto in LWP::UserAgent versione 5.834. Potresti usare una versione precedente?

Prova:

use LWP::UserAgent 5.834; # need local_address 

(Ogni volta che specificare una versione minima di un modulo, provo ad aggiungere un breve commento che spiega il motivo per cui questa è la versione minima.)

+0

grazie per il suggerimento! è davvero possibile !!! fammi controllare la versione! – Monica

+0

hai assolutamente ragione ... Grazie amico! Ero alle prese con questo problema per 3 ore ... E in realtà non sono un amministratore di sistema quindi ora dovrei imparare come aggiornare questo modulo !!! comunque ... grazie per il vostro aiuto :) – Monica

+1

@Monica, quando vedete che il messaggio 'Can not locate object method', ci sono fondamentalmente 3 opzioni: avete sbagliato a digitare il nome del metodo, avete il tipo di oggetto sbagliato , o la versione del modulo non corrisponde alla documentazione che stai leggendo (e l'API è cambiata). – cjm

1

@cjm ha già risposto alla domanda sul tuo errore, ma potrebbe essere utile notare un'alternativa per le versioni precedenti di LWP :: UserAgent.

C'è una funzione (o almeno sotto) documentata di LWP :: Protocol :: http che consente di impostare "opzioni extra di socket". Sto facendo questo nel mio codice (usando 5,824), e funziona:

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

lo stesso codice in LWP/Protocollo/http.pm sembra esistere anche in un LWP molto più vecchio installato con Perl 5.8 su un vecchio sistema RHEL4, quindi è stato intorno un po '... :-)

Problemi correlati