use Catalyst::Utils;
use URI;
use Scalar::Util ();
+use Encode 2.21 'decode_utf8';
has _endpoints => (
is => 'rw',
my @parents = ();
my $parent = "DUMMY";
my $extra = $self->_list_extra_http_methods($endpoint);
+ my $consumes = $self->_list_extra_consumes($endpoint);
+ my $scheme = $self->_list_extra_scheme($endpoint);
my $curr = $endpoint;
while ($curr) {
if (my $cap = $curr->list_extra_info->{CaptureArgs}) {
if (defined(my $cap = $p->list_extra_info->{CaptureArgs})) {
$name .= ' ('.$cap.')';
}
+ if (defined(my $ct = $p->list_extra_info->{Consumes})) {
+ $name .= ' :'.$ct;
+ }
+ if (defined(my $s = $p->list_extra_info->{Scheme})) {
+ $scheme = uc $s;
+ }
+
unless ($p eq $parents[0]) {
$name = "-> ${name}";
}
push(@rows, [ '', $name ]);
}
- push(@rows, [ '', (@rows ? "=> " : '').($extra ? "$extra " : '')."/${endpoint}" ]);
- $rows[0][0] = join('/', '', @parts) || '/';
+ push(@rows, [ '', (@rows ? "=> " : '').($extra ? "$extra " : ''). ($scheme ? "$scheme: ":'')."/${endpoint}". ($consumes ? " :$consumes":"" ) ]);
+ my @display_parts = map { $_ =~s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg; decode_utf8 $_ } @parts;
+ $rows[0][0] = join('/', '', @display_parts) || '/';
$paths->row(@$_) for @rows;
}
my ( $self, $action ) = @_;
return unless defined $action->list_extra_info->{HTTP_METHODS};
return join(', ', @{$action->list_extra_info->{HTTP_METHODS}});
+
+}
+
+sub _list_extra_consumes {
+ my ( $self, $action ) = @_;
+ return unless defined $action->list_extra_info->{CONSUMES};
+ return join(', ', @{$action->list_extra_info->{CONSUMES}});
+}
+
+sub _list_extra_scheme {
+ my ( $self, $action ) = @_;
+ return unless defined $action->list_extra_info->{Scheme};
+ return uc $action->list_extra_info->{Scheme};
}
=head2 $self->match( $c, $path )
# The current best action might also be Args(0),
# but we couldn't chose between then anyway so we'll take the last seen
- if (!$best_action ||
+ if (
+ !$best_action ||
@parts < @{$best_action->{parts}} ||
- (!@parts && defined($args_attr) && $args_attr eq "0")){
+ (
+ !@parts &&
+ defined($args_attr) &&
+ (
+ $args_attr eq "0" &&
+ (
+ ($c->config->{use_chained_args_0_special_case}||0) ||
+ (
+ exists($best_action->{args_attr}) && defined($best_action->{args_attr}) ?
+ ($best_action->{args_attr} ne 0) : 1
+ )
+ )
+ )
+ )
+ ){
$best_action = {
actions => [ $action ],
captures=> [],
parts => \@parts,
+ args_attr => $args_attr,
n_pathparts => scalar(@pathparts),
};
}
my $args = $action->attributes->{$name}->[0];
if (defined($args) and not (
Scalar::Util::looks_like_number($args) and
- int($args) == $args
+ int($args) == $args and $args >= 0
)) {
require Data::Dumper;
local $Data::Dumper::Terse = 1;
);
}
- $action->attributes->{PathPart} = [ $part ];
+ my $encoded_part = URI->new($part)->canonical;
+ $encoded_part =~ s{(?<=[^/])/+\z}{};
+
+ $action->attributes->{PathPart} = [ $encoded_part ];
- unshift(@{ $children->{$part} ||= [] }, $action);
+ unshift(@{ $children->{$encoded_part} ||= [] }, $action);
$self->_actions->{'/'.$action->reverse} = $action;
if (exists $action->attributes->{Args} and exists $action->attributes->{CaptureArgs}) {
Catalyst::Exception->throw(
- "Combining Args and CaptureArgs not allowed registering " . $action->reverse()
+ "Combining Args and CaptureArgs attributes not supported registering " .
+ $action->reverse()
);
}