73 lines
1.9 KiB
Perl
73 lines
1.9 KiB
Perl
use strict;
|
|
use warnings FATAL => 'all';
|
|
|
|
use Apache::Test;
|
|
use Apache::TestRequest ();
|
|
use Apache::TestCommon ();
|
|
|
|
# test merging of byte ranges
|
|
|
|
if (Apache::Test::need_min_apache_version("2.3.15")) {
|
|
Apache::TestCommon::run_files_test(\&verify, 1);
|
|
}
|
|
else {
|
|
plan tests => 0;
|
|
}
|
|
|
|
sub verify {
|
|
my($ua, $url, $file) = @_;
|
|
my $debug = $Apache::TestRequest::DebugLWP;
|
|
|
|
$url = Apache::TestRequest::resolve_url($url);
|
|
my $req = HTTP::Request->new(GET => $url);
|
|
|
|
my $total = 0;
|
|
my $chunk_size = 8192;
|
|
|
|
my $wanted = -s $file;
|
|
|
|
while ($total < $wanted) {
|
|
my $end = $total + $chunk_size;
|
|
if ($end > $wanted) {
|
|
$end = $wanted;
|
|
}
|
|
|
|
my $t1 = $total+1;
|
|
my $t10 = $total+5;
|
|
my $e1 = $end-1;
|
|
my $e20 = $end-10;
|
|
#my $range = "bytes=$total-$end";
|
|
my $range = "bytes=$t10-$end,$total-$e1,$t10-$e20,$total-$e1";
|
|
if ($end - $total < 15) {
|
|
# make sure to not send invalid ranges with start > end
|
|
$range = "bytes=$total-$end";
|
|
}
|
|
$req->header(Range => $range);
|
|
|
|
print $req->as_string if $debug;
|
|
|
|
my $res = $ua->request($req);
|
|
my $content_range = $res->header('Content-Range') || 'NONE';
|
|
|
|
$res->content("") if $debug and $debug == 1;
|
|
print $res->as_string if $debug;
|
|
|
|
if ($content_range =~ m:^bytes\s+(\d+)-(\d+)/(\d+):) {
|
|
my($start, $end, $total_bytes) = ($1, $2, $3);
|
|
$total += ($end - $start) + 1;
|
|
}
|
|
elsif ($total == 0 && $end == $wanted &&
|
|
$content_range eq 'NONE' && $res->code == 200) {
|
|
$total += $wanted;
|
|
}
|
|
else {
|
|
print "Range: $range\n";
|
|
print "Content-Range: $content_range\n";
|
|
last;
|
|
}
|
|
}
|
|
|
|
print "downloaded $total bytes, file is $wanted bytes\n";
|
|
|
|
ok $total == $wanted;
|
|
}
|