summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorespie <espie@openbsd.org>2011-07-19 17:27:43 +0000
committerespie <espie@openbsd.org>2011-07-19 17:27:43 +0000
commit1eb63decdcd74782be1475714f81a531a2a3c1d5 (patch)
treef0a84a5a608e0401f18ada2488486acae73aceca
parentrandom seed handling can now be done fairly early, well, as soon as (diff)
downloadwireguard-openbsd-1eb63decdcd74782be1475714f81a531a2a3c1d5.tar.xz
wireguard-openbsd-1eb63decdcd74782be1475714f81a531a2a3c1d5.zip
clean-up a few things
-rwxr-xr-xusr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm138
1 files changed, 85 insertions, 53 deletions
diff --git a/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm b/usr.sbin/pkg_add/OpenBSD/PackageRepository/HTTP.pm
index 96469616707..8b517dc4f1b 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.8 2011/07/18 21:09:17 espie Exp $
+# $OpenBSD: HTTP.pm,v 1.9 2011/07/19 17:27:43 espie Exp $
#
# Copyright (c) 2011 Marc Espie <espie@openbsd.org>
#
@@ -47,6 +47,20 @@ sub initiate
}
}
+package _Proxy::Header;
+
+sub new
+{
+ my $class = shift;
+ bless {}, $class;
+}
+
+sub code
+{
+ my $self = shift;
+ return $self->{code};
+}
+
package _Proxy::Connection;
sub new
{
@@ -61,6 +75,50 @@ sub new
bless {fh => $o, host => $host, buffer => ''}, $class;
}
+sub send_header
+{
+ my ($o, $document, %extra) = @_;
+ my $crlf="\015\012";
+ $o->print("GET $document HTTP/1.1", $crlf,
+ "Host: ", $o->{host}, $crlf);
+ if (defined $extra{range}) {
+ my ($a, $b) = @{$extra{range}};
+ $o->print("Range: bytes=$a-$b", $crlf);
+ }
+ $o->print($crlf);
+}
+
+sub get_header
+{
+ my $o = shift;
+ my $_ = $o->getline;
+ if (!m,^HTTP/1\.1\s+(\d\d\d),) {
+ return undef;
+ }
+ my $h = _Proxy::Header->new;
+ $h->{code} = $1;
+ while ($_ = $o->getline) {
+ last if m/^$/;
+ if (m/^([\w\-]+)\:\s*(.*)$/) {
+ $h->{$1} = $2;
+ } else {
+ print STDERR "unknown line: $_\n";
+ }
+ }
+ if (defined $h->{'Content-Length'}) {
+ $h->{length} = $h->{'Content-Length'}
+ } elsif (defined $h->{'Transfer-Encoding'} &&
+ $h->{'Transfer-Encoding'} eq 'chunked') {
+ $h->{chunked} = 1;
+ }
+ if (defined $h->{'Content-Range'} &&
+ $h->{'Content-Range'} =~ m/^bytes\s+(\d+)\-(\d+)\/(\d+)/) {
+ ($h->{start}, $h->{end}, $h->{size}) = ($1, $2, $3);
+ }
+ $o->{header} = $h;
+ return $h;
+}
+
sub getline
{
my $self = shift;
@@ -106,19 +164,23 @@ sub retrieve_response
{
my ($self, $h) = @_;
- if (defined $h->{'Content-Length'}) {
- return $self->retrieve($h->{'Content-Length'});
- }
- if (($h->{'Transfer-Encoding'}//'') eq 'chunked') {
+ if ($h->{chunked}) {
return $self->retrieve_chunked;
}
+ if ($h->{length}) {
+ return $self->retrieve($h->{length});
+ }
return undef;
}
sub print
{
my ($self, @l) = @_;
- print {$self->{fh}} @l;
+# print STDERR "Before print\n";
+ if (!print {$self->{fh}} @l) {
+ print STDERR "network print failed with $!\n";
+ }
+# print STDERR "After print\n";
}
package _Proxy;
@@ -158,33 +220,19 @@ sub get_directory
{
my ($o, $dname) = @_;
local $SIG{'HUP'} = 'IGNORE';
- my $crlf="\015\012";
- $o->print("GET $dname/ HTTP/1.1", $crlf,
- "Host: ", $o->{host}, $crlf, $crlf);
- # get header
-
- my $_ = $o->getline;
- if (!m,^HTTP/1\.1\s+(\d\d\d),) {
- print "ERROR\n";
- return;
- }
- my $code = $1;
- my $h = {};
- while ($_ = $o->getline) {
- last if m/^$/;
- if (m/^([\w\-]+)\:\s*(.*)$/) {
- print STDERR "$1 => $2\n";
- $h->{$1} = $2;
- } else {
- print STDERR "unknown line: $_\n";
- }
+ $o->send_header("$dname/");
+ my $h = $o->get_header;
+ if (!defined $h) {
+ print "ERROR: can't decode header\n";
+ exit 1;
}
+
my $r = $o->retrieve_response($h);
if (!defined $r) {
print "ERROR: can't decode response\n";
}
- if ($code != 200) {
- print "ERROR: code was $code\n";
+ if ($h->code != 200) {
+ print "ERROR: code was ", $h->code, "\n";
exit 1;
}
print "SUCCESS: directory $dname\n";
@@ -204,7 +252,6 @@ sub get_file
{
my ($o, $fname) = @_;
- my $crlf="\015\012";
my $bailout = 0;
$SIG{'HUP'} = sub {
$bailout++;
@@ -217,30 +264,19 @@ sub get_file
do {
$end *= 2;
- $o->print("GET $fname HTTP/1.1", $crlf,
- "Host: ", $o->{host}, $crlf,
- "Range: bytes=",$start, "-", $end-1, $crlf, $crlf);
- # get header
-
- my $_ = $o->getline;
- if (!m,^HTTP/1\.1\s+(\d\d\d),) {
+ $o->send_header($fname, range => [$start, $end-1]);
+ my $h = $o->get_header;
+ if (!defined $h) {
print "ERROR\n";
exit 1;
}
- my $code = $1;
- my $h = {};
- while ($_ = $o->getline) {
- last if m/^$/;
- if (m/^([\w\-]+)\:\s*(.*)$/) {
- print STDERR "$1 => $2\n";
- $h->{$1} = $2;
- } else {
- print STDERR "unknown line: $_\n";
- }
+ if (defined $h->{size}) {
+ $total_size = $h->{size};
}
- if (defined $h->{'Content-Range'} && $h->{'Content-Range'} =~
- m/^bytes\s+\d+\-\d+\/(\d+)/) {
- $total_size = $1;
+ if ($h->code != 200 && $h->code != 206) {
+ print "ERROR: code was ", $h->code, "\n";
+ my $r = $o->retrieve_response($h);
+ exit 1;
}
if ($first) {
print "TRANSFER: $total_size\n";
@@ -250,10 +286,6 @@ sub get_file
if (!defined $r) {
print "ERROR: can't decode response\n";
}
- if ($code != 200 && $code != 206) {
- print "ERROR: code was $code\n";
- exit 1;
- }
print $fh $r;
$start = $end;
if ($bailout) {