Haineko

 view release on metacpan or  search on metacpan

lib/Haineko/HTTPD.pm  view on Meta::CPAN

    $argvs->{'router'}   ||= Haineko::HTTPD::Router->new;
    $argvs->{'request'}  ||= Haineko::HTTPD::Request->new;
    $argvs->{'response'} ||= Haineko::HTTPD::Response->new;

    $argvs->{'host'}  = $argvs->{'request'}->env->{'SERVER_NAME'};
    $argvs->{'debug'} = $ENV{'HAINEKO_DEBUG'} ? 1 : 0;

    return bless $argvs, __PACKAGE__;
}

sub start {
    my $class = shift;
    my $nyaaa = sub {
        my $hainekoenv = shift;
        my $htresponse = undef;
        my $requestnya = Haineko::HTTPD::Request->new( $hainekoenv );
        my $contextnya = $class->new( 'request' => $requestnya );

        local *Haineko::HTTPD::context = sub { $contextnya };
        $htresponse = $class->startup( $contextnya );

        return $htresponse->finalize;
    };

    return $nyaaa;
}

sub req {
    my $self = shift;
    return $self->request;
}

sub res {
    my $self = shift;
    return $self->response;
}

sub rdr {
    my $self = shift;
    my $code = shift || 302;
    my $next = shift;

    $self->response->redirect( $next, $code );
    return $self->response;
}

sub err {
    my $self = shift;
    my $code = shift || 404;
    my $mesg = shift;

    unless( $mesg ) {
        # If the second argument is omitted, use "404 Not found" as a JSON.
        require Haineko::SMTPD::Response;
        $mesg = Haineko::SMTPD::Response->r( 'http', 'not-found' )->damn;
    }

    if( ref $mesg eq 'HASH' ) {
        # Respond as a JSON
        require Haineko::SMTPD::Session;
        my $addr = [ split( ',', $self->req->header('X-Forwarded-For') || q() ) ];
        my $sess = Haineko::SMTPD::Session->new( 
                        'referer'    => $self->req->referer // undef,
                        'response'   => [ $mesg ],
                        'remoteaddr' => pop @$addr || $self->req->address // undef,
                        'remoteport' => $self->req->env->{'REMOTE_ADDR'} // undef,
                        'useragent'  => $self->req->user_agent // undef,
                   )->damn;
        $sess->{'queueid'} = undef;
        return $self->response->json( $code, $sess );

    } else {
        # Respond as a text
        $self->response->code( $code );
        $self->response->content_type( 'text/plain' );
        $self->response->content_length( length $mesg );
        $self->response->body( $mesg );
        return $self->response;
    }
}

sub r {
    my $self = shift;
    my $neko = $self->router->routematch( $self->req->env );

    return $self->err unless $neko;

    my $controller = sprintf( "Haineko::%s", $neko->dest->{'controller'} );
    my $ctrlaction = $neko->dest->{'action'};
    my $exceptions = 0;
    my $htcontents = undef;
    my $nekosyslog = undef;

    try {
        require Module::Load;
        Module::Load::load( $controller );

    } catch {
        require Haineko::Log;
        require Haineko::SMTPD::Response;

        $htcontents = Haineko::SMTPD::Response->r( 'http', 'server-error' )->damn;
        $nekosyslog = Haineko::Log->new( 'disabled' => 0 );

        $htcontents->{'message'}->[1] = $_;
        $nekosyslog->w( 'crit', $htcontents );
        pop @{ $htcontents->{'message'} } unless $self->debug;
        $exceptions = 1;
    };

    return $controller->$ctrlaction( $self ) unless $exceptions;
    return $self->err( 500, { 'response' => $htcontents } );
}

1;
__END__
=encoding utf-8

=head1 NAME

Haineko::HTTPD - Something like web application framework



( run in 0.763 second using v1.01-cache-2.11-cpan-ceb78f64989 )