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 )