line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Catalyst::Action::REST::ForBrowsers; |
2
|
|
|
|
|
|
|
$Catalyst::Action::REST::ForBrowsers::VERSION = '1.21'; |
3
|
6
|
|
|
6
|
|
90080
|
use Moose; |
|
6
|
|
|
|
|
14
|
|
|
6
|
|
|
|
|
29
|
|
4
|
6
|
|
|
6
|
|
31854
|
use namespace::autoclean; |
|
6
|
|
|
|
|
13
|
|
|
6
|
|
|
|
|
41
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
extends 'Catalyst::Action::REST'; |
7
|
6
|
|
|
6
|
|
3863
|
use Catalyst::Request::REST::ForBrowsers; |
|
6
|
|
|
|
|
16
|
|
|
6
|
|
|
|
|
1183
|
|
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
sub BUILDARGS { |
10
|
6
|
|
|
6
|
1
|
13
|
my $class = shift; |
11
|
6
|
|
|
|
|
10
|
my $config = shift; |
12
|
6
|
|
|
|
|
37
|
Catalyst::Request::REST::ForBrowsers->_insert_self_into( $config->{class} ); |
13
|
6
|
|
|
|
|
150
|
return $class->SUPER::BUILDARGS( $config, @_ ); |
14
|
|
|
|
|
|
|
} |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
override dispatch => sub { |
17
|
|
|
|
|
|
|
my $self = shift; |
18
|
|
|
|
|
|
|
my $c = shift; |
19
|
|
|
|
|
|
|
|
20
|
|
|
|
|
|
|
my $req = $c->request(); |
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
return super() |
23
|
|
|
|
|
|
|
unless $req->can('looks_like_browser') |
24
|
|
|
|
|
|
|
&& $req->looks_like_browser() |
25
|
|
|
|
|
|
|
&& uc $c->request()->method() eq 'GET'; |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
my $controller = $c->component( $self->class ); |
28
|
|
|
|
|
|
|
my $rest_method = $self->name() . '_GET_html'; |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
if ( $controller->action_for($rest_method) |
31
|
|
|
|
|
|
|
|| $controller->can($rest_method) ) { |
32
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
return $self->_dispatch_rest_method( $c, $rest_method ); |
34
|
|
|
|
|
|
|
} |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
return super(); |
37
|
|
|
|
|
|
|
}; |
38
|
|
|
|
|
|
|
|
39
|
|
|
|
|
|
|
__PACKAGE__->meta->make_immutable; |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
1; |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=head1 NAME |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
Catalyst::Action::REST::ForBrowsers - Automated REST Method Dispatching that Accommodates Browsers |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
=head1 SYNOPSIS |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
sub foo :Local :ActionClass('REST::ForBrowsers') { |
50
|
|
|
|
|
|
|
... do setup for HTTP method specific handlers ... |
51
|
|
|
|
|
|
|
} |
52
|
|
|
|
|
|
|
|
53
|
|
|
|
|
|
|
sub foo_GET : Private { |
54
|
|
|
|
|
|
|
... do something for GET requests ... |
55
|
|
|
|
|
|
|
} |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
sub foo_GET_html : Private { |
58
|
|
|
|
|
|
|
... do something for GET requests from browsers ... |
59
|
|
|
|
|
|
|
} |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
sub foo_PUT : Private { |
62
|
|
|
|
|
|
|
... do something for PUT requests ... |
63
|
|
|
|
|
|
|
} |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=head1 DESCRIPTION |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
This class subclasses L<Catalyst::Action::REST> to add an additional |
68
|
|
|
|
|
|
|
dispatching hook. If the request is a GET request I<and> the request looks |
69
|
|
|
|
|
|
|
like it comes from a browser, it tries to dispatch to a C<GET_html> method |
70
|
|
|
|
|
|
|
before trying to the C<GET> method instead. All other HTTP methods are |
71
|
|
|
|
|
|
|
dispatched in the same way. |
72
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
For example, in the synopsis above, calling GET on "/foo" from a browser will |
74
|
|
|
|
|
|
|
end up calling the C<foo_GET_html> method. If the request is I<not> from a |
75
|
|
|
|
|
|
|
browser, it will call C<foo_GET>. |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
See L<Catalyst::Action::REST> for more details on dispatching details. |
78
|
|
|
|
|
|
|
|
79
|
|
|
|
|
|
|
=head1 METHODS |
80
|
|
|
|
|
|
|
|
81
|
|
|
|
|
|
|
=over 4 |
82
|
|
|
|
|
|
|
|
83
|
|
|
|
|
|
|
=item dispatch |
84
|
|
|
|
|
|
|
|
85
|
|
|
|
|
|
|
This method overrides the default dispatch mechanism to the re-dispatching |
86
|
|
|
|
|
|
|
mechanism described above. |
87
|
|
|
|
|
|
|
|
88
|
|
|
|
|
|
|
=back |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
=head1 SEE ALSO |
91
|
|
|
|
|
|
|
|
92
|
|
|
|
|
|
|
You likely want to look at L<Catalyst::Controller::REST>, which implements a |
93
|
|
|
|
|
|
|
sensible set of defaults for a controller doing REST. |
94
|
|
|
|
|
|
|
|
95
|
|
|
|
|
|
|
This class automatically adds the |
96
|
|
|
|
|
|
|
L<Catalyst::TraitFor::Request::REST::ForBrowsers> role to your request class. |
97
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
=head1 CONTRIBUTORS |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
Dave Rolsky E<lt>autarch@urth.orgE<gt> |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=head1 COPYRIGHT |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
Copyright the above named AUTHOR and CONTRIBUTORS |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
=head1 LICENSE |
107
|
|
|
|
|
|
|
|
108
|
|
|
|
|
|
|
You may distribute this code under the same terms as Perl itself. |
109
|
|
|
|
|
|
|
|
110
|
|
|
|
|
|
|
=cut |
111
|
|
|
|
|
|
|
|