MarpaX-Role-Parameterized-ResourceIdentifier
view release on metacpan or search on metacpan
lib/MarpaX/Role/Parameterized/ResourceIdentifier/BNF.pm view on Meta::CPAN
#
if ($is_generic) {
#
# query_form: copy of original's URI logic
#
install_modifier($whoami, 'fresh', query_form =>
sub {
my $old = $_[0]->query;
if ($#_ > 0) {
my @args;
# Try to set query string
my $delim;
my $r = $_[1];
if (ref($r) eq "ARRAY") {
$delim = $_[2];
@args = @{$r};
} elsif (ref($r) eq "HASH") {
$delim = $_[2];
@args = %{$r};
} else {
@args = @_[1..$#_];
}
$delim = pop(@args) if (@args % 2);
my @query;
while (my ($key, $vals) = splice(@args, 0, 2)) {
$key = '' unless defined $key;
$key =~ s/([;\/?:@&=+,\$\[\]%])/$_[0]->percent_encode($1)/eg;
$key =~ s/ /+/g;
$vals = [ref($vals) eq "ARRAY" ? @{$vals} : $vals];
for my $val (@{$vals}) {
$val = '' unless defined $val;
$val =~ s/([;\/?:@&=+,\$\[\]%])/$_[0]->percent_encode($1)/eg;
$val =~ s/ /+/g;
push(@query, "$key=$val");
}
}
if (@query) {
unless ($delim) {
$delim = $1 if $old && $old =~ /([&;])/;
$delim ||= $setup->default_query_form_delimiter;
}
$_[0]->_query_form(join($delim, @query));
} else {
$_[0]->_query_form(undef);
}
}
return if !defined($old) || !length($old) || !defined(wantarray);
return unless $old =~ /=/; # not a form
map {
my $this = $_;
$this =~ s/\+/ /g;
$_[0]->unescape($this)
}
map {
/=/ ? split(/=/, $_, 2) : ($_ => '')
}
split(/[&;]/, $old);
}
);
install_modifier($whoami, 'fresh', query_keywords =>
sub {
my $old = $_[0]->query;
if ($#_ > 0) {
# Try to set query string
my @copy = @_[1..$#_];
@copy = @{$copy[0]} if @copy == 1 && ref($copy[0]) eq "ARRAY";
for (@copy) { s/([;\/?:@&=+,\$\[\]%])/$_[0]->percent_encode($1)/eg; }
$_[0]->path_query($_[0]->_raw_struct->{path}, @copy ? join('+', @copy) : undef);
}
return if !defined($old) || !defined(wantarray);
return if $old =~ /=/; # not keywords, but a form
map { $_[0]->unescape($_) } split(/\+/, $old, -1);
}
);
my $_query_form_inlined = <<_QUERY_FORM_INLINED;
# my (\$self, \$argument) = \@_;
my \$rc = \$_[0]->_escaped_struct->{query};
if (\$#_ > 0) {
my \$new_query = \$_[1];
my \%hash = (
scheme => \$_[0]->_raw_struct->{scheme},
authority => \$_[0]->_raw_struct->{authority},
path => \$_[0]->_raw_struct->{path},
query => \$new_query,
fragment => \$_[0]->_raw_struct->{fragment}
);
\$_[0] = $top->new(\$_[0]->_recompose(\\\%hash));
}
\$rc
_QUERY_FORM_INLINED
install_modifier($whoami, 'fresh', _query_form => eval "sub { $_query_form_inlined }"); ## no critic
my $path_query_inlined = <<PATH_QUERY_INLINED;
# my (\$self, \$argument) = \@_;
#
# This method was invented by URI, we maintain its semantic: return the escaped path
#
my \$rc = \$_[0]->_escaped_struct->{path};
my \$query = \$_[0]->_escaped_struct->{query};
\$rc .= '?' . \$query if (defined \$query);
if (\$#_ > 0) {
my (\$new_path, \$new_query) = (\$_[1] // '', undef); # A path is never undef
if (\$_[1] =~ /\\?/g) {
my \$after_question_mark_pos = pos(\$_[1]);
\$new_path = substr(\$_[1], 0, \$after_question_mark_pos - 1);
\$new_query = substr(\$_[1], \$after_question_mark_pos, length(\$_[1]) - \$after_question_mark_pos);
}
my \%hash = (
scheme => \$_[0]->_raw_struct->{scheme},
authority => \$_[0]->_raw_struct->{authority},
path => \$new_path,
query => \$new_query,
fragment => \$_[0]->_raw_struct->{fragment}
);
\$_[0] = $top->new(\$_[0]->_recompose(\\\%hash));
}
\$rc
PATH_QUERY_INLINED
install_modifier($whoami, 'fresh', path_query => eval "sub { $path_query_inlined }"); ## no critic
( run in 2.070 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )