AxKit2
view release on metacpan or search on metacpan
lib/AxKit2/HTTPHeaders.pm view on Meta::CPAN
=cut
sub res_keep_alive {
my AxKit2::HTTPHeaders $self = $_[0];
my AxKit2::HTTPHeaders $req = $_[1];
my $is_options = $_[2];
Carp::confess("ASSERT: No request headers given") unless $req || $is_options;
# get the connection header now (saves warnings later)
my $conn = lc ($self->header('Connection') || '');
# if they said Connection: close, it's always not keep-alive
return 0 if $conn =~ /\bclose\b/i;
# handle the http 1.0/0.9 case which requires keep-alive specified
if ($self->version_number < 1001) {
# must specify keep-alive, and must have a content length OR
# the request must be a head request
return 1 if
$conn =~ /\bkeep-alive\b/i &&
($is_options ||
defined $self->header('Content-length') ||
$req->request_method eq 'HEAD' ||
$self->response_code == 304 || # not modified
$self->response_code == 204
); # no content
return 0;
}
# HTTP/1.1 case. defaults to keep-alive, per spec, unless
# asked for otherwise (checked above)
# FIXME: make sure we handle a HTTP/1.1 response from backend
# with connection: close, no content-length, going to a
# HTTP/1.1 persistent client. we'll have to add chunk markers.
# (not here, obviously)
return 1;
}
=head2 C<< $obj->range( SIZE ) >>
Given a size, returns C<STATUS, RANGE_START, RANGE_END>.
Status will be one of:
=over 4
=item * 200 - Invalid or non-existant range header. Serve normally.
=item * 206 - Parsable range is good. Serve partial content.
=item * 416 - Range is unsatisfiable.
=back
=cut
sub range {
my AxKit2::HTTPHeaders $self = $_[0];
my $size = $_[1];
my $not_satisfiable;
my $range = $self->header("Range");
return 200 unless
$range &&
defined $size &&
$range =~ /^bytes=(\d*)-(\d*)$/;
my ($range_start, $range_end) = ($1, $2);
undef $range_start if $range_start eq '';
undef $range_end if $range_end eq '';
return 200 unless defined($range_start) or defined($range_end);
if (defined($range_start) and defined($range_end) and $range_start > $range_end) {
return 416;
} elsif (not defined($range_start) and defined($range_end) and $range_end == 0) {
return 416;
} elsif (defined($range_start) and $size <= $range_start) {
return 416;
}
$range_start = 0 unless defined($range_start);
$range_end = $size - 1 unless defined($range_end) and $range_end < $size;
return (206, $range_start, $range_end);
}
1;
( run in 2.533 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )