📄 abs.al
字号:
# NOTE: Derived from blib\lib\URI\URL\_generic.pm.
# Changes made here will be lost when autosplit again.
# See AutoSplit.pm.
package URI::URL::_generic;
#line 326 "blib\lib\URI\URL\_generic.pm (autosplit into blib\lib\auto/URI\URL\_generic/abs.al)"
# Generic-RL: Resolving Relative URL into an Absolute URL
#
# Based on RFC1808 section 4
#
sub abs
{
my($self, $base, $allow_relative_scheme) = @_;
$allow_relative_scheme = $URI::URL::ABS_ALLOW_RELATIVE_SCHEME if @_ < 3;
my $embed = $self->clone;
$base = $self->base unless $base; # default to default base
return $embed unless $base; # we have no base (step1)
$base = new URI::URL $base unless ref $base; # make obj if needed
my($scheme, $host, $path, $params, $query, $frag) =
@{$embed}{qw(scheme host path params query frag)};
# just use base if we are empty (2a)
return $base->clone
unless grep(defined($_) && $_ ne '',
$scheme,$host,$port,$path,$params,$query,$frag);
# if we have a scheme we must already be absolute (2b),
#
# but sec. 5.2 also says: Some older parsers allow the scheme name
# to be present in a relative URL if it is the same as the base
# URL scheme. This is considered to be a loophole in prior
# specifications of the partial URLs and should be avoided by
# future parsers.
#
# The old behavoir can be enabled by passing a TRUE value to the
# $allow_relative_scheme parameter.
return $embed if $scheme &&
(!$allow_relative_scheme || $scheme ne $base->{'scheme'});
$embed->{'_str'} = ''; # void cached string
$embed->{'scheme'} = $base->{'scheme'}; # (2c)
return $embed if $embed->{'netloc'}; # (3)
$embed->netloc($base->{'netloc'}); # (3)
return $embed if $path =~ m:^/:; # (4)
if ($path eq '') { # (5)
$embed->{'path'} = $base->{'path'}; # (5)
return $embed if defined $embed->{'params'}; # (5a)
$embed->{'params'} = $base->{'params'}; # (5a)
return $embed if defined $embed->{'query'}; # (5b)
$embed->{'query'} = $base->{'query'}; # (5b)
return $embed;
}
# (Step 6) # draft 6 suggests stack based approach
my $basepath = $base->{'path'};
my $relpath = $embed->{'path'};
$basepath =~ s!^/!!;
$basepath =~ s!/$!/.!; # prevent empty segment
my @path = split('/', $basepath); # base path into segments
pop(@path); # remove last segment
$relpath =~ s!/$!/.!; # prevent empty segment
push(@path, split('/', $relpath)); # append relative segments
my @newpath = ();
my $isdir = 0;
my $segment;
foreach $segment (@path) { # left to right
if ($segment eq '.') { # ignore "same" directory
$isdir = 1;
}
elsif ($segment eq '..') {
$isdir = 1;
my $last = pop(@newpath);
if (!defined $last) { # nothing to pop
push(@newpath, $segment); # so must append
}
elsif ($last eq '..') { # '..' cannot match '..'
# so put back again, and append
push(@newpath, $last, $segment);
}
#else
# it was a component,
# keep popped
} else {
$isdir = 0;
push(@newpath, $segment);
}
}
if ($URI::URL::ABS_REMOTE_LEADING_DOTS) {
shift @newpath while @newpath && $newpath[0] =~ /^\.\.?$/;
}
$embed->{'path'} = '/' . join('/', @newpath) .
($isdir && @newpath ? '/' : '');
$embed;
}
# end of URI::URL::_generic::abs
1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -