diff options
author | 2011-07-19 18:09:41 +0000 | |
---|---|---|
committer | 2011-07-19 18:09:41 +0000 | |
commit | 45c22c0a0114c77962502f4aa32927c776d36a87 (patch) | |
tree | b72d6b44e8eb05dfbe50983a32e8c31aeee5a3de | |
parent | use common code for ssh/http 1.1 (diff) | |
download | wireguard-openbsd-45c22c0a0114c77962502f4aa32927c776d36a87.tar.xz wireguard-openbsd-45c22c0a0114c77962502f4aa32927c776d36a87.zip |
mostly done
-rwxr-xr-x | usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm | 66 |
1 files changed, 53 insertions, 13 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm b/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm index 8b517dc4f1b..8702e1ece7f 100755 --- a/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm +++ b/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm @@ -1,6 +1,6 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: HTTP.pm,v 1.9 2011/07/19 17:27:43 espie Exp $ +# $OpenBSD: HTTP.pm,v 1.10 2011/07/19 18:09:41 espie Exp $ # # Copyright (c) 2011 Marc Espie <espie@openbsd.org> # @@ -19,7 +19,10 @@ use strict; use warnings; -package OpenBSD::Repository::HTTP; +use OpenBSD::PackageRepository::Persistant; + +package OpenBSD::PackageRepository::HTTP1; +our @ISA = qw(OpenBSD::PackageRepository::Persistant); sub urlscheme { return 'http'; @@ -29,14 +32,24 @@ sub initiate { my $self = shift; my ($rdfh, $wrfh); - pipe($self->{getfh}, $rdfh); - pipe($wrfh, $self->{cmdfh}); + pipe($self->{getfh}, $wrfh) or die; + pipe($rdfh, $self->{cmdfh}) or die; + + my $old =select $self->{getfh}; + $| = 1; + select $self->{cmdfh}; + $| = 1; + select $rdfh; + $| = 1; + select $wrfh; + $| = 1; + select $old; my $pid = fork(); if ($pid == 0) { close($self->{getfh}); close($self->{cmdfh}); - close(STDOUT); - close(STDIN); +# close(STDOUT); +# close(STDIN); open(STDOUT, '>&', $wrfh); open(STDIN, '<&', $rdfh); _Proxy::main($self); @@ -145,6 +158,25 @@ sub retrieve return $result; } +sub retrieve_and_print +{ + my ($self, $sz, $fh) = @_; + my $result = substr($self->{buffer}, 0, $sz); + print $fh $result; + my $retrieved = length($result); + if ($retrieved == $sz) { + $self->{buffer} = substr($self->{buffer}, $sz); + return; + } else { + $self->{buffer} = ''; + } + while ($retrieved < $sz) { + $self->{fh}->recv($result, $sz - $retrieved); + print $fh $result; + $retrieved += length($result); + } +} + sub retrieve_chunked { my $self = shift; @@ -173,6 +205,18 @@ sub retrieve_response return undef; } +sub retrieve_response_and_print +{ + my ($self, $h, $fh) = @_; + + if ($h->{chunked}) { + print $fh $self->retrieve_chunked; + } + if ($h->{length}) { + $self->retrieve_and_print($h->{length}, $fh); + } +} + sub print { my ($self, @l) = @_; @@ -209,7 +253,7 @@ sub batch(&) sub abort_batch() { if (defined $pid) { - kill 1, $pid; + kill HUP => $pid; waitpid($pid, 0); undef $pid; } @@ -260,7 +304,6 @@ sub get_file my $start = 0; my $end = 2000; my $total_size = 0; - open my $fh, ">", basename($fname); do { $end *= 2; @@ -282,11 +325,7 @@ sub get_file print "TRANSFER: $total_size\n"; $first = 0; } - my $r = $o->retrieve_response($h); - if (!defined $r) { - print "ERROR: can't decode response\n"; - } - print $fh $r; + $o->retrieve_response_and_print($h, \*STDOUT); $start = $end; if ($bailout) { exit 0; @@ -297,6 +336,7 @@ sub get_file sub main { my $self = shift; + my $_; my $o = _Proxy::Connection->new($self->{host}, "www"); while (<STDIN>) { chomp; |