3 @ISA=qw(URI::_generic);
6 use URI::Escape qw(uri_unescape);
10 if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) {
11 my($scheme, $host, $rest) = ($1, $2, $3);
12 my $ui = $host =~ s/(.*@)// ? $1 : "";
13 my $port = $host =~ s/(:\d+)\z// ? $1 : "";
14 if (_host_escape($host)) {
15 $str = "$scheme//$ui$host$port$rest";
18 return $class->SUPER::_uric_escape($str);
22 return unless $_[0] =~ /[^URI::uric]/;
24 $_[0] = URI::_idna::encode($_[0]);
30 my $str = $self->SUPER::as_iri;
31 if ($str =~ /\bxn--/) {
32 if ($str =~ m,^((?:$URI::scheme_re:)?)//([^/?\#]*)(.*)$,os) {
33 my($scheme, $host, $rest) = ($1, $2, $3);
34 my $ui = $host =~ s/(.*@)// ? $1 : "";
35 my $port = $host =~ s/(:\d+)\z// ? $1 : "";
37 $host = URI::_idna::encode($host);
38 $str = "$scheme//$ui$host$port$rest";
47 my $old = $self->authority;
51 $new = "" unless defined $new;
52 $new =~ s/.*@//; # remove old stuff
55 $ui =~ s/@/%40/g; # protect @
58 $self->authority($new);
60 return undef if !defined($old) || $old !~ /(.*)@/;
67 my $old = $self->authority;
70 $tmp = "" unless defined $tmp;
71 my $ui = ($tmp =~ /(.*@)/) ? $1 : "";
72 my $port = ($tmp =~ /(:\d+)$/) ? $1 : "";
74 $new = "" unless defined $new;
76 $new =~ s/[@]/%40/g; # protect @
77 if ($new =~ /^[^:]*:\d*\z/ || $new =~ /]:\d*\z/) {
78 $new =~ s/(:\d*)\z// || die "Assert";
81 $new = "[$new]" if $new =~ /:/ && $new !~ /^\[/; # IPv6 address
84 $self->authority("$ui$new$port");
86 return undef unless defined $old;
88 $old =~ s/:\d+$//; # remove the port
89 $old =~ s{^\[(.*)\]$}{$1}; # remove brackets around IPv6 (RFC 3986 3.2.2)
90 return uri_unescape($old);
96 my $old = $self->host(@_);
97 if ($old =~ /(^|\.)xn--/) {
99 $old = URI::_idna::decode($old);
107 my $old = $self->authority;
112 $new .= ":$port" if defined $port;
113 $self->authority($new);
115 return $1 if defined($old) && $old =~ /:(\d*)$/;
122 my $port = $self->_port(@_);
123 $port = $self->default_port if !defined($port) || $port eq "";
130 my $old = $self->authority;
131 $self->host(shift) if @_;
132 return undef unless defined $old;
133 $old =~ s/.*@//; # zap userinfo
134 $old =~ s/:$//; # empty port should be treated the same a no port
135 $old .= ":" . $self->port unless $old =~ /:\d+$/;
140 sub default_port { undef }
145 my $other = $self->SUPER::canonical;
146 my $host = $other->host || "";
147 my $port = $other->_port;
148 my $uc_host = $host =~ /[A-Z]/;
149 my $def_port = defined($port) && ($port eq "" ||
150 $port == $self->default_port);
151 if ($uc_host || $def_port) {
152 $other = $other->clone if $other == $self;
153 $other->host(lc $host) if $uc_host;
154 $other->port(undef) if $def_port;