Drogo
view release on metacpan or search on metacpan
lib/Drogo/Server/PSGI.pm view on Meta::CPAN
=head3 new
Create a new server instance.
Parameters:
respond => response object,
Example app.psgi file.
my $app = sub {
my $env = shift;
return sub {
my $respond = shift;
# create new server object
my $server = Drogo::Server::PSGI->new( env => $env, respond => $respond );
# set default application package
$server->variable( app_package => 'dev' );
# do something with server...
Example::App->handler( server => $server );
}
};
=cut
sub new
{
my ($class, %params) = @_;
my $self = { %params, output => '' };
%SERVER_VARIABLES = ( );
my ($path, $args) = split(/\?/, $self->{env}{REQUEST_URI});
$self->{uri} = $path;
$self->{args} = $args || '';
$self->{request_method} = $self->{env}{REQUEST_METHOD};
$self->{remote_addr} = $self->{env}{REMOTE_ADDR};
# set proper headers_in
for my $env_key (keys %{$self->{env}})
{
if ($env_key =~ /^HTTP_(.*)$/)
{
my $header = lc($1);
$self->{headers_in}{$header} = $self->{env}{$env_key};
# map dashes too
$header =~ s/_/-/g;
$self->{headers_in}{$header} = $self->{env}{$env_key};
}
}
$self->{respond} = $params{respond};
# content type needs manually set
$self->{headers_in}{'content-type'} =
$self->{env}{CONTENT_TYPE};
bless($self);
return $self;
}
=head3 initialize
Initializes Drogo instance.
=cut
sub initialize
{
my $self = shift;
my $ip_header = $self->variable('proxy_ip_header');
if ($ip_header)
{
$self->{remote_addr} = $self->header_in($ip_header);
}
elsif (my $remote_addr = $self->variable('remote_addr'))
{
$self->{remote_addr} = $remote_addr;
}
else
{
$self->{remote_addr} = $self->{env}{REMOTE_ADDR};
}
}
sub tmpfilename { join('-', 'drogopsgip', $$, time) }
=head3 input
Returns input stream.
=cut
sub input { shift->{input_fh} }
=head3 process_request_method
Processes a post.
=cut
sub process_request_method
{
my ($self, $coderef) = @_;
return unless $self->{request_method} eq 'POST';
# copy post data to temporary file
my $input = $self->{env}{'psgi.input'};
my $tmpdir = $self->variable('tmpdir') || '/tmp';
# PSGI's Apache gateway lacks seek.
if ($input->can('seek'))
( run in 0.795 second using v1.01-cache-2.11-cpan-524268b4103 )