summaryrefslogtreecommitdiffstats
path: root/perl-install/install/http.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/install/http.pm')
-rw-r--r--perl-install/install/http.pm78
1 files changed, 34 insertions, 44 deletions
diff --git a/perl-install/install/http.pm b/perl-install/install/http.pm
index bf59c273b..db111564c 100644
--- a/perl-install/install/http.pm
+++ b/perl-install/install/http.pm
@@ -1,30 +1,25 @@
-package install::http; # $Id$
+package install::http;
-use IO::Socket;
-
-my $sock;
-
-
-sub close() {
- $sock->close if $sock;
-}
+use urpm::download;
+use common;
+use Cwd;
sub getFile {
- my ($url) = @_;
- my ($_size, $fh) = get_file_and_size($url) or return;
+ my ($url, %o_options) = @_;
+ my ($_size, $fh) = get_file_and_size($url, %o_options) or return;
$fh;
}
-sub parse_url {
+sub parse_http_url {
my ($url) = @_;
- $url =~ m,^(?:http|ftp)://([^/:]+)(?::(\d+))?(/\S*)?$,;
+ $url =~ m,^(?:https?|ftp)://(?:[^:/]+:[^:/]+\@)?([^/:@]+)(?::(\d+))?(/\S*)?$,;
}
sub get_file_and_size_ {
my ($f, $url) = @_;
if ($f =~ m!^/!) {
- my ($host, $port, $_path) = parse_url($url);
+ my ($host, $port, $_path) = parse_http_url($url);
get_file_and_size("http://$host" . ($port ? ":$port" : '') . $f);
} else {
get_file_and_size("$url/$f");
@@ -32,43 +27,38 @@ sub get_file_and_size_ {
}
sub get_file_and_size {
- local ($^W) = 0;
-
- my ($url) = @_;
- $sock->close if $sock;
+ my ($url, %o_options) = @_;
# can be used for ftp urls (with http proxy)
- my ($host, $port, $path) = parse_url($url);
+ my ($host) = parse_http_url($url);
defined $host or return undef;
- my $use_http_proxy = $ENV{PROXY} && $ENV{PROXYPORT};
-
- $sock = IO::Socket::INET->new(PeerAddr => $use_http_proxy ? $ENV{PROXY} : $host,
- PeerPort => $use_http_proxy ? $ENV{PROXYPORT} : $port || 80,
- Proto => 'tcp',
- Timeout => 60) or die "can not connect $@";
- $sock->autoflush;
- print $sock join("\015\012" =>
- "GET " . ($use_http_proxy ? $url : $path) . " HTTP/1.0",
- "Host: $host" . ($port && ":$port"),
- "User-Agent: DrakX/vivelinuxabaszindozs",
- "", "");
+ my $urpm = $::o->{packages};
+ if (!$urpm) {
+ require install::pkgs;
+ $urpm = install::pkgs::empty_packages($::o->{keep_unrequested_dependencies});
+ $urpm->{options}{'curl-options'} = '-s';
+ }
- #- skip until empty line
- my $now = 0;
- my ($last, $buf, $tmp);
- my $read = sub { sysread($sock, $buf, 1) or die ''; $tmp .= $buf };
- do {
- $last = $now;
- &$read; &$read if $buf =~ /\015/;
- $now = $buf =~ /\012/;
- } until $now && $last;
+ my $cachedir = $urpm->{cachedir} || '/root';
+ my $file = $url;
+ $file =~ s!.*/!$cachedir/!;
+ unlink $file; # prevent "partial file" errors
+
+ if ($ENV{PROXY}) {
+ my ($proxy, $port) = urpm::download::parse_http_proxy(join(':', $ENV{PROXY}, $ENV{PROXYPORT}))
+ or die "bad proxy declaration\n";
+ $proxy .= ":1080" unless $port;
+ urpm::download::set_cmdline_proxy(http_proxy => "http://$proxy/");
+ }
+
+ my $res = eval { urpm::download::sync_url($urpm, $url, %o_options, dir => $cachedir) };
- if ($tmp =~ /^(.*\b(\d+)\b.*)/ && $2 == 200) {
- my ($size) = $tmp =~ /^Content-Length:\s*(\d+)\015?$/m;
- $size, $sock;
+ if ($res) {
+ open(my $f, $file);
+ (-s $file, $f);
} else {
- log::l("HTTP error: $1");
+ log::l("retrieval of [$file] failed");
undef;
}
}