Dancer2
view release on metacpan or search on metacpan
lib/Dancer2/Core/Request.pm view on Meta::CPAN
package Dancer2::Core::Request;
# ABSTRACT: Interface for accessing incoming requests
$Dancer2::Core::Request::VERSION = '2.1.0';
use strict;
use warnings;
use parent 'Plack::Request';
use Carp;
use Encode qw(decode FB_CROAK LEAVE_SRC);
use URI;
use URI::Escape;
use Safe::Isa;
use Hash::MultiValue;
use Ref::Util qw< is_ref is_arrayref is_hashref is_coderef >;
use Dancer2::Core::Types;
use Dancer2::Core::Request::Upload;
use Dancer2::Core::Cookie;
# add an attribute for each HTTP_* variables
# (HOST is managed manually)
my @http_env_keys = (qw/
accept_charset
accept_encoding
accept_language
connection
keep_alive
x_requested_with
/);
# apparently you can't eval core functions
sub accept { $_[0]->env->{'HTTP_ACCEPT'} }
eval << "_EVAL" or die $@ for @http_env_keys; ## no critic
sub $_ { \$_[0]->env->{ 'HTTP_' . ( uc "$_" ) } }
1;
_EVAL
eval {
require Unicode::UTF8;
no warnings qw<redefine once>;
*__decode = sub { Unicode::UTF8::decode_utf8($_[0]) };
*__valid = sub { Unicode::UTF8::valid_utf8($_[0]) };
1;
} or do {
no warnings qw<redefine once>;
*__decode = sub { decode( 'UTF-8', $_[0] ) };
*__valid = sub {
eval { decode( 'UTF-8', $_[0], FB_CROAK | LEAVE_SRC ); 1 };
};
};
# check presence of XS module to speedup request
our $XS_URL_DECODE = eval { require URL::Encode::XS; 1; };
our $XS_PARSE_QUERY_STRING = eval { require CGI::Deurl::XS; 1; };
our $XS_HTTP_COOKIES = eval { require HTTP::XSCookies; 1; };
our $_id = 0;
# self->new( env => {}, serializer => $s, is_behind_proxy => 0|1 )
sub new {
my ( $class, @args ) = @_;
# even sized list
@args % 2 == 0
or croak 'Must provide even sized list';
my %opts = @args;
my $env = $opts{'env'};
my $self = $class->SUPER::new($env);
if ( my $s = $opts{'serializer'} ) {
$s->$_does('Dancer2::Core::Role::Serializer')
( run in 1.064 second using v1.01-cache-2.11-cpan-39bf76dae61 )