X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FTest.pm;h=0f452fc0134763734000ddf09049cf7711fc2011;hb=8b76bfcf2b7d98cd72fc7ba702a15684bdee06f0;hp=91553baa48dcb62406d73d381299e2ccd4f53206;hpb=c2e8e6fa308480a083f88f9fd82f835aae150c34;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/Test.pm b/lib/Catalyst/Engine/Test.pm index 91553ba..0f452fc 100644 --- a/lib/Catalyst/Engine/Test.pm +++ b/lib/Catalyst/Engine/Test.pm @@ -1,7 +1,12 @@ package Catalyst::Engine::Test; use strict; -use base 'Catalyst::Engine::HTTP::Base'; +use base 'Catalyst::Engine::CGI'; +use Catalyst::Utils; +use HTTP::Headers; +use HTTP::Response; +use HTTP::Status; +use NEXT; =head1 NAME @@ -29,59 +34,102 @@ This is the Catalyst engine specialized for testing. =head1 OVERLOADED METHODS -This class overloads some methods from C. +This class overloads some methods from C. =over 4 -=item $c->run +=item finalize_headers =cut -sub run { - my $class = shift; - my $request = shift || '/'; +sub finalize_headers { + my ( $self, $c ) = @_; + my $protocol = $c->request->protocol; + my $status = $c->response->status; + my $message = status_message($status); + print "$protocol $status $message\n"; + $c->response->headers->date(time); + $self->NEXT::finalize_headers($c); +} - unless ( ref $request ) { +=item $self->run($c) - my $uri = - ( $request =~ m/http/i ) - ? URI->new($request) - : URI->new( 'http://localhost' . $request ); +=cut - $request = $uri->canonical; - } +sub run { + my ( $self, $class, $request ) = @_; - unless ( ref $request eq 'HTTP::Request' ) { - $request = HTTP::Request->new( 'GET', $request ); - } + $request = Catalyst::Utils::request($request); - my $host = sprintf( '%s:%d', $request->uri->host, $request->uri->port ); - $request->header( 'Host' => $host ); + $request->header( + 'Host' => sprintf( '%s:%d', $request->uri->host, $request->uri->port ) + ); - my $http = Catalyst::Engine::Test::HTTP->new( - address => '127.0.0.1', - hostname => 'localhost', - request => $request, - response => HTTP::Response->new + # We emulate CGI + local %ENV = ( + PATH_INFO => $request->uri->path || '', + QUERY_STRING => $request->uri->query || '', + REMOTE_ADDR => '127.0.0.1', + REMOTE_HOST => 'localhost', + REQUEST_METHOD => $request->method, + SERVER_NAME => 'localhost', + SERVER_PORT => $request->uri->port, + SERVER_PROTOCOL => 'HTTP/1.1', + %ENV, ); - $http->response->date(time); + # Headers + for my $header ( $request->header_field_names ) { + my $name = uc $header; + $name = 'COOKIE' if $name eq 'COOKIES'; + $name =~ tr/-/_/; + $name = 'HTTP_' . $name + unless $name =~ m/\A(?:CONTENT_(?:LENGTH|TYPE)|COOKIE)\z/; + my $value = $request->header($header); + if ( exists $ENV{$name} ) { + $ENV{$name} .= "; $value"; + } + else { + $ENV{$name} = $value; + } + } + + # STDIN + local *STDIN; + my $input = $request->content; + open STDIN, '<', \$input; + + # STDOUT + local *STDOUT; + my $output = ''; + open STDOUT, '>', \$output; - $class->handler($http); + # Process + $class->handle_request; - return $http->response; + # Response + return HTTP::Response->parse($output); } +=item $self->read_chunk($c, $buffer, $length) + +=cut + +sub read_chunk { shift; shift; *STDIN->read(@_); } + =back =head1 SEE ALSO L. -=head1 AUTHOR +=head1 AUTHORS + +Sebastian Riedel, + +Christian Hansen, -Sebastian Riedel, C -Christian Hansen, C +Andy Grundman, =head1 COPYRIGHT