Amon2
view release on metacpan or search on metacpan
lib/Amon2/Web/Request.pm view on Meta::CPAN
package Amon2::Web::Request;
use strict;
use warnings;
use parent qw/Plack::Request/;
use Encode ();
use Carp ();
use URI::QueryParam;
use Hash::MultiValue;
sub new {
my ($class, $env, $context_class) = @_;
my $self = $class->SUPER::new($env);
if (@_==3) {
$self->{_web_pkg} = $context_class;
}
return $self;
}
sub _encoding {
my $self = shift;
return $self->{_web_pkg} ? $self->{_web_pkg}->context->encoding : Amon2->context->encoding;
}
# -------------------------------------------------------------------------
# This object returns decoded parameter values by default
sub body_parameters {
my ($self) = @_;
$self->{'amon2.body_parameters'} ||= $self->_decode_parameters($self->SUPER::body_parameters());
}
sub query_parameters {
my ($self) = @_;
$self->{'amon2.query_parameters'} ||= $self->_decode_parameters($self->SUPER::query_parameters());
}
sub _decode_parameters {
my ($self, $stuff) = @_;
my $encoding = $self->_encoding();
my @flatten = $stuff->flatten();
my @decoded;
while ( my ($k, $v) = splice @flatten, 0, 2 ) {
push @decoded, Encode::decode($encoding, $k), Encode::decode($encoding, $v);
}
return Hash::MultiValue->new(@decoded);
}
sub parameters {
my $self = shift;
$self->env->{'amon2.request.merged'} ||= do {
my $query = $self->query_parameters;
my $body = $self->body_parameters;
Hash::MultiValue->new( $query->flatten, $body->flatten );
};
}
# -------------------------------------------------------------------------
# raw parameter values are also available.
sub body_parameters_raw {
shift->SUPER::body_parameters();
}
sub query_parameters_raw {
shift->SUPER::query_parameters();
}
sub parameters_raw {
my $self = shift;
$self->env->{'plack.request.merged'} ||= do {
my $query = $self->SUPER::query_parameters();
my $body = $self->SUPER::body_parameters();
Hash::MultiValue->new( $query->flatten, $body->flatten );
};
}
sub param_raw {
my $self = shift;
return keys %{ $self->parameters_raw } if @_ == 0;
my $key = shift;
return $self->parameters_raw->{$key} unless wantarray;
return $self->parameters_raw->get_all($key);
}
# -------------------------------------------------------------------------
# uri_with funcition. The code was taken from Catalyst::Request
sub uri_with {
my( $self, $args, $behavior) = @_;
Carp::carp( 'No arguments passed to uri_with()' ) unless $args;
my $append = 0;
if((ref($behavior) eq 'HASH') && defined($behavior->{mode}) && ($behavior->{mode} eq 'append')) {
$append = 1;
}
my $params = do {
foreach my $value ( values %$args ) {
next unless defined $value;
for ( ref $value eq 'ARRAY' ? @$value : $value ) {
$_ = "$_";
utf8::encode($_) if utf8::is_utf8($_);
}
}
my %params = %{ $self->uri->query_form_hash };
foreach my $key ( keys %{$args} ) {
my $val = $args->{$key};
if (utf8::is_utf8($key)) {
$key = Encode::encode($self->_encoding(), $key);
}
if ( defined($val) ) {
if ( $append && exists( $params{$key} ) ) {
# This little bit of heaven handles appending a new value onto
# an existing one regardless if the existing value is an array
# or not, and regardless if the new value is an array or not
$params{$key} = [
ref( $params{$key} ) eq 'ARRAY'
? @{ $params{$key} }
: $params{$key},
ref($val) eq 'ARRAY' ? @{$val} : $val
];
}
else {
$params{$key} = $val;
}
}
( run in 1.997 second using v1.01-cache-2.11-cpan-99c4e6809bf )