HTTP::Engine::Role::Interface - The Interface Role Definition


HTTP-Engine documentation Contained in the HTTP-Engine distribution.

Index


Code Index:

NAME

Top

HTTP::Engine::Role::Interface - The Interface Role Definition

SYNOPSIS

Top

  package HTTP::Engine::Interface::CGI;
  use Any::Moose;
  with 'HTTP::Engine::Role::Interface';

DESCRIPTION

Top

HTTP::Engine::Role::Interface defines the role of an interface in HTTP::Engine.

Specifically, an Interface in HTTP::Engine needs to do at least two things:

Create a HTTP::Engine::Request object from the client request

If you are on a CGI environment, you need to receive all the data from %ENV and such. If you are running on a mod_perl process, you need to muck with $r.

In any case, you need to construct a valid HTTP::Engine::Request object so the application handler can do the real work.

Accept a HTTP::Engine::Response object, send it back to the client

The application handler must return an HTTP::Engine::Response object.

In turn, the interface needs to do whatever necessary to present this object to the client. In a CGI environment, you would write to STDOUT. In mod_perl, you need to call the appropriate $r->headers methods and/or $r->print

AUTHORS

Top

Kazuhiro Osawa and HTTP::Engine Authors

SEE ALSO

Top

HTTP::Engine


HTTP-Engine documentation Contained in the HTTP-Engine distribution.

package HTTP::Engine::Role::Interface;
use Any::Moose '::Role';
use HTTP::Engine::Types::Core qw(Handler);
use HTTP::Engine::ResponseFinalizer;

requires 'run';

has request_handler => (
    is       => 'rw',
    isa      => Handler,
    coerce   => 1,
    required => 1,
);

# for PSGI streaming response
# using HTTP::Engine::ResponseFinalizer
sub can_has_streaming { 0 }

sub handle_request {
    my ($self, %args) = @_;

    my $req = HTTP::Engine::Request->new(
        request_builder => $self->request_builder,
        %args,
    );

    my $res;
    eval {
        $res = $self->request_handler->($req);
        unless ( Scalar::Util::blessed($res)
            && $res->isa('HTTP::Engine::Response') )
        {
            die "You should return instance of HTTP::Engine::Response.";
        }
    };
    if ( my $e = $@ ) {
        print STDERR $e;
        $res = HTTP::Engine::Response->new(
            status => 500,
            body   => 'internal server error',
        );
    }

    HTTP::Engine::ResponseFinalizer->finalize( $req => $res => $self );

    return $self->response_writer->finalize( $req => $res );
}

1;

__END__