Perinci-Access-HTTP-Server
view release on metacpan or search on metacpan
lib/Plack/Middleware/PeriAHS/ParseRequest.pm view on Meta::CPAN
# unless $self->{accept_phps};
# require PHP::Serialization;
# eval { $v = PHP::Serialization::unserialize($v) };
# return errpage(
# $env, [400, "Invalid PHP serialized data in ".
# "query parameter $k: $@") if $@;
}
if ($k =~ /\A-riap-([\w-]+)/) {
my $rk = lc $1; $rk =~ s/-/_/g;
return errpage(
$env, [400, "Invalid Riap request key `$rk` (from form)"])
unless $rk =~ /\A\w+\z/;
$rreq->{$rk} = $v unless exists $rreq->{$rk};
} else {
$rreq->{args}{$k} = $v unless exists $rreq->{args}{$k};
}
}
}
if ($self->{parse_reform} && $env->{'periahs._form_cache'} &&
$env->{'periahs._form_cache'}{'-submit'}) {
{
last unless $rreq->{uri};
my $res = $env->{'periahs._meta_res_cache'} //
$self->{riap_client}->request(meta => $rreq->{uri});
return errpage($env, [$res->[0], $res->[1]])
unless $res->[0] == 200;
$env->{'periahs._meta_res_cache'} //= $res;
my $meta = $res->[2];
last unless $meta;
last unless $meta->{args};
require ReForm::HTML;
require Perinci::Sub::To::ReForm;
my $rf = ReForm::HTML->new(
spec => Perinci::Sub::To::ReForm::gen_form_spec_from_rinci_meta(
meta => $meta,
)
);
$res = $rf->get_data(psgi_env => $env);
return errpage($env, [$res->[0], $res->[1]])
unless $res->[0] == 200;
$rreq->{args} = $res->[2];
}
}
if ($self->{parse_path_info}) {
{
last unless $rreq->{uri};
my $res = $env->{'periahs._meta_res_cache'} //
$self->{riap_client}->request(meta => $rreq->{uri});
return errpage($env, [$res->[0], $res->[1]])
unless $res->[0] == 200;
$env->{'periahs._meta_res_cache'} //= $res;
my $meta = $res->[2];
last unless $meta;
last unless $meta->{args};
my $pi = $env->{PATH_INFO} // "";
$pi =~ s!^/+!!;
my @pi = map {uri_unescape($_)} split m!/+!, $pi;
$res = get_args_from_array(array=>\@pi, meta=>$meta);
return errpage(
$env, [500, "Bad metadata for function $rreq->{uri}: ".
"Can't get arguments: $res->[0] - $res->[1]"])
unless $res->[0] == 200;
for my $k (keys %{$res->[2]}) {
$rreq->{args}{$k} //= $res->[2]{$k};
}
}
}
# defaults
$rreq->{v} //= 1.1;
$rreq->{fmt} //= $env->{"periahs.default_fmt"};
if (!$rreq->{action}) {
if ($rreq->{uri} =~ m!/$!) {
$rreq->{action} = 'list';
$rreq->{detail} //= 1;
} else {
$rreq->{action} = 'call';
}
}
# sanity: check required keys
for (qw/uri v action/) {
defined($rreq->{$_}) or return errpage(
$env, [500, "Required Riap request key '$_' has not been defined"]);
}
# add uri prefix
$rreq->{uri} = "$self->{riap_uri_prefix}$rreq->{uri}";
# special handling for php clients #2
{
last unless $self->{deconfuse_php_clients} &&
$rcua && $rcua =~ $self->{php_clients_ua_re};
my $rargs = $rreq->{args};
last unless $rargs;
# XXX this is repetitive, must refactor
my $res = $env->{'periahs._meta_res_cache'} //
$self->{riap_client}->request(meta => $rreq->{uri});
return errpage($env, [$res->[0], $res->[1]])
unless $res->[0] == 200;
$env->{'periahs._meta_res_cache'} //= $res;
my $meta = $res->[2];
if ($meta->{args}) {
for my $arg (keys %$rargs) {
my $argm = $meta->{args}{$arg};
if ($argm && $argm->{schema}) {
# convert {} -> [] if function expects array
if (ref($rargs->{$arg}) eq 'HASH' &&
!keys(%{$rargs->{$arg}}) &&
$argm->{schema}[0] eq 'array') {
$rargs->{$arg} = [];
}
# convert [] -> {} if function expects hash
if (ref($rargs->{$arg}) eq 'ARRAY' &&
!@{$rargs->{$arg}} &&
( run in 0.833 second using v1.01-cache-2.11-cpan-71847e10f99 )