IxNetwork

 view release on metacpan or  search on metacpan

lib/IxNetwork/IxNetwork.pm  view on Meta::CPAN

}

sub _log {
    my $self = shift;
    my $msg = shift;

    if ($self->{_debug}) {
        my $now = localtime(time);
        if (length($msg) > 1024) {
            $msg = substr($msg, 0, 1024)."...\n";
        }
        print '['.$now.'] [IxNet] [debug] '.$msg;
    }
}

sub _detectTransport {
    my ($self, $hostname, $port) = @_;

    $self->_log("Detecting transport type...\n");
    my $_socket = undef;
    my $_transport = undef;
    my $usingDefaultPorts = undef;
    if (not defined $port) {
        $port = 8009;
        $usingDefaultPorts = 1;
    } else {
        $usingDefaultPorts = 0;
    }

    my $ret = eval {      
        my $inetAddress = undef;
        my $sockAddress = undef;
        if (validate::isIpv6($hostname) == 0) {
            # connect to IPv4 address (or a host name).
            my $protocol = getprotobyname('tcp');
            socket($_socket, Socket::AF_INET, Socket::SOCK_STREAM, $protocol);
            my $inetAddress = gethostbyname($hostname);
            my $sockAddress = Socket::sockaddr_in($port, $inetAddress);
            $_socket->blocking(0);
            CORE::connect($_socket, $sockAddress);
        } else {
            # connect to a IPv6 address.
            if (!$checkDependencies::ipv6LoadError) {
                require LWP::Protocol::INET6;
                $_socket = LWP::Protocol::INET6->new(
                        PeerAddr => $hostname,
                        PeerPort => $port,
                        Proto    => 'tcp',
                )
                or die("Unknown Ipv6 address $hostname\n");
            } else {
                die("Unable to load perl IPv6 module\n");
            }
        }

        my $sock = $_socket;
        my $rin = '';
        my $win = '';
        my $buffer = '';
        my $timeout = 15;
        my $iterations = 2;
        vec($rin, fileno($sock), 1) = 1;
        vec($win, fileno($sock), 1) = 1;
        my $ein= $rin | $win;
        my $socketOpen = select(my $rout = $rin, my $wout = $win, my $eout = $ein, 1);
        while ($iterations > 0 and !$socketOpen) {
            $socketOpen = select(my $rout = $rin, my $wout = $win, my $eout = $ein, 1);
            $iterations -= 1;
        }
        if (!$socketOpen) {
            die "Host is unreachable.\n";
        }
        $_socket->blocking(1);
            
        vec($rin, fileno($sock), 1) = 1;
        my $readOpen = select(my $rout = $rin, undef, undef, $timeout);
        if (!$readOpen) {
            vec($win, fileno($sock), 1) = 1;
            my $writeOpen = select(undef, my $wout = $win, undef, $timeout);
            if ($writeOpen) {
                $_transport = $self->{__ixNetworkSecure};
            }
        }
        my $char = undef;
        $_socket->blocking(0);
        while(not defined $_transport) {
            $_socket->read($char, 1);    

            if (length($char) == 0) {
                last;
            }
            $buffer .= $char;
            if (length $buffer == 4) {
                if (index($buffer, '<001') == 0) {
                    $_transport = $self->{__ixNetworkLegacy};
                    last;
                } elsif (index($buffer, 'HTTP') != 0) {
                    $_transport = $self->{__ixNetworkSecure};
                    last;
                }
            }
            if ((length $buffer > 50) && 
                (index($buffer, 'Server: IxNetwork API Server') != -1) ||
                (index($buffer, 'Server: Connection Manager') != -1)) {
                    $_transport = $self->{__ixNetworkLegacy};
                    last;
            }
        }
        1;
    };
    if (!$ret and $@) {
        if ($_socket) {
            $_socket->close();
            $_socket = undef;
        }
        if (!$usingDefaultPorts) {
            die "Unable to connect to ".$hostname.':'.$port.'. Error: '.$@."\n";
        }
    }
    if ($_socket) {
        $_socket->close();
    }
    if ($usingDefaultPorts and (not defined $_transport)) {
        $_transport = $self->{__ixNetworkSecure};
    }
    if (not defined $_transport) {
        if (!$usingDefaultPorts) {
            die "Unable to connect to ".$hostname.':'.$port.". Error: Host is unreachable.\n";    



( run in 0.805 second using v1.01-cache-2.11-cpan-71847e10f99 )