Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am testing my company's web site using LWP. We use DNS round robin to serve one URL from 8 IP addresses. I want to associate the data I collect with the right server so I'd like to capture the IP address of the server that was returned by DNS. Is there a method or property that returns this data? Do I need to use a lower level module than LWP? Any help would be much appreciated. PS. Simply testing each IP or host is not prefered.

Replies are listed 'Best First'.
Re: Get the IP Address
by Kanji (Parson) on Aug 26, 2003 at 23:17 UTC

    For HTTP requests, there's a Client-Peer header that you can access in the response...

    use LWP::UserAgent; use HTTP::Request::Common; my $url = 'http://www.perlmonks.org/'; my $browser = LWP::UserAgent->new; my $response = $browser->request( GET $url ); if ( $response->is_success ) { my($ip,$port) = split /:/, $response->header("Client-Peer"); print "Connected to $ip on port $port\n"; } else { print "Couldn't get $url: ", $response->status_line, "\n"; }

    ... although it dissappeared briefly before (and then re-appeared with) LWP 5.66, so you may need to upgrade, downgrade or hack LWP::Protocol::http if you find it's absent from the version you have installed.

        --k.


      Thanks for the reply! This is close but I need to have this work for unsuccessful connections as well. Any ideas on how to get the info if we fail to make a connection?
        Then I am not sure that LWP on its own is going to be the answer. You might have to query the DNS, record the IP and make the request using the IP.

        Thats how I have done it in the past.

        jdtoronto

Re: Get the IP Address
by esh (Pilgrim) on Aug 27, 2003 at 07:24 UTC

    I think what Abigail-II meant to imply may have been something like:

    #!/usr/bin/perl -w use strict; my $hostname = 'www.yahoo.com'; my ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname($hostname +); foreach my $addr ( @addrs ) { print join('.', unpack('C4', $addr)), "\n"; }

    (I didn't find gethostbyname's documentation to be intuitively obvious my first time, either.)

    Unfortunately, gethostbyname returns all of the IP addresses which could match, so it probably does not immediately solve your problem. You want to know which specific IP address was returned when LWP looked up the name to try to get the content.

    You may need to look up an IP address first (possibly using gethostbyname), then use the IP address instead of the hostname to make the LWP request. I.e., http://66.218.71.84/ instead of http://www.yahoo.com/

    However, if the web server requires the "Host:" HTTP header to contain the hostname in order to determine the content to return (as with virtual servers), then it could get more complicated still.

    Rather than trying to solve all possible problems, I'll let you go off and try things and come back if you run into specific roadblocks or questions.

    -- Eric Hammond

      Eric,

      Thank You for your reply! Your post sums up where I'm at and what I'm hoping to accomplish with this. I do indeed need to have the HTTP header use the hostname and not the IP.

      >"You want to know which specific IP address was returned when LWP looked up the name to try to get the content."

      The only thing I can think of would be to modify a lower module (the one which is actually performs the request lookup) and make that value available to LWP.

      Any suggestions?

        Here's the order I would try. You may like them in a different order or have better ideas.

        1. See if you can find a way to force LWP to pass a specific "Host:" header even though you are telling it what specific IP address to access in the URL.
        2. See if you can subclass something in LWP to be able to do your own DNS lookup, or to get access to the IP address resolved even when the request fails.
        3. Contact the LWP author(s) and see if they have suggestions or can modify the interface to support what you need.
        4. Write your own HTTP client, provided your needs are simple.
        5. Copy and edit the guts of LWP classes.

        -- Eric Hammond

Re: Get the IP Address
by Abigail-II (Bishop) on Aug 26, 2003 at 23:07 UTC
    gethostbyname

    Abigail

      Thank you for the reply. I'm not sure I understand what you are trying to tell me but I will take a closer look at the gethostbyname function.