diff options
Diffstat (limited to 'perl-install/install/http.pm')
-rw-r--r-- | perl-install/install/http.pm | 78 |
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; } } |