use vars qw($VERSION );
$VERSION = "0.1";
sub new {
my $proto = shift;
my $self = { };
bless($self,$proto);
$self->{URL} = shift if ($#_ > -1);
$self->Reload();
return $self;
}
##############################################################################
#
# FindProxy - wrapper for FindProxyForURL function so that you don't have to
# figure out the host.
#
##############################################################################
sub FindProxy {
my $self = shift;
my ($url) = @_;
my ($host) = ($url =~ /^(\S*\:?\/?\/?[^\/:]+)/);
$host =~ s/^[^\:]+\:\/\///;
foreach my $proxy (split(/\s*\;\s*/,$self->FindProxyForURL($url,$host))) {
return $proxy if ($proxy eq "DIRECT");
my ($host,$port) = ($proxy =~ /^PROXY\s*(\S+):(\d+)$/);
return $proxy if (new IO::Socket::INET(PeerAddr=>$host,
PeerPort=>$port,
Proto=>"tcp"));
}
return undef;
}
##############################################################################
#
# Reload - grok the environment variables and define the FindProxyForURL
# function.
#
##############################################################################
sub Reload {
my $self = shift;
my $url = (exists($self->{URL}) ? $self->{URL} : $ENV{"http_auto_proxy"});
if (defined($url) && ($url ne "")) {
my ($host,$port,$path) = ($url =~ /^http:\/\/([^\/:]+):?(\d*)\/?(.*)$/);
$port = 80 if ($port eq "");
my $sock = new IO::Socket::INET(PeerAddr=>$host,
PeerPort=>$port,
Proto=>"tcp");
die("Cannot create normal socket: $!") unless defined($sock);
my $send = "GET /$path HTTP/1.1\r\nCache-Control: no-cache\r\nHost: $host:$port\r\n\r\n";
$sock->syswrite($send,length($send),0);
my $buff;
my $status = 1;
my $function = "";
while($status > 0) {
$status = $sock->sysread($buff,POSIX::BUFSIZ);
$function .= $buff;
}
my $chunked = ($function =~ /chunked/);
$function =~ s/^.+?\r?\n\r?\n//s;
if ($chunked == 1) {
$function =~ s/\n\r\n\S+\s*\r\n/\n/g;
$function =~ s/^\S+\s*\r\n//;
}
$function = $self->JavaScript2Perl($function);
eval($function);
} else {
my $http_host;
my $http_port;
my $function = "sub FindProxyForURL { my (\$self,\$url,\$host) = \@_; ";
$function .= "if (isResolvable(\$host)) { return \"DIRECT\"; } ";
if (exists($ENV{http_proxy})) {
($http_host,$http_port) = ($ENV{"http_proxy"} =~ /^(\S+)\:(\d+)$/);
$http_host =~ s/^http\:\/\///;
$function .= "if (shExpMatch(\$url,\"http://*\")) { return \"PROXY $http_host\:$http_port\"; } ";
}
if (exists($ENV{https_proxy})) {
=2= |