App-cpangitify
view release on metacpan or search on metacpan
t/lib/Test2/Plugin/HTTPTinyFile.pm view on Meta::CPAN
package Test2::Plugin::HTTPTinyFile;
use strict;
use warnings;
use 5.020;
use experimental qw( signatures );
use HTTP::Tiny;
use HTTP::Date qw( time2str );
use URI;
use Test2::API qw( context );
my $request_method = \&HTTP::Tiny::request;
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;
}
( run in 0.963 second using v1.01-cache-2.11-cpan-140bd7fdf52 )