BBCode-Parser
view release on metacpan or search on metacpan
lib/BBCode/Util.pm view on Meta::CPAN
my($userpass,$hostport);
if(/^ ([^@]*) \@ ([^@]*) $/x) {
($userpass,$hostport) = ($1,$2);
} else {
$hostport = $_;
}
my @ret = (undef) x 4;
$_ = $userpass;
if(defined $_) {
if(/^ ([^:]*) : ([^:]*) $/x) {
@ret[0,1] = ($1,$2);
} else {
$ret[0] = $_;
}
}
$_ = $hostport;
if(s/:(\d+)$//) {
$ret[3] = $1;
} elsif(s/:([\w+-]+)$//) {
$ret[3] = getservbyname($1,'tcp');
goto Failure if not defined $ret[3];
} else {
s/:$//;
}
s/\.*$/./;
if(/^ ( (?: [\w-]+ \. )+ ) $/x) {
$ret[2] = $1;
$ret[2] =~ s/\.$//;
}
goto Failure if not defined $ret[2];
return @ret if wantarray;
return \@ret;
Failure:
return () if wantarray;
return undef;
}
my %urltype = (
'http' => 3,
'https' => 3,
'ftp' => 3,
'file' => 2,
'mailto' => 1,
'data' => 0,
'javascript' => 0,
);
sub _url_parse($$) {
my($str,$schemes) = @_;
my($scheme,$opaque,$fragment) = _url_parse_opaque($str);
return undef unless defined $scheme;
return undef unless exists $urltype{$scheme};
if($urltype{$scheme} > 0) {
my($rest,$query) = _url_parse_query($opaque);
if($urltype{$scheme} > 1) {
my($auth,$path) = _url_parse_path($rest);
return undef unless defined $path;
if($urltype{$scheme} > 2) {
return undef unless defined $auth;
my($user,$pass,$host,$port) = _url_parse_server($auth);
return undef unless defined $host;
$auth = '';
if(defined $user) {
$auth .= $user;
$auth .= ':'.$pass if defined $pass;
$auth .= '@';
}
$auth .= $host;
$auth .= ':'.$port if defined $port;
}
$rest = join '', map { defined $_ ? $_ : '' } ('//',$auth,$path);
}
$opaque = join '', map { defined $_ ? $_ : '' } ($rest,$query);
}
$str = $scheme.':'.$opaque.(defined $fragment ? $fragment : '');
my $url = URI->new_abs($str, 'http://sanity.check.example.com/')->canonical;
return undef unless defined $url->scheme;
return undef unless exists $$schemes{$url->scheme};
return undef if $url->as_string =~ /\bsanity\.check\.example\.com\b/i;
return undef if $url->can('userinfo') and defined $url->userinfo;
return undef if $url->can('host') and not defined $url->host;
if($url->scheme eq 'mailto') {
my %unsafe = $url->headers;
my %safe;
foreach my $key (keys %unsafe) {
if($key =~ /^(?:to|cc|bcc)$/i) {
my @to = split /,/, $unsafe{$key};
$key = lc $key;
foreach(@to) {
if(/^ ( [\w.+-]+ \@ (?: \w[\w-]*(?<=\w) \. )+ [a-z]{2,6} ) $/xi) {
if(exists $safe{$key}) {
$safe{$key} .= ",$1";
} else {
$safe{$key} = $1;
}
}
}
next;
}
if($key =~ /^subject$/i) {
if($unsafe{$key} =~ /^ ( [\x20-\x7E]+ ) $/x) {
$safe{subject} = $1;
}
next;
}
}
return undef unless exists $safe{to};
$url->headers(%safe);
}
return $url;
}
BEGIN { _export qw(parseURL parse) }
my %schemes = map { $_ => 1 } qw(http https ftp mailto data);
sub parseURL($) {
foreach('%', 'http://%', 'mailto:%') {
my $str = $_;
$str =~ s/%/$_[0]/g;
my $url = _url_parse($str, \%schemes);
return $url if defined $url;
}
return undef;
}
BEGIN { _export qw(parseMailURL parse) }
my %mail_schemes = (mailto => 1);
sub parseMailURL($) {
foreach('%', 'mailto:%') {
my $str = $_;
$str =~ s/%/$_[0]/g;
my $url = _url_parse($str, \%mail_schemes);
return $url if defined $url;
}
return undef;
( run in 0.959 second using v1.01-cache-2.11-cpan-364913b4093 )