Show
Ignore:
Timestamp:
06/20/08 16:31:08 (5 years ago)
Author:
nothingmuch
Message:

improve error handling

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/POE-Component-Server-JSONRPC/trunk/lib/POE/Component/Server/JSONRPC.pm

    r14243 r14290  
    55use JSON::RPC::Common::Procedure::Call; 
    66use JSON::RPC::Common::Procedure::Return; 
    7  
    8 use JSON::RPC::Common::Procedure::Return::Version_1_0; 
    9 use JSON::RPC::Common::Procedure::Return::Version_1_0::Error; 
    107 
    118our $VERSION = '0.02'; 
     
    106103); 
    107104 
     105has default_version => ( 
     106    isa => "Str", 
     107    is  => "rw", 
     108    default => sub { "1.0" } 
     109); 
     110 
     111has return_class => ( 
     112    isa => "ClassName", 
     113    is  => "rw", 
     114    lazy_build => 1, 
     115    handles => { "create_return" => "new_from_data" }, 
     116); 
     117 
     118sub _build_return_class { 
     119    my $self = shift; 
     120 
     121    my $class = JSON::RPC::Common::Procedure::Return->_version_class( $self->default_version ); 
     122 
     123    Class::MOP::load_class($class); 
     124 
     125    return $class; 
     126} 
     127 
    108128=head1 HANDLER PARAMETERS 
    109129 
     
    218238            } 
    219239        } else { 
    220             # result, track req IDs, map back 
     240            # FIXME result, track req IDs, map back 
    221241        } 
    222242    } else { 
     243        $msg = (split /\n/, $msg)[0]; 
     244        $msg =~ s/ at .+? line \d+//; 
    223245        $kernel->yield(error => $client, $msg); 
    224246    } 
     
    230252 
    231253event error => sub { 
    232     my ($kernel, $client, $error, $call) = @_[KERNEL, ARG0 .. ARG2]; 
    233  
    234     if ( $call ) { 
    235         $client->put( $call->return_error($error) ); 
    236     } else { 
    237         $client->put( 
    238             JSON::RPC::Common::Procedure::Return::Version_1_0->new( 
    239                 id    => undef, 
    240                 error => JSON::RPC::Common::Procedure::Return::Version_1_0::Error->new( 
    241                     message => $error, 
    242                 ), 
    243             ), 
    244         ); 
    245     } 
     254    my ($self, $kernel, $client, $error, $call) = @_[OBJECT, KERNEL, ARG0 .. ARG2]; 
     255 
     256    $client->put( $call ? $call->return_error($error) : $self->new_error($error) ); 
     257}; 
     258 
     259sub new_error { 
     260    my ( $self, @args ) = @_; 
     261 
     262    $self->create_return( 
     263        id    => undef, 
     264        error => ( @args % 2 == 0 ? {@args} : $args[0] || "Invalid request" ), 
     265    ); 
    246266}; 
    247267