X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FEngine%2FTest.pm;h=88800fa6a6c33c503d99df09934fd1b58a015898;hb=06e1b6164a2c9d7b463f358b0d1934ef83a82845;hp=93e88395dd65ed413459b0471d3deb59d50f56ef;hpb=523d44ecdd184a0a56c8094c60fe545098e06cff;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Engine/Test.pm b/lib/Catalyst/Engine/Test.pm index 93e8839..88800fa 100644 --- a/lib/Catalyst/Engine/Test.pm +++ b/lib/Catalyst/Engine/Test.pm @@ -3,17 +3,16 @@ package Catalyst::Engine::Test; use strict; use base 'Catalyst::Engine'; -use CGI::Cookie; use Class::Struct (); use HTTP::Headers::Util 'split_header_words'; use HTTP::Request; use HTTP::Response; -use IO::File; +use File::Temp; use URI; -__PACKAGE__->mk_accessors(qw/lwp/); +__PACKAGE__->mk_accessors(qw/http/); -Class::Struct::struct 'Catalyst::Engine::Test::LWP' => { +Class::Struct::struct 'Catalyst::Engine::Test::HTTP' => { request => 'HTTP::Request', response => 'HTTP::Response', hostname => '$', @@ -50,62 +49,46 @@ This class overloads some methods from C. =over 4 -=item $c->finalize_headers +=item $c->finalize_body =cut -sub finalize_headers { +sub finalize_body { my $c = shift; - - my $status = $c->response->status || 200; - my $headers = $c->response->headers; - my $response = HTTP::Response->new( $status, undef, $headers ); - - while ( my ( $name, $cookie ) = each %{ $c->response->cookies } ) { - my $cookie = CGI::Cookie->new( - -name => $name, - -value => $cookie->{value}, - -expires => $cookie->{expires}, - -domain => $cookie->{domain}, - -path => $cookie->{path}, - -secure => $cookie->{secure} || 0 - ); - - $response->header( 'Set-Cookie' => $cookie->as_string ); - } - - $c->lwp->response($response); + $c->http->response->content( $c->response->output ); } -=item $c->finalize_output +=item $c->finalize_headers =cut -sub finalize_output { +sub finalize_headers { my $c = shift; - $c->lwp->response->content_ref( \$c->response->{output} ); + + $c->http->response->code( $c->response->status ); + + for my $name ( $c->response->headers->header_field_names ) { + $c->http->response->push_header( $name => [ $c->response->header($name) ] ); + } } -=item $c->prepare_connection +=item $c->prepare_body =cut -sub prepare_connection { +sub prepare_body { my $c = shift; - $c->req->hostname( $c->lwp->hostname ); - $c->req->address( $c->lwp->address ); + $c->request->input( $c->http->request->content ); } -=item $c->prepare_cookies +=item $c->prepare_connection =cut -sub prepare_cookies { +sub prepare_connection { my $c = shift; - - if ( my $header = $c->request->headers->header('Cookie') ) { - $c->req->cookies( { CGI::Cookie->parse($header) } ); - } + $c->req->hostname( $c->http->hostname ); + $c->req->address( $c->http->address ); } =item $c->prepare_headers @@ -114,8 +97,8 @@ sub prepare_cookies { sub prepare_headers { my $c = shift; - $c->req->method( $c->lwp->request->method ); - $c->req->headers( $c->lwp->request->headers ); + $c->req->method( $c->http->request->method ); + $c->req->headers( $c->http->request->headers ); } =item $c->prepare_parameters @@ -125,8 +108,9 @@ sub prepare_headers { sub prepare_parameters { my $c = shift; - my @params = (); - my $request = $c->lwp->request; + my ( @params, @uploads ); + + my $request = $c->http->request; push( @params, $request->uri->query_form ); @@ -145,17 +129,21 @@ sub prepare_parameters { if ( $parameters{filename} ) { - my $fh = IO::File->new_tmpfile; + my $fh = File::Temp->new( UNLINK => 0 ); $fh->write( $part->content ) or die $!; - $fh->seek( SEEK_SET, 0 ) or die $!; + $fh->flush or die $!; + + my $upload = Catalyst::Request::Upload->new( + filename => $parameters{filename}, + size => ( $fh->stat )[7], + tempname => $fh->filename, + type => $part->content_type + ); - $c->req->uploads->{ $parameters{filename} } = { - fh => $fh, - size => ( stat $fh )[7], - type => $part->content_type - }; + $fh->close; - push( @params, $parameters{filename}, $fh ); + push( @uploads, $parameters{name}, $upload ); + push( @params, $parameters{name}, $parameters{filename} ); } else { push( @params, $parameters{name}, $part->content ); @@ -163,20 +151,8 @@ sub prepare_parameters { } } - my $parameters = $c->req->parameters; - - while ( my ( $name, $value ) = splice( @params, 0, 2 ) ) { - - if ( exists $parameters->{$name} ) { - for ( $parameters->{$name} ) { - $_ = [$_] unless ref($_) eq "ARRAY"; - push( @$_, $value ); - } - } - else { - $parameters->{$name} = $value; - } - } + $c->req->_assign_values( $c->req->parameters, \@params ); + $c->req->_assign_values( $c->req->uploads, \@uploads ); } =item $c->prepare_path @@ -188,9 +164,9 @@ sub prepare_path { my $base; { - my $scheme = $c->lwp->request->uri->scheme; - my $host = $c->lwp->request->uri->host; - my $port = $c->lwp->request->uri->port; + my $scheme = $c->http->request->uri->scheme; + my $host = $c->http->request->uri->host; + my $port = $c->http->request->uri->port; $base = URI->new; $base->scheme($scheme); @@ -200,7 +176,8 @@ sub prepare_path { $base = $base->canonical->as_string; } - my $path = $c->lwp->request->uri->path || '/'; + my $path = $c->http->request->uri->path || '/'; + $path =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; $path =~ s/^\///; $c->req->base($base); @@ -212,8 +189,8 @@ sub prepare_path { =cut sub prepare_request { - my ( $c, $lwp ) = @_; - $c->lwp($lwp); + my ( $c, $http ) = @_; + $c->http($http); } =item $c->prepare_uploads @@ -234,7 +211,8 @@ sub run { unless ( ref $request ) { - my $uri = ( $request =~ m/http/i ) + my $uri = + ( $request =~ m/http/i ) ? URI->new($request) : URI->new( 'http://localhost' . $request ); @@ -245,15 +223,21 @@ sub run { $request = HTTP::Request->new( 'GET', $request ); } - my $lwp = Catalyst::Engine::Test::LWP->new( - request => $request, + my $host = sprintf( '%s:%d', $request->uri->host, $request->uri->port ); + $request->header( 'Host' => $host ); + + my $http = Catalyst::Engine::Test::HTTP->new( address => '127.0.0.1', - hostname => 'localhost' + hostname => 'localhost', + request => $request, + response => HTTP::Response->new ); - $class->handler($lwp); + $http->response->date(time); + + $class->handler($http); - return $lwp->response; + return $http->response; } =back