package URI::_server; require URI::_generic; @ISA=qw(URI::_generic); use strict; use URI::Escape qw(uri_unescape); sub _uric_escape { my($class, $str) = @_; if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) { my($scheme, $host, $rest) = ($1, $2, $3); my $ui = $host =~ s/(.*@)// ? $1 : ""; my $port = $host =~ s/(:\d+)\z// ? $1 : ""; if (_host_escape($host)) { $str = "$scheme//$ui$host$port$rest"; } } return $class->SUPER::_uric_escape($str); } sub _host_escape { return unless $_[0] =~ /[^URI::uric]/; eval { require URI::_idna; $_[0] = URI::_idna::encode($_[0]); }; return 0 if $@; return 1; } sub as_iri { my $self = shift; my $str = $self->SUPER::as_iri; if ($str =~ /\bxn--/) { if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) { my($scheme, $host, $rest) = ($1, $2, $3); my $ui = $host =~ s/(.*@)// ? $1 : ""; my $port = $host =~ s/(:\d+)\z// ? $1 : ""; require URI::_idna; $host = URI::_idna::decode($host); $str = "$scheme//$ui$host$port$rest"; } } return $str; } sub userinfo { my $self = shift; my $old = $self->authority; if (@_) { my $new = $old; $new = "" unless defined $new; $new =~ s/.*@//; # remove old stuff my $ui = shift; if (defined $ui) { $ui =~ s/@/%40/g; # protect @ $new = "$ui\@$new"; } $self->authority($new); } return undef if !defined($old) || $old !~ /(.*)@/; return $1; } sub host { my $self = shift; my $old = $self->authority; if (@_) { my $tmp = $old; $tmp = "" unless defined $tmp; my $ui = ($tmp =~ /(.*@)/) ? $1 : ""; my $port = ($tmp =~ /(:\d+)$/) ? $1 : ""; my $new = shift; $new = "" unless defined $new; if (length $new) { $new =~ s/[@]/%40/g; # protect @ if ($new =~ /^[^:]*:\d*\z/ || $new =~ /]:\d*\z/) { $new =~ s/(:\d*)\z// || die "Assert"; $port = $1; } $new = "[$new]" if $new =~ /:/ && $new !~ /^\[/; # IPv6 address _host_escape($new); } $self->authority("$ui$new$port"); } return undef unless defined $old; $old =~ s/.*@//; $old =~ s/:\d+$//; # remove the port $old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2) return uri_unescape($old); } sub ihost { my $self = shift; my $old = $self->host(@_); if ($old =~ /(^|\.)xn--/) { require URI::_idna; $old = URI::_idna::decode($old); } return $old; } sub _port { my $self = shift; my $old = $self->authority; if (@_) { my $new = $old; $new =~ s/:\d*$//; my $port = shift; $new .= ":$port" if defined $port; $self->authority($new); } return $1 if defined($old) && $old =~ /:(\d*)$/; return; } sub port { my $self = shift; my $port = $self->_port(@_); $port = $self->default_port if !defined($port) || $port eq ""; $port; } sub host_port { my $self = shift; my $old = $self->authority; $self->host(shift) if @_; return undef unless defined $old; $old =~ s/.*@//; # zap userinfo $old =~ s/:$//; # empty port should be treated the same a no port $old .= ":" . $self->port unless $old =~ /:\d+$/; $old; } sub default_port { undef } sub canonical { my $self = shift; my $other = $self->SUPER::canonical; my $host = $other->host || ""; my $port = $other->_port; my $uc_host = $host =~ /[A-Z]/; my $def_port = defined($port) && ($port eq "" || $port == $self->default_port); if ($uc_host || $def_port) { $other = $other->clone if $other == $self; $other->host(lc $host) if $uc_host; $other->port(undef) if $def_port; } $other; } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
file | Folder | 0755 |
|
|
urn | Folder | 0755 |
|
|
Escape.pm | File | 6.49 KB | 0644 |
|
Heuristic.pm | File | 6.41 KB | 0644 |
|
IRI.pm | File | 769 B | 0644 |
|
QueryParam.pm | File | 4.47 KB | 0644 |
|
Split.pm | File | 2.3 KB | 0644 |
|
URL.pm | File | 5.4 KB | 0644 |
|
WithBase.pm | File | 3.74 KB | 0644 |
|
_foreign.pm | File | 75 B | 0644 |
|
_generic.pm | File | 5.63 KB | 0644 |
|
_idna.pm | File | 1.99 KB | 0644 |
|
_ldap.pm | File | 3.17 KB | 0644 |
|
_login.pm | File | 222 B | 0644 |
|
_punycode.pm | File | 4.52 KB | 0644 |
|
_query.pm | File | 2.39 KB | 0644 |
|
_segment.pm | File | 377 B | 0644 |
|
_server.pm | File | 3.62 KB | 0644 |
|
_userpass.pm | File | 977 B | 0644 |
|
data.pm | File | 3.28 KB | 0644 |
|
file.pm | File | 9.58 KB | 0644 |
|
ftp.pm | File | 1.03 KB | 0644 |
|
gopher.pm | File | 2.34 KB | 0644 |
|
http.pm | File | 405 B | 0644 |
|
https.pm | File | 107 B | 0644 |
|
ldap.pm | File | 2.9 KB | 0644 |
|
ldapi.pm | File | 460 B | 0644 |
|
ldaps.pm | File | 107 B | 0644 |
|
mailto.pm | File | 1.24 KB | 0644 |
|
mms.pm | File | 89 B | 0644 |
|
news.pm | File | 1.39 KB | 0644 |
|
nntp.pm | File | 91 B | 0644 |
|
pop.pm | File | 1.15 KB | 0644 |
|
rlogin.pm | File | 96 B | 0644 |
|
rsync.pm | File | 197 B | 0644 |
|
rtsp.pm | File | 89 B | 0644 |
|
rtspu.pm | File | 90 B | 0644 |
|
sip.pm | File | 1.72 KB | 0644 |
|
sips.pm | File | 105 B | 0644 |
|
snews.pm | File | 136 B | 0644 |
|
ssh.pm | File | 140 B | 0644 |
|
telnet.pm | File | 95 B | 0644 |
|
tn3270.pm | File | 95 B | 0644 |
|
urn.pm | File | 1.91 KB | 0644 |
|