lemonldap-ng/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/ApacheMP2/Request.pm
2019-07-02 20:03:40 +02:00

78 lines
2.2 KiB
Perl

package Lemonldap::NG::Handler::ApacheMP2::Request;
use strict;
use base 'Plack::Request';
use Plack::Util;
use URI;
use URI::Escape;
# Build Plack::Request (inspired from Plack::Handler::Apache2)
sub new {
my ( $class, $r ) = @_;
# $r->subprocess_env breaks header modification. That's why it is not used
# here
my ( $uri, $args ) = ( $r->uri, $r->args );
my $uri_full = $uri . ( $args ? "?$args" : '' );
my $env = {
#%ENV,
HTTP_HOST => $r->hostname,
REMOTE_ADDR => (
$r->connection->can('remote_ip') ? $r->connection->remote_ip
: $r->connection->client_ip
),
QUERY_STRING => $args,
REQUEST_URI => $uri_full,
PATH_INFO => '',
SERVER_PORT => $r->get_server_port,
REQUEST_METHOD => $r->method,
'psgi.version' => [ 1, 1 ],
'psgi.url_scheme' => ( $ENV{HTTPS} || 'off' ) =~ /^(?:on|1)$/i
? 'https'
: 'http',
'psgi.input' => $r,
'psgi.errors' => *STDERR,
'psgi.multithread' => Plack::Util::FALSE,
'psgi.multiprocess' => Plack::Util::TRUE,
'psgi.run_once' => Plack::Util::FALSE,
'psgi.streaming' => Plack::Util::TRUE,
'psgi.nonblocking' => Plack::Util::FALSE,
'psgix.harakiri' => Plack::Util::TRUE,
'psgix.cleanup' => Plack::Util::TRUE,
'psgix.cleanup.handlers' => [],
'psgi.r' => $r,
};
$r->headers_in->do(
sub {
my $h = shift;
my $k = uc($h);
if ( $k ne 'HOST' ) {
$k =~ s/-/_/g;
$env->{"HTTP_$k"} = $r->headers_in->{$h};
}
return 1;
}
);
my $uri = URI->new( "http://" . $r->hostname . $r->unparsed_uri );
$env->{PATH_INFO} = uri_unescape( $uri->path );
my $self = Plack::Request->new($env);
bless $self, $class;
return $self;
}
sub data {
my ($self) = @_;
return $self->{data} ||= {};
}
sub wantJSON {
return 1
if ( defined $_[0]->accept
and $_[0]->env->{HTTP_ACCEPT} =~ m#(?:application|text)/json#i );
return 0;
}
1;