2012-03-02 13 views
5

Tengo un script que debería poder hacer algunas llamadas a un servicio con diferentes direcciones IP. Mi código funciona cuando no puse ninguna ip a mis llamadas, escribí una función para asignar una dirección IP al objeto antes de hacer llamadas, pero devuelve un error:¿Por qué no puedo asignar una IP a LWP :: UserAgent?

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

Ésta es mi estructura de funciones:

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

Y este es el camino que yo les llamo:

set_caller_ip($caller_ip_address); 

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

¿usted sabe cuál es el problema ?!

Gracias por su ayuda con anticipación!

Respuesta

8

El atributo local_address se añadió en LWP::UserAgent versión 5.834. ¿Podría estar usando una versión anterior?

Probar:

use LWP::UserAgent 5.834; # need local_address 

(Siempre que puedo especificar una versión mínima para un módulo, trato de añadir un breve comentario explicando por qué esa es la versión mínima.)

+0

gracias por la pista! ¡eso es realmente posible! déjame revisar la versión! – Monica

+0

tienes toda la razón ... gracias hombre! Estuve luchando con este problema durante 3 horas ... ¡Y en realidad no soy administrador de sistemas, así que ahora debo aprender cómo actualizar este módulo! de todos modos ... gracias por su ayuda :) – Monica

+1

@Monica, cuando ve ese mensaje 'No se puede encontrar el método del objeto', básicamente hay 3 opciones: ha escrito mal el nombre del método, tiene el tipo equivocado de objeto , o la versión del módulo no coincide con la documentación que está leyendo (y la API ha cambiado). – cjm

1

@cjm ya ha respondido a la pregunta acerca de su error, pero podría ser útil tener en cuenta una alternativa para versiones anteriores de LWP :: UserAgent.

Hay una característica no documentada (o al menos infra) de LWP :: Protocol :: http que le permite establecer "opciones de socket adicionales". Estoy haciendo esto en mi código (con 5.824), y funciona:

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

El mismo código en LWP/Protocolo/http.pm parece existir también en un LWP mucho más antiguo instalado con el Perl 5.8 en una viejo sistema RHEL4, por lo que ha sido por un tiempo ... :-)

Cuestiones relacionadas