- Timestamp:
- 08/28/08 08:08:56 (3 months ago)
- Location:
- lang/perl/HTTP-Engine-Compat/trunk
- Files:
-
- 6 modified
-
lib/HTTP/Engine/Compat.pm (modified) (6 diffs)
-
lib/HTTP/Engine/Compat/Context.pm (modified) (1 diff)
-
t/010_core/context.t (modified) (1 diff)
-
t/010_core/middleware-wrap.t (modified) (1 diff)
-
t/010_core/request_processor-response_error.t (modified) (1 diff)
-
t/010_core/response_redirect.t (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
lang/perl/HTTP-Engine-Compat/trunk/lib/HTTP/Engine/Compat.pm
r18062 r18361 5 5 #extends 'HTTP::Engine'; 6 6 use HTTP::Engine; 7 use HTTP::Engine::RequestProcessor;8 7 use HTTP::Engine::Request; 8 use HTTP::Engine::ResponseFinalizer; 9 9 use HTTP::Engine::Compat::Context; 10 use HTTP::Engine::Role::Interface; 11 12 our $rh; 13 my @wraps; 10 14 11 15 sub import { 12 my($class, %args) = @_; 13 14 $class->_wrap( \&_extract_context ); 16 my ( $class, %args ) = @_; 15 17 16 18 $class->_modify( … … 43 45 44 46 if (@_) { 45 $self->location( shift);47 $self->location(shift); 46 48 $self->status( shift || 302 ); 47 49 } … … 54 56 55 57 $class->_modify( 56 'HTTP::Engine ::ResponseFinalizer',58 'HTTP::Engine', 57 59 sub { 58 60 my $meta = shift; 59 61 $meta->add_around_method_modifier( 60 finalize => sub { 61 my $code = shift; 62 my ($self, $req, $res) = @_; 63 if (my $location = $res->location) { 64 $res->header( Location => $req->absolute_url($location) ); 65 $res->body($res->status . ': Redirect') unless $res->body; 66 } 67 $code->(@_); 62 'new' => sub { 63 my ($next, @args) = @_; 64 my $instance = $next->(@args); 65 66 $class->_setup_interface($instance->interface->meta); 67 $instance; 68 68 }, 69 ) 70 } 71 ); 69 ); 70 }, 71 ); 72 73 do { 74 my $meta = 75 Class::MOP::Class->initialize('HTTP::Engine::ResponseFinalizer') 76 or die "cannot get meta"; 77 $meta->add_around_method_modifier( 78 finalize => sub { 79 my $code = shift; 80 my ( $self, $req, $res ) = @_; 81 if ( my $location = $res->location ) { 82 $res->header( Location => $req->absolute_url($location) ); 83 $res->body( $res->status . ': Redirect' ) unless $res->body; 84 } 85 $code->(@_); 86 }, 87 ); 88 }; 72 89 73 90 return unless $args{middlewares} && ref $args{middlewares} eq 'ARRAY'; 74 $class->load_middlewares(@{ $args{middlewares} }); 91 $class->load_middlewares( @{ $args{middlewares} } ); 92 } 93 94 my %initialized; 95 sub _setup_interface { 96 my ($class, $inter) = @_; 97 98 $inter->make_mutable; 99 100 $inter->add_method( 101 'call_handler' => sub { 102 my $req = shift; 103 $rh->( $req ); 104 } 105 ); 106 $class->_wrap( $inter, \&_extract_context ); 107 $class->_wrap( $inter, $_ ) for @wraps; 108 109 $inter->make_mutable; 110 $inter->add_method( 111 'handle_request' => sub { 112 my ( $self, %args ) = @_; 113 114 my $c = HTTP::Engine::Compat::Context->new( 115 req => HTTP::Engine::Request->new( 116 request_builder => $self->request_builder, 117 %args, 118 ), 119 res => HTTP::Engine::Response->new( status => 200 ), 120 ); 121 122 eval { 123 local $rh = $self->request_handler; 124 my $res = $inter->get_method('call_handler')->($c); 125 if (Scalar::Util::blessed($res) && $res->isa('HTTP::Engine::Response')) { 126 $c->res( $res ); 127 } 128 }; 129 if ( my $e = $@ ) { 130 print STDERR $e; 131 $c->res->status(500); 132 $c->res->body('internal server error'); 133 } 134 135 HTTP::Engine::ResponseFinalizer->finalize( $c->req => $c->res ); 136 137 $self->response_writer->finalize( $c->req => $c->res ); 138 return $c->res; 139 }, 140 ); 141 142 $inter->make_immutable; 75 143 } 76 144 … … 101 169 102 170 if ($pkg->meta->has_method('wrap')) { 103 $class->_wrap( $pkg->meta->get_method('wrap')->body ); 104 $class->_wrap( \&_extract_context ); 171 push @wraps, $pkg->meta->get_method('wrap')->body; 105 172 } 106 173 } 107 174 108 175 sub _wrap { 109 my ($class, $code ) = @_; 110 $class->_modify( 111 'HTTP::Engine::RequestProcessor', 112 sub { 113 my $meta = shift; 114 $meta->add_around_method_modifier( 115 call_handler => $code, 116 ); 117 }, 118 ); 176 my ($class, $interface, $code ) = @_; 177 $interface->make_mutable; 178 $interface->add_around_method_modifier( 179 call_handler => $code, 180 ); 181 $interface->make_immutable; 119 182 } 120 183 … … 124 187 # process argument 125 188 if (Scalar::Util::blessed($arg) ne 'HTTP::Engine::Compat::Context') { 126 $arg = HTTP::Engine::Compat::Context->new(127 req => $arg,128 res => HTTP::Engine::Response->new(129 status => 200130 ),131 );132 189 } 133 190 … … 148 205 my ($class, $target, $cb) = @_; 149 206 my $meta = $target->meta; 150 $meta->make_mutable ;207 $meta->make_mutable if $meta->can('make_mutable'); 151 208 $cb->($meta); 152 $meta->make_immutable ;209 $meta->make_immutable if $meta->can('make_immutable'); 153 210 } 154 211 -
lang/perl/HTTP-Engine-Compat/trunk/lib/HTTP/Engine/Compat/Context.pm
r17791 r18361 2 2 use Moose; 3 3 use HTTP::Engine::Request; 4 use HTTP::Engine::RequestBuilder;5 4 use HTTP::Engine::Response; 6 5 -
lang/perl/HTTP-Engine-Compat/trunk/t/010_core/context.t
r17787 r18361 3 3 use HTTP::Engine::Compat; 4 4 use Scalar::Util qw/refaddr/; 5 use Test::More tests => 3;5 use Test::More tests => 5; 6 6 7 my $c = HTTP::Engine::Compat::Context->new( 8 req => HTTP::Engine::Request->new( 9 _connection => { 10 input_handle => \*STDIN, 11 output_handle => \*STDIN, 12 env => \%ENV, 7 HTTP::Engine->new( 8 interface => { 9 module => 'Test', 10 args => { }, 11 request_handler => sub { 12 my $c = shift; 13 isa_ok $c, 'HTTP::Engine::Compat::Context'; 14 is $c->req->path, '/foo'; 15 is refaddr( $c->req ), refaddr( $c->request ), 'alias'; 16 is refaddr( $c->res ), refaddr( $c->response ), 'alias'; 17 is refaddr( $c->req->context ), refaddr($c), 'trigger'; 13 18 }, 14 request_builder => HTTP::Engine::RequestBuilder->new, 15 ) 16 ); 17 is refaddr( $c->req ), refaddr( $c->request ), 'alias'; 18 is refaddr( $c->res ), refaddr( $c->response ), 'alias'; 19 is refaddr( $c->req->context ), refaddr($c), 'trigger'; 19 }, 20 )->run(HTTP::Request->new('GET', '/foo')); 21 -
lang/perl/HTTP-Engine-Compat/trunk/t/010_core/middleware-wrap.t
r17549 r18361 13 13 our $wrap; 14 14 is $main::wrap, 'ok'; 15 is $response-> content, 'OK!';15 is $response->body, 'OK!'; -
lang/perl/HTTP-Engine-Compat/trunk/t/010_core/request_processor-response_error.t
r17578 r18361 38 38 $code->(); 39 39 } HTTP::Request->new( GET => 'http://localhost/'); 40 is $res-> code, 200;41 is $res-> content, $content, $content;40 is $res->status, 200; 41 is $res->body, $content, $content; 42 42 } 43 43 } -
lang/perl/HTTP-Engine-Compat/trunk/t/010_core/response_redirect.t
r17787 r18361 4 4 use HTTP::Engine::Compat; 5 5 use HTTP::Engine::Compat::Context; 6 use HTTP::Engine::ResponseFinalizer;6 use t::Utils; 7 7 8 8 do { 9 my $c = HTTP::Engine::Compat::Context->new( 10 req => HTTP::Engine::Request->new( 11 _connection => { 12 input_handle => \*STDIN, 13 output_handle => \*STDIN, 14 env => \%ENV, 15 }, 16 request_builder => HTTP::Engine::RequestBuilder->new, 17 ) 18 ); 19 $c->req->method('POST'); 20 $c->req->base(URI->new('http://d.hatena.ne.jp/')); 21 $c->res->redirect('/TKSK/'); 22 HTTP::Engine::ResponseFinalizer->finalize($c->req, $c->res); 23 is $c->res->header('Location'), 'http://d.hatena.ne.jp/TKSK/'; 24 is $c->res->status, 302; 25 is $c->res->redirect, '/TKSK/'; 26 is $c->res->body, '302: Redirect'; 9 my $res = run_engine { 10 my $c = shift; 11 $c->res->redirect('/TKSK/'); 12 } HTTP::Request->new('POST', 'http://d.hatena.ne.jp/'); 13 is $res->header('Location'), 'http://d.hatena.ne.jp/TKSK/'; 14 is $res->status, 302; 15 is $res->redirect, '/TKSK/'; 16 is $res->body, '302: Redirect'; 27 17 }; 28 18 29 19 do { 30 my $c = HTTP::Engine::Compat::Context->new( 31 req => HTTP::Engine::Request->new( 32 _connection => { 33 input_handle => \*STDIN, 34 output_handle => \*STDIN, 35 env => \%ENV, 36 }, 37 request_builder => HTTP::Engine::RequestBuilder->new, 38 ) 39 ); 40 $c->req->method('GET'); 41 $c->req->base(URI->new('http://d.hatena.ne.jp/')); 42 $c->res->body('OK'); 43 $c->res->redirect('/TKSK/' => 303); 44 HTTP::Engine::ResponseFinalizer->finalize($c->req, $c->res); 45 is $c->res->header('Location'), 'http://d.hatena.ne.jp/TKSK/'; 46 is $c->res->status, 303; 47 is $c->res->redirect, '/TKSK/'; 48 is $c->res->body, 'OK'; 20 my $res = run_engine { 21 my $c = shift; 22 $c->res->body('OK'); 23 $c->res->redirect('/TKSK/' => 303); 24 } HTTP::Request->new('GET', 'http://d.hatena.ne.jp'); 25 is $res->header('Location'), 'http://d.hatena.ne.jp/TKSK/'; 26 is $res->status, 303; 27 is $res->redirect, '/TKSK/'; 28 is $res->body, 'OK'; 49 29 };
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)