Changeset 13408

Show
Ignore:
Timestamp:
06/07/08 20:59:54 (5 years ago)
Author:
nothingmuch
Message:

everything is now lazy, almost passes test suite

Location:
lang/perl/HTTP-Engine/branches/lazy_request
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/HTTP-Engine/branches/lazy_request/lib/HTTP/Engine/Request.pm

    r13407 r13408  
    147147} 
    148148 
     149has "_http_body" => ( 
     150    is => "rw", 
     151    lazy_build => 1, 
     152); 
     153 
     154sub _build__http_body { 
     155    my $self = shift; 
     156    $self->request_builder->_build_initial_http_body($self); 
     157} 
     158 
    149159has http_body => ( 
    150160    is         => 'rw', 
     
    159169sub _build_http_body { 
    160170    my $self = shift; 
    161     $self->_build_ 
     171    $self->request_builder->_build_full_http_body($self); 
    162172} 
    163173 
  • lang/perl/HTTP-Engine/branches/lazy_request/lib/HTTP/Engine/RequestBuilder.pm

    r13407 r13408  
    2727 
    2828no Moose; 
    29  
    30 sub prepare { 
    31     my ($self, $context) = @_; 
    32  
    33     # init. 
    34     delete $self->{_prepared_read}; 
    35  
    36     # do build. 
    37     for my $method (qw( body uploads )) { 
    38         my $method = "_prepare_$method"; 
    39         $self->$method($context); 
    40     } 
    41 } 
    4229 
    4330sub _build_connection_info { 
     
    10895} 
    10996 
    110 sub _prepare_body  { 
    111     my($self, $c) = @_; 
    112  
    113     my $req = $c->req; 
     97sub _build_initial_http_body  { 
     98    my($self, $req) = @_; 
    11499 
    115100    # TODO: catalyst のように prepare フェーズで処理せず、遅延評価できるようにする  
    116     $self->read_length($req->header('Content-Length') || 0); 
     101    my $length = $req->header('Content-Length') || 0; 
    117102    my $type = $req->header('Content-Type'); 
    118103 
    119     $req->http_body( HTTP::Body->new($type, $self->read_length) ); 
    120     $req->http_body->{tmpdir} = $self->upload_tmp if $self->upload_tmp; 
    121  
    122     $self->_read_to_end($c); 
     104    my $body = HTTP::Body->new($type, $length); 
     105    $body->{tmpdir} = $self->upload_tmp if $self->upload_tmp; 
     106 
     107    return { 
     108        read_length => $length, 
     109        body        => $body, 
     110    }; 
     111} 
     112 
     113sub _build_full_http_body { 
     114    my ( $self, $req ) = @_; 
     115    $self->_read_to_end($req); 
     116    return $req->_http_body->{body}; 
     117} 
     118 
     119sub _build_raw_body { 
     120    my ( $self, $req ) = @_; 
     121    $self->_read_to_end($req); 
     122    return $req->_raw_body; 
    123123} 
    124124 
    125125sub _read_to_end { 
    126     my ( $self, $c ) = @_; 
    127  
    128     if ($self->read_length > 0) { 
    129         $self->_read_all($c); 
     126    my ( $self, $req ) = @_; 
     127 
     128    if ($req->_http_body->{read_length} > 0) { 
     129        $self->_read_all($req); 
    130130 
    131131        # paranoia against wrong Content-Length header 
     
    139139 
    140140sub _read_all { 
    141     my ( $self, $c ) = @_; 
     141    my ( $self, $req ) = @_; 
    142142 
    143143    while (my $buffer = $self->_read) { 
    144         $self->_prepare_body_chunk($c, $buffer); 
     144        $self->_prepare_body_chunk($req, $buffer); 
    145145    } 
    146146} 
    147147 
    148148sub _prepare_body_chunk { 
    149     my($self, $c, $chunk) = @_; 
    150  
    151     my $req = $c->req; 
    152  
    153     $req->_raw_body($req->raw_body . $chunk); 
    154  
    155     $req->http_body->add($chunk); 
     149    my($self, $req, $chunk) = @_; 
     150 
     151    $req->_raw_body($req->_raw_body . $chunk); 
     152    $req->_http_body->{body}->add($chunk); 
    156153} 
    157154 
  • lang/perl/HTTP-Engine/branches/lazy_request/t/10_request_builder.t

    r13365 r13408  
    22use YAML (); 
    33use HTTP::Engine::Context; 
     4use HTTP::Engine::Request; 
    45use HTTP::Engine::RequestBuilder; 
    56use IO::Scalar; 
    67 
    78plan tests => 8; 
    8  
    9 can_ok( 
    10     'HTTP::Engine::RequestBuilder' => 'prepare' 
    11 ); 
    129 
    1310filters { 
     
    2118 
    2219    local %ENV = %{ $block->env }; 
    23     my $c = HTTP::Engine::Context->new(); 
    2420 
    2521    tie *STDIN, 'IO::Scalar', \( $block->body ); 
    26     $builder->prepare($c); 
     22 
     23    my $c = HTTP::Engine::Context->new( 
     24        req => HTTP::Engine::Request->new( request_builder => $builder ), 
     25    ); 
     26 
     27    eval $block->test; 
     28 
    2729    untie *STDIN; 
    2830 
    29     eval $block->test; 
    3031    die $@ if $@; 
    3132};