X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FWeb%2FSimple%2FApplication.pm;h=be34500302fc95f47f5ff5a4cb893a906d89da89;hb=bb436cfb058ce28eadd89b4a4f6d405a3520ffeb;hp=99a59a32ad618604170bc4fbb0ea9057a1cd4911;hpb=a9a99c24817b0ed60968a1d36731d0b71c150288;p=catagits%2FWeb-Simple.git diff --git a/lib/Web/Simple/Application.pm b/lib/Web/Simple/Application.pm index 99a59a3..be34500 100644 --- a/lib/Web/Simple/Application.pm +++ b/lib/Web/Simple/Application.pm @@ -27,7 +27,7 @@ use warnings FATAL => 'all'; my ($self, $env, @args) = @_; my $next = $self->_has_match ? $self->next : undef; if (my ($env_delta, @match) = $self->_match_against($env)) { - if (my ($result) = $self->_execute_with(@args, @match)) { + if (my ($result) = $self->_execute_with(@args, @match, $env)) { if ($self->_is_dispatcher($result)) { $next = $result->set_next($next); $env = { %$env, %$env_delta }; @@ -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 { @@ -173,7 +191,7 @@ sub _build_dispatcher_from_spec { my $matcher = ( defined($proto) && length($proto) ? $parser->parse_dispatch_specification($proto) - : undef + : sub { ({}, $_[1]) } ); return $class->_build_dispatcher({ match => $matcher, @@ -225,17 +243,22 @@ sub _run_with_self { sub run_if_script { # ->as_psgi_app is true for require() but also works for plackup return $_[0]->as_psgi_app if caller(1); - my $class = shift; - my $self = $class->new; + my $self = ref($_[0]) ? $_[0] : $_[0]->new; $self->run(@_); } sub _run_cgi { my $self = shift; - require Web::Simple::HackedPlack; + 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(@_) } @@ -243,20 +266,21 @@ sub as_psgi_app { 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;