}
$response->code;
}
sub getstore ($$)
{
my($url, $file) = @_;
_init_ua() unless $ua;
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request, $file);
$response->code;
}
sub mirror ($$)
{
my($url, $file) = @_;
_init_ua() unless $ua;
my $response = $ua->mirror($url, $file);
$response->code;
}
sub _get
{
my $url = shift;
my $ret;
if (!$FULL_LWP && $url =~ m,^http://([^/:\@]+)(?::(\d+))?(/\S*)?$,) {
my $host = $1;
my $port = $2 || 80;
my $path = $3;
$path = "/" unless defined($path);
return _trivial_http_get($host, $port, $path);
}
else {
_init_ua() unless $ua;
if (@_ && $url !~ /^\w+:/) {
# non-absolute redirect from &_trivial_http_get
my($host, $port, $path) = @_;
require URI;
$url = URI->new_abs($url, "http://$host:$port$path");
}
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);
return $response->is_success ? $response->content : undef;
}
}
sub _trivial_http_get
{
my($host, $port, $path) = @_;
#print "HOST=$host, PORT=$port, PATH=$path\n";
require IO::Socket;
local($^W) = 0;
my $sock = IO::Socket::INET->new(PeerAddr => $host,
PeerPort => $port,
Proto => 'tcp',
Timeout => 60) || return undef;
$sock->autoflush;
my $netloc = $host;
$netloc .= ":$port" if $port != 80;
print $sock join("\015\012" =>
"GET $path HTTP/1.0",
"Host: $netloc",
"User-Agent: lwp-trivial/$VERSION",
"", "");
my $buf = "";
my $n;
1 while $n = sysread($sock, $buf, 8*1024, length($buf));
return undef unless defined($n);
if ($buf =~ m,^HTTP/\d+\.\d+\s+(\d+)[^\012]*\012,) {
my $code = $1;
#print "CODE=$code\n$buf\n";
if ($code =~ /^30[1237]/ && $buf =~ /\012Location:\s*(\S+)/i) {
# redirect
my $url = $1;
return undef if $loop_check{$url}++;
return _get($url, $host, $port, $path);
}
return undef unless $code =~ /^2/;
$buf =~ s/.+?\015?\012\015?\012//s; # zap header
}
return $buf;
}
1;
__END__
=head1 NAME
=2= |