Catalyst-Runtime
view release on metacpan or search on metacpan
lib/Catalyst/Test.pm view on Meta::CPAN
app => sub { $args->{app}->({ %{ $_[0] }, %extra_env }) },
client => sub {
my ($psgi_app) = @_;
my $resp = $psgi_app->($request);
$args->{mangle_response}->($resp) if $args->{mangle_response};
$ret = $resp;
};
return $ret;
}
sub _local_request {
my $class = shift;
return _request({
app => ref($class) eq "CODE" ? $class : $class->_finalized_psgi_app,
mangle_response => sub {
my ($resp) = @_;
# HTML head parsing based on LWP::UserAgent
#
# This is because if you make a remote request with LWP, then the
# <BASE HREF="..."> from the returned HTML document will be used
# to fill in $res->base, as documented in HTTP::Response. We need
# to support this in local test requests so that they work 'the same'.
#
# This is not just horrible and possibly broken, but also really
# doesn't belong here. Whoever wants this should be working on
# getting it into Plack::Test, or make a middleware out of it, or
# whatever. Seriously - horrible.
if (!$resp->content_type || $resp->content_is_html) {
require HTML::HeadParser;
my $parser = HTML::HeadParser->new();
$parser->xml_mode(1) if $resp->content_is_xhtml;
$parser->utf8_mode(1) if $] >= 5.008 && $HTML::Parser::VERSION >= 3.40;
$parser->parse( $resp->content );
my $h = $parser->header;
for my $f ( $h->header_field_names ) {
$resp->init_header( $f, [ $h->header($f) ] );
}
}
# Another horrible hack to make the response headers have a
# 'status' field. This is for back-compat, but you should
# call $resp->code instead!
$resp->init_header('status', [ $resp->code ]);
},
}, @_);
}
my $agent;
sub _remote_request {
require LWP::UserAgent;
local $Plack::Test::Impl = 'ExternalServer';
unless ($agent) {
$agent = LWP::UserAgent->new(
keep_alive => 1,
max_redirect => 0,
timeout => 60,
# work around newer LWP max_redirect 0 bug
# http://rt.cpan.org/Ticket/Display.html?id=40260
requests_redirectable => [],
);
$agent->env_proxy;
}
my $server = URI->new($ENV{CATALYST_SERVER});
if ( $server->path =~ m|^(.+)?/$| ) {
my $path = $1;
$server->path("$path") if $path; # need to be quoted
}
return _request({
ua => $agent,
uri => $server,
mangle_request => sub {
my ($request) = @_;
# the request path needs to be sanitised if $server is using a
# non-root path due to potential overlap between request path and
# response path.
if ($server->path) {
# If request path is '/', we have to add a trailing slash to the
# final request URI
my $add_trailing = ($request->uri->path eq '/' || $request->uri->path eq '') ? 1 : 0;
my @sp = split '/', $server->path;
my @rp = split '/', $request->uri->path;
shift @sp; shift @rp; # leading /
if (@rp) {
foreach my $sp (@sp) {
$sp eq $rp[0] ? shift @rp : last
}
}
$request->uri->path(join '/', @rp);
if ( $add_trailing ) {
$request->uri->path( $request->uri->path . '/' );
}
}
},
}, @_);
}
for my $name (qw(local_request remote_request)) {
my $fun = sub {
carp <<"EOW";
Calling Catalyst::Test::${name}() directly is deprecated.
Please import Catalyst::Test into your namespace and use the provided request()
function instead.
EOW
return __PACKAGE__->can("_${name}")->(@_);
};
( run in 2.353 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )