App-cpangitify
view release on metacpan or search on metacpan
t/lib/Test2/Plugin/HTTPTinyFile.pm view on Meta::CPAN
my $request_wrapper = sub ($self, $method, $url, $args)
{
# TODO options to support 'If-Modified-Since' see PAUSE::Packages
my $uri = URI->new($url);
my $ctx = context();
$ctx->note("HTTP::Tiny $method $url");
if($uri->scheme eq 'file')
{
tie my %headers, 'Test::HTTPTinyFile::ResponseHeaderTie';
my $path = $uri->path;
$path =~ s{^/([A-Za-z]:)}{$1} if $^O eq 'MSWin32';
my $result = { url => $url, content => '', headers => \%headers }; # TODO include some headers
my $content = '';
if($method =~ /(GET|HEAD)/)
{
if(-d $path)
{
die "TODO";
}
elsif(-r $path)
{
if($method eq 'GET')
{
eval {
use autodie;
open my $fh, '<', $path;
binmode $fh;
local $/;
$content = <$fh> if $method eq 'GET';
close $fh;
};
if($@)
{
$result->{success} = 0;
$result->{status} = 599;
$result->{reason} = 'Internal Exception';
}
}
unless(defined $result->{success})
{
$result->{success} = 1;
$result->{status} = 200;
$result->{reason} = 'OK';
$headers{'last-modified'} = time2str((stat $path)[9]);
}
}
elsif(-e $path)
{
$result->{success} = 0;
$result->{status} = 403;
$result->{reason} = 'Forbidden';
}
else
{
$result->{success} = 0;
$result->{status} = 404;
$result->{reason} = 'Not Found';
}
}
elsif($method eq 'POST')
{
die "TODO";
}
elsif($method eq 'PUT')
{
die "TODO";
}
elsif($method eq 'DELETE')
{
die "TODO";
}
else
{
die "unknown HTTP method: $method";
}
$ctx->note("HTTP::Tiny ", join(' ', $result->{success}, $result->{status}, $result->{reason}));
if($args->{data_callback})
{
$args->{data_callback}->($content, $result);
}
else
{
$result->{content} = $content;
}
$ctx->release;
return $result;
}
else
{
$request_method->($self, $method, $url, $args);
}
};
do { no warnings; *HTTP::Tiny::request = $request_wrapper };
package
Test::HTTPTinyFile::ResponseHeaderTie;
use Test2::API qw( context );
sub TIEHASH ($class)
{
bless {}, $class;
}
sub FETCH ($self, $key)
{
my $ctx = context();
$ctx->note("header FETCH $key");
$ctx->release;
$self->{$key};
}
sub STORE ($self, $key, $value)
{
my $ctx = context();
( run in 2.137 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )