| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package JSON::RPC::Spec::Procedure; |
|
2
|
9
|
|
|
9
|
|
113141
|
use Moo; |
|
|
9
|
|
|
|
|
6258
|
|
|
|
9
|
|
|
|
|
90
|
|
|
3
|
9
|
|
|
9
|
|
4555
|
use Carp (); |
|
|
9
|
|
|
|
|
18
|
|
|
|
9
|
|
|
|
|
289
|
|
|
4
|
9
|
|
|
9
|
|
72
|
use Try::Tiny; |
|
|
9
|
|
|
|
|
29
|
|
|
|
9
|
|
|
|
|
1006
|
|
|
5
|
|
|
|
|
|
|
with qw( |
|
6
|
|
|
|
|
|
|
JSON::RPC::Spec::Common |
|
7
|
|
|
|
|
|
|
); |
|
8
|
|
|
|
|
|
|
|
|
9
|
9
|
|
100
|
9
|
|
63
|
use constant DEBUG => $ENV{PERL_JSON_RPC_SPEC_DEBUG} || 0; |
|
|
9
|
|
|
|
|
17
|
|
|
|
9
|
|
|
|
|
1788
|
|
|
10
|
|
|
|
|
|
|
|
|
11
|
|
|
|
|
|
|
has router => ( |
|
12
|
|
|
|
|
|
|
is => 'ro', |
|
13
|
|
|
|
|
|
|
required => 1, |
|
14
|
|
|
|
|
|
|
isa => sub { |
|
15
|
|
|
|
|
|
|
my $self = shift; |
|
16
|
|
|
|
|
|
|
$self->can('match') or Carp::croak('method match required.'); |
|
17
|
|
|
|
|
|
|
}, |
|
18
|
|
|
|
|
|
|
); |
|
19
|
|
|
|
|
|
|
|
|
20
|
9
|
|
|
9
|
|
4965
|
use namespace::clean; |
|
|
9
|
|
|
|
|
167463
|
|
|
|
9
|
|
|
|
|
65
|
|
|
21
|
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
sub parse { |
|
23
|
57
|
|
|
57
|
1
|
5469
|
my ($self, $obj, $extra_args) = @_; |
|
24
|
57
|
100
|
|
|
|
227
|
if (ref $obj ne 'HASH') { |
|
25
|
4
|
|
|
|
|
16
|
return $self->_rpc_invalid_request; |
|
26
|
|
|
|
|
|
|
} |
|
27
|
53
|
|
|
|
|
207
|
$self->_is_notification(!exists $obj->{id}); |
|
28
|
53
|
100
|
100
|
|
|
282
|
if (defined $obj->{id} and ref $obj->{id} ne '') { |
|
29
|
3
|
|
|
|
|
13
|
$self->_id(undef); |
|
30
|
3
|
|
|
|
|
20
|
return $self->_rpc_invalid_request; |
|
31
|
|
|
|
|
|
|
} |
|
32
|
50
|
|
|
|
|
170
|
$self->_id($obj->{id}); |
|
33
|
50
|
|
100
|
|
|
151
|
my $method = $obj->{method} || ''; |
|
34
|
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
# rpc call with invalid Request object: |
|
36
|
|
|
|
|
|
|
# rpc call with an invalid Batch (but not empty): |
|
37
|
|
|
|
|
|
|
# rpc call with invalid Batch: |
|
38
|
50
|
100
|
100
|
|
|
354
|
if ($method eq '' or $method =~ m!\A\.|\A[0-9]+\z!) { |
|
39
|
9
|
|
|
|
|
47
|
return $self->_rpc_invalid_request; |
|
40
|
|
|
|
|
|
|
} |
|
41
|
41
|
|
|
|
|
810
|
my $jsonrpc_version = $self->_jsonrpc; |
|
42
|
41
|
100
|
|
|
|
320
|
$obj->{jsonrpc} ne $jsonrpc_version |
|
43
|
|
|
|
|
|
|
and return $self->_rpc_invalid_request( |
|
44
|
|
|
|
|
|
|
qq{Invalid Request: jsonrpc must be '$jsonrpc_version'}); |
|
45
|
|
|
|
|
|
|
|
|
46
|
39
|
|
|
|
|
65
|
my ($result, $err); |
|
47
|
|
|
|
|
|
|
try { |
|
48
|
39
|
|
|
39
|
|
1450
|
$result = $self->_trigger($method, $obj->{params}, $extra_args); |
|
49
|
|
|
|
|
|
|
} |
|
50
|
|
|
|
|
|
|
catch { |
|
51
|
14
|
|
|
14
|
|
263
|
$err = $_; |
|
52
|
14
|
|
|
|
|
50
|
warn qq{-- error : @{[ $err ]} } if DEBUG; |
|
|
39
|
|
|
|
|
10606
|
|
|
53
|
39
|
|
|
|
|
369
|
}; |
|
54
|
8
|
100
|
|
|
|
25
|
if ($self->_is_notification) { |
|
55
|
31
|
|
|
|
|
75
|
return; |
|
56
|
|
|
|
|
|
|
} |
|
57
|
10
|
100
|
|
|
|
21
|
if ($err) { |
|
58
|
10
|
|
|
|
|
94
|
my $error; |
|
59
|
4
|
100
|
|
|
|
35
|
if ($err =~ m!rpc_method_not_found!) { |
|
|
|
100
|
|
|
|
|
|
|
60
|
4
|
|
|
|
|
18
|
$err =~ s!\sat\s.*?\n\z!!; |
|
61
|
4
|
|
|
|
|
55
|
$err =~ s!rpc_method_not_found!Method not found!; |
|
62
|
2
|
|
|
|
|
21
|
$error = $self->_rpc_method_not_found($err); |
|
63
|
|
|
|
|
|
|
} |
|
64
|
|
|
|
|
|
|
elsif ($err =~ m!rpc_invalid_params!) { |
|
65
|
2
|
|
|
|
|
11
|
$err =~ s!\sat\s.*?\n\z!!; |
|
66
|
2
|
|
|
|
|
15
|
$err =~ s!rpc_invalid_params!Invalid params!; |
|
67
|
4
|
|
|
|
|
14
|
$error = $self->_rpc_invalid_params($err); |
|
68
|
|
|
|
|
|
|
} |
|
69
|
|
|
|
|
|
|
else { |
|
70
|
10
|
|
|
|
|
136
|
$error = $self->_rpc_internal_error(data => $err); |
|
71
|
|
|
|
|
|
|
} |
|
72
|
21
|
|
|
|
|
471
|
return $error; |
|
73
|
|
|
|
|
|
|
} |
|
74
|
|
|
|
|
|
|
return +{ |
|
75
|
0
|
|
|
|
|
0
|
jsonrpc => $self->_jsonrpc, |
|
76
|
|
|
|
|
|
|
result => $result, |
|
77
|
|
|
|
|
|
|
id => $self->_id |
|
78
|
|
|
|
|
|
|
}; |
|
79
|
|
|
|
|
|
|
} |
|
80
|
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
# trigger registered method |
|
82
|
|
|
|
|
|
|
sub _trigger { |
|
83
|
40
|
|
|
40
|
|
4673
|
my ($self, $name, $params, $extra_args) = @_; |
|
84
|
40
|
|
|
|
|
112
|
my $router = $self->router; |
|
85
|
40
|
|
|
|
|
171
|
my $matched = $router->match($name); |
|
86
|
|
|
|
|
|
|
|
|
87
|
|
|
|
|
|
|
# rpc call of non-existent method: |
|
88
|
40
|
100
|
|
|
|
2720
|
unless ($matched) { |
|
89
|
6
|
|
|
|
|
1310
|
Carp::croak 'rpc_method_not_found'; |
|
90
|
|
|
|
|
|
|
} |
|
91
|
34
|
|
|
|
|
911
|
my $cb = delete $matched->{$self->_callback_key}; |
|
92
|
34
|
|
|
|
|
312
|
return $cb->($params, $matched, @{$extra_args}); |
|
|
34
|
|
|
|
|
161
|
|
|
93
|
|
|
|
|
|
|
} |
|
94
|
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
1; |
|
96
|
|
|
|
|
|
|
__END__ |