line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package CGI::Application::Plugin::Routes; |
2
|
1
|
|
|
1
|
|
18936
|
use strict; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
30
|
|
3
|
1
|
|
|
1
|
|
5
|
use Carp; |
|
1
|
|
|
|
|
2
|
|
|
1
|
|
|
|
|
64
|
|
4
|
|
|
|
|
|
|
|
5
|
1
|
|
|
1
|
|
4
|
use vars qw($VERSION @ISA @EXPORT); |
|
1
|
|
|
|
|
4
|
|
|
1
|
|
|
|
|
93
|
|
6
|
|
|
|
|
|
|
|
7
|
|
|
|
|
|
|
our $VERSION = '1.02'; |
8
|
|
|
|
|
|
|
|
9
|
|
|
|
|
|
|
sub import { |
10
|
1
|
|
|
1
|
|
8
|
my $pkg = shift; |
11
|
1
|
|
|
|
|
2
|
my $callpkg = caller; |
12
|
|
|
|
|
|
|
|
13
|
|
|
|
|
|
|
# Do our own exporting. |
14
|
|
|
|
|
|
|
{ |
15
|
1
|
|
|
1
|
|
4
|
no strict qw(refs); |
|
1
|
|
|
|
|
1
|
|
|
1
|
|
|
|
|
693
|
|
|
1
|
|
|
|
|
2
|
|
16
|
1
|
|
|
|
|
1
|
*{ $callpkg . '::routes' } = \&CGI::Application::Plugin::Routes::routes; |
|
1
|
|
|
|
|
5
|
|
17
|
1
|
|
|
|
|
2
|
*{ $callpkg . '::routes_parse' } = \&CGI::Application::Plugin::Routes::routes_parse; |
|
1
|
|
|
|
|
3
|
|
18
|
1
|
|
|
|
|
1
|
*{ $callpkg . '::routes_dbg' } = \&CGI::Application::Plugin::Routes::routes_dbg; |
|
1
|
|
|
|
|
4
|
|
19
|
1
|
|
|
|
|
2
|
*{ $callpkg . '::routes_root' } = \&CGI::Application::Plugin::Routes::routes_root; |
|
1
|
|
|
|
|
3
|
|
20
|
1
|
|
|
|
|
2
|
*{ $callpkg . '::routes_params' } = \&CGI::Application::Plugin::Routes::routes_params; |
|
1
|
|
|
|
|
3
|
|
21
|
|
|
|
|
|
|
|
22
|
|
|
|
|
|
|
} |
23
|
|
|
|
|
|
|
|
24
|
1
|
50
|
|
|
|
9
|
if ( ! UNIVERSAL::isa($callpkg, 'CGI::Application') ) { |
|
|
0
|
|
|
|
|
|
25
|
1
|
|
|
|
|
43
|
warn "Calling package is not a CGI::Application module so not setting up the prerun hook. If you are using \@ISA instead of 'use base', make sure it is in a BEGIN { } block, and make sure these statements appear before the plugin is loaded"; |
26
|
|
|
|
|
|
|
} |
27
|
|
|
|
|
|
|
elsif ( ! UNIVERSAL::can($callpkg, 'add_callback')) { |
28
|
0
|
|
|
|
|
|
warn "You are using an older version of CGI::Application that does not support callbacks, so the prerun method can not be registered automatically (Lookup the prerun_callback method in the docs for more info)"; |
29
|
|
|
|
|
|
|
} |
30
|
|
|
|
|
|
|
else { |
31
|
|
|
|
|
|
|
#Add the required callback to the CGI::Application app so it executes the routes_parse sub on the prerun stage |
32
|
0
|
|
|
|
|
|
$callpkg->add_callback( prerun => 'routes_parse' ); |
33
|
|
|
|
|
|
|
} |
34
|
|
|
|
|
|
|
} |
35
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
sub routes { |
37
|
0
|
|
|
0
|
1
|
|
my ($self, $table) = @_; |
38
|
0
|
|
|
|
|
|
$self->{'Application::Plugin::Routes::__dispatch_table'} = $table; |
39
|
|
|
|
|
|
|
#register every runmode declared. |
40
|
0
|
|
|
|
|
|
for(my $i = 1 ; $i < scalar(@$table) ; $i += 2) { |
41
|
0
|
|
|
|
|
|
my $rm_name = $table->[$i]; |
42
|
0
|
|
|
|
|
|
$self->run_modes([$rm_name]); |
43
|
|
|
|
|
|
|
} |
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
sub routes_dbg { |
47
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
48
|
0
|
|
|
|
|
|
require Data::Dumper; |
49
|
0
|
|
|
|
|
|
return Dumper($self->{'Application::Plugin::Routes::__r_params'}); |
50
|
|
|
|
|
|
|
} |
51
|
|
|
|
|
|
|
|
52
|
|
|
|
|
|
|
sub routes_root{ |
53
|
0
|
|
|
0
|
1
|
|
my ($self, $root) = @_; |
54
|
|
|
|
|
|
|
#make sure no trailing slash is present on the root. |
55
|
0
|
|
|
|
|
|
$root =~ s/\/$//; |
56
|
0
|
|
|
|
|
|
$self->{'Application::Plugin::Routes::__routes_root'} = $root; |
57
|
|
|
|
|
|
|
} |
58
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
sub routes_params{ |
60
|
0
|
|
|
0
|
1
|
|
my ($self) = shift; |
61
|
0
|
0
|
|
|
|
|
if ( @_ ){ |
62
|
0
|
|
|
|
|
|
$self->{'Application::Plugin::Routes::__routes_params'} = [ @_ ]; |
63
|
|
|
|
|
|
|
} |
64
|
0
|
|
|
|
|
|
return $self->{'Application::Plugin::Routes::__routes_params'}; |
65
|
|
|
|
|
|
|
} |
66
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
sub routes_parse { |
68
|
|
|
|
|
|
|
#all this routine, except a few own modifications was borrowed from the wonderful |
69
|
|
|
|
|
|
|
# Michael Peter's CGI::Application::Dispatch module that can be found here: |
70
|
|
|
|
|
|
|
# http://search.cpan.org/~wonko/CGI-Application-Dispatch/ |
71
|
0
|
|
|
0
|
1
|
|
my ($self) = @_; |
72
|
0
|
|
|
|
|
|
my $path = $self->query->path_info; |
73
|
|
|
|
|
|
|
# get the module name from the table |
74
|
0
|
|
|
|
|
|
my $table = $self->{'Application::Plugin::Routes::__dispatch_table'}; |
75
|
0
|
0
|
|
|
|
|
unless(ref($table) eq 'ARRAY') { |
76
|
0
|
|
|
|
|
|
carp "[__parse_path] Invalid or no dispatch table!\n"; |
77
|
0
|
|
|
|
|
|
return; |
78
|
|
|
|
|
|
|
} |
79
|
|
|
|
|
|
|
# look at each rule and stop when we get a match |
80
|
0
|
|
|
|
|
|
for(my $i = 0 ; $i < scalar(@$table) ; $i += 2) { |
81
|
0
|
|
|
|
|
|
my $rule = $self->{'Application::Plugin::Routes::__routes_root'} . $table->[$i]; |
82
|
0
|
|
|
|
|
|
my @names = (); |
83
|
|
|
|
|
|
|
# translate the rule into a regular expression, but remember where the named args are |
84
|
|
|
|
|
|
|
# '/:foo' will become '/([^\/]*)' |
85
|
|
|
|
|
|
|
# and |
86
|
|
|
|
|
|
|
# '/:bar?' will become '/?([^\/]*)?' |
87
|
|
|
|
|
|
|
# and then remember which position it matches |
88
|
0
|
|
|
|
|
|
$rule =~ s{ |
89
|
|
|
|
|
|
|
(^|/) # beginning or a / |
90
|
|
|
|
|
|
|
(:([^/\?]+)(\?)?) # stuff in between |
91
|
|
|
|
|
|
|
}{ |
92
|
0
|
|
|
|
|
|
push(@names, $3); |
93
|
0
|
0
|
|
|
|
|
$1 . ($4 ? '?([^/]*)?' : '([^/]*)') |
94
|
|
|
|
|
|
|
}gxe; |
95
|
|
|
|
|
|
|
# '/*/' will become '/(.*)/$' the end / is added to the end of |
96
|
|
|
|
|
|
|
# both $rule and $path elsewhere |
97
|
0
|
0
|
|
|
|
|
if($rule =~ m{/\*/$}) { |
98
|
0
|
|
|
|
|
|
$rule =~ s{/\*/$}{/(.*)/\$}; |
99
|
0
|
|
|
|
|
|
push(@names, 'dispatch_url_remainder'); |
100
|
|
|
|
|
|
|
} |
101
|
|
|
|
|
|
|
# if we found a match, then run with it |
102
|
0
|
0
|
|
|
|
|
if(my @values = ($path =~ m#^$rule$#)) { |
103
|
0
|
|
|
|
|
|
$self->{'Application::Plugin::Routes::__match'} = $path; |
104
|
0
|
|
|
|
|
|
$self->routes_params( @names ); |
105
|
0
|
|
|
|
|
|
my %named_args; |
106
|
0
|
|
|
|
|
|
$self->param('rm',$table->[++$i]); |
107
|
|
|
|
|
|
|
|
108
|
0
|
|
|
|
|
|
my $rm_name = $table->[$i]; |
109
|
0
|
|
|
|
|
|
$self->prerun_mode($rm_name); |
110
|
|
|
|
|
|
|
|
111
|
0
|
0
|
|
|
|
|
@named_args{@names} = @values if @names; |
112
|
|
|
|
|
|
|
#force params into $self->query. NOTE that it will overwrite any existing param with the same name |
113
|
0
|
|
|
|
|
|
foreach my $k (keys %named_args){ |
114
|
0
|
|
|
|
|
|
$self->query->param("$k", $named_args{$k}); |
115
|
|
|
|
|
|
|
} |
116
|
0
|
|
|
|
|
|
$self->{'Application::Plugin::Routes::__r_params'} = {"parsed_params: " => \%named_args, "path_received: " => $path, "rule_matched: " => $rule, "runmode: " => $rm_name}; |
117
|
|
|
|
|
|
|
} |
118
|
|
|
|
|
|
|
} |
119
|
|
|
|
|
|
|
} |
120
|
|
|
|
|
|
|
|
121
|
|
|
|
|
|
|
1; |
122
|
|
|
|
|
|
|
__END__ |