X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FWeb%2FSimple%2FApplication.pm;h=c24ac7911ebd060c8fb8db17e7ad2bf37ff2764a;hb=e27ab5c58dc809041fcf3ef09cfc2e1ba9f4066a;hp=e11eef71eead64b746279de0475dd272cd4f4a7b;hpb=795c4698606dcaac5f660d9c759cda2474038eae;p=catagits%2FWeb-Simple.git diff --git a/lib/Web/Simple/Application.pm b/lib/Web/Simple/Application.pm index e11eef7..c24ac79 100644 --- a/lib/Web/Simple/Application.pm +++ b/lib/Web/Simple/Application.pm @@ -61,7 +61,25 @@ use warnings FATAL => 'all'; sub new { my ($class, $data) = @_; my $config = { $class->_default_config, %{($data||{})->{config}||{}} }; - bless({ config => $config }, $class); + my $new = bless({ config => $config }, $class); + $new->BUILDALL($data); + $new; +} + +sub BUILDALL { + my ($self, $data) = @_; + my $targ = ref($self); + my @targ; + while ($targ->isa(__PACKAGE__) and $targ ne __PACKAGE__) { + push(@targ, "${targ}::BUILD") + if do { no strict 'refs'; defined *{"${targ}::BUILD"}{CODE} }; + my @targ_isa = do { no strict 'refs'; @{"${targ}::ISA"} }; + die "${targ} uses Multiple Inheritance: ISA is: ".join ', ', @targ_isa + if @targ_isa > 1; + $targ = $targ_isa[0]; + } + $self->$_($data) for reverse @targ; + return; } sub _setup_default_config { @@ -171,7 +189,7 @@ sub _build_dispatcher_from_spec { my $proto = prototype $spec; my $parser = $class->_build_dispatch_parser; my $matcher = ( - defined($proto) + defined($proto) && length($proto) ? $parser->parse_dispatch_specification($proto) : undef ); @@ -202,8 +220,8 @@ sub _build_final_dispatcher { shift->_build_dispatcher({ call => sub { [ - 500, [ 'Content-type', 'text/plain' ], - [ 'The management apologises but we have no idea how to handle that' ] + 404, [ 'Content-type', 'text/plain' ], + [ 'Not found' ] ] } }) @@ -223,34 +241,46 @@ sub _run_with_self { } sub run_if_script { - return 1 if caller(1); # 1 so we can be the last thing in the file - my $class = shift; - my $self = $class->new; + # ->as_psgi_app is true for require() but also works for plackup + return $_[0]->as_psgi_app if caller(1); + my $self = ref($_[0]) ? $_[0] : $_[0]->new; $self->run(@_); } sub _run_cgi { my $self = shift; - require Web::Simple::HackedPlack; - Plack::Server::CGI->run(sub { $self->_dispatch(@_) }); + require Plack::Server::CGI; + Plack::Server::CGI->run($self->as_psgi_app); +} + +sub _run_fcgi { + my $self = shift; + require Plack::Server::FCGI; + Plack::Server::FCGI->run($self->as_psgi_app); +} + +sub as_psgi_app { + my $self = shift; + ref($self) ? sub { $self->_dispatch(@_) } : sub { $self->new->_dispatch(@_) } } sub run { my $self = shift; - if ($ENV{GATEWAY_INTERFACE}) { + if ($ENV{PHP_FCGI_CHILDREN} || $ENV{FCGI_ROLE} || $ENV{FCGI_SOCKET_PATH}) { + return $self->_run_fcgi; + } elsif ($ENV{GATEWAY_INTERFACE}) { return $self->_run_cgi; } my $path = shift(@ARGV) or die "No path passed - use $0 / for root"; - require HTTP::Request::AsCGI; require HTTP::Request::Common; + require Plack::Test; local *GET = \&HTTP::Request::Common::GET; my $request = GET($path); - my $c = HTTP::Request::AsCGI->new($request)->setup; - $self->_run_cgi; - $c->restore; - print $c->response->as_string; + my $response; + Plack::Test::test_psgi($self->as_psgi_app, sub { $response = shift->($request) }); + print $response->as_string; } 1;