Perinci-Access-HTTP-Server

 view release on metacpan or  search on metacpan

lib/Plack/Middleware/PeriAHS/Respond.pm  view on Meta::CPAN


    my $ct = $formatter->[1];

    my $fres = Perinci::Result::Format::format($rres, $fmt);

    if ($fmt =~ /^json/ && defined($env->{"periahs.jsonp_callback"})) {
        $fres = $env->{"periahs.jsonp_callback"}."($fres)";
    }

    if ($self->{add_text_tips} && $fmt =~ /^text/ && !ref($fres)) {
        my @tips;
        my $pf = $midpr->{parse_form};
        if ($rreq->{action} eq 'list') {
            my (@f, @p);
            if ($rreq->{detail}) {
                @f = grep {$_->{type} eq 'function'} @{$rres->[2]};
                @p = grep {$_->{type} eq 'package' } @{$rres->[2]};
            }
            if (@f) {
                local $rreq->{uri} = "pl:$midpr->{riap_uri_prefix}".$f[rand(@f)]{uri};
                push @tips, "* To call a function, try:\n    ".
                    $midpr->{get_http_request_url}->($midpr, $env, $rreq);
                if ($pf) {
                    push @tips, "* Function arguments can be given via GET/POST params or JSON hash in req body";
                } else {
                    push @tips, "* Function arguments can be given via JSON hash in request body";
                }
                $rreq->{uri} = "pl:$midpr->{riap_uri_prefix}".$f[rand(@f)]{uri};
                my $url = $midpr->{get_http_request_url}->($midpr, $env, $rreq);
                push @tips, "* To find out which arguments a function supports, try:\n    ".
                    ($pf ? "$url?-riap-action=meta" : "curl -H 'x-riap-action: meta' $url");
            }
            if (@p) {
                local $rreq->{uri} = "pl:$midpr->{riap_uri_prefix}".$p[rand(@p)]{uri};
                push @tips, "* To list the content of a (sub)package, try:\n    ".
                    $midpr->{get_http_request_url}->($midpr, $env, $rreq);
            }
            if ($rreq->{detail} && @{$rres->[2]}) {
                local $rreq->{uri} = "pl:$midpr->{riap_uri_prefix}".$rres->[2][rand(@{ $rres->[2] })]{uri};
                my $url = $midpr->{get_http_request_url}->($midpr, $env, $rreq);
                push @tips, "* To find out all available actions on an entity, try:\n    ".
                    ($pf ? "$url?-riap-action=actions" : "curl -H 'x-riap-action: actions' $url");
            }
            push @tips,"* This server uses Riap protocol for great autodiscoverability, for more info:\n".
                "    https://metacpan.org/module/Riap";
        }
        if (@tips) {
            $fres .= "\nTips:\n".join("\n", @tips)."\n";
        }
    }

    ($fres, $ct);
}
my %str_levels = qw(1 critical 2 error 3 warning 4 info 5 debug 6 trace);

sub call {
    log_trace("=> PeriAHS::Respond middleware");

    my ($self, $env) = @_;

    die "This middleware needs psgi.streaming support"
        unless $env->{'psgi.streaming'};

    my $rreq = $env->{"riap.request"};
    my $pa   = $env->{"periahs.riap_client"}
        or die "\$env->{'periahs.riap_client'} not defined, ".
            "perhaps ParseRequest middleware has not run?";

    return sub {
        my $respond = shift;

        my $writer;
        my $loglvl  = $self->{enable_logging} ? ($rreq->{'loglevel'} // 0) : 0;
        my $rres; #  short for riap response
        $env->{'periahs.start_action_time'} = [gettimeofday];
        if ($loglvl > 0) {
            $writer = $respond->([
                200, ["Content-Type" => "text/plain",
                      "X-Riap-V" => "1.1.22",
                      "X-Riap-Logging" => 1]]);
            my $saved = Log::ger::Util::save_hooks('create_logml_routine');
            Log::ger::Output->set(
                "Callback",
                logging_cb => sub {
                    my ($ctx, $numlvl, $msg) = @_;
                    my $strlevel = Log::ger::Util::string_level($numlvl);
                    my $fmsg0 = join(
                        "",
                        "[$strlevel][", scalar(localtime), "] $msg\n",
                    );
                    my $fmsg = join(
                        "",
                        "l", length($fmsg0), " ",
                        $fmsg0);
                    $writer->write($fmsg);
                },
            );
            {
                local $rreq->{args}{-env} = $env if $self->{pass_psgi_env};
                $rres = $pa->request($rreq->{action} => $rreq->{uri}, $rreq);
            }
            Log::ger::Util::restore_hooks('create_logml_routine', $saved);
        } else {
            {
                local $rreq->{args}{-env} = $env if $self->{pass_psgi_env};
                $rres = $pa->request($rreq->{action} => $rreq->{uri}, $rreq);
            }
        }
        $rres = $cleanser->clone_and_clean($rres);
        $env->{'periahs.finish_action_time'} = [gettimeofday];

        $env->{'riap.response'} = $rres;
        my ($fres, $ct) = $self->format_result($rres, $env);

        if ($writer) {
            $writer->write("r" . length($fres) . " " . $fres);
            $writer->close;
        } else {
            $respond->([
                200, ["Content-Type" => $ct,
                      "X-Riap-V" => "1.1.22",
                  ], [$fres]]);



( run in 0.792 second using v1.01-cache-2.11-cpan-140bd7fdf52 )