package Ranges; use strict; use warnings; use Apache2::Const qw(OK NOT_FOUND HTTP_PARTIAL_CONTENT); use File::Basename; use Data::Dumper; sub send_pkgitem { my ($r) = @_; my $fh = "/tmp/test.pdf" my $attach_name = basename($fh); my $content_size = -s $fh; my $start_range = 0; my $end_range = $content_size - 1; my $range = "$start_range"."-"."$end_range".'/'."$content_size"; $r->headers_out->set('Accept-Ranges' => 'bytes'); #causes a server 500 response error when set.. $r->set_content_length(-s $pkgitem->{real_path}); $r->headers_out->set('Content-Range' => "$range"); $r->headers_out->set('Content-Disposition' => "inline; filename=\"$attach_name\""); $r->set_last_modified; $r->content_type($pkgitem->{mimetype}); warn "HEADERS_OUT Dumper:\n"; warn Dumper($r->headers_out); unless ((my $status = $r->meets_conditions) == OK) { return $status; } return OK if $r->header_only; warn "HEADERS_IN dumper:\n"; warn Dumper($r->headers_in); warn "range request = $range\n"; warn "content_size = $content_size, end_range = $end_range\n"; my $bytes_total = $end_range; my $buff_size = 65536; my $buff_len = $buff_size; warn "bytes_total = $bytes_total\n"; if ($content_size < $buff_len) { $r->sendfile($fh); } else #process range request { warn "RANGE BLOCK:\n"; my $offset = 0; my $totalbytes_sent = 0; while ($totalbytes_sent <= $end_range) { warn "sendfile -> $fh,$offset,$buff_len\n"; $r->sendfile($fh,$offset,$buff_len); last if ($bytes_total <= 0); $bytes_total -= $buff_len; $buff_len = $bytes_total,$bytes_total = 0 if $buff_len > $bytes_total; $totalbytes_sent += $buff_len; if ($bytes_total == 0) { $offset += $buff_size; } else { $offset = $totalbytes_sent; } warn "bytes_total = $bytes_total, totalbytes_sent = $totalbytes_sent\n"; } } return OK; } 1;