package URI::_idna; # This module implements the RFCs 3490 (IDNA) and 3491 (Nameprep) # based on Python-2.6.4/Lib/encodings/idna.py use strict; use warnings; use URI::_punycode qw(encode_punycode decode_punycode); use Carp qw(croak); our $VERSION = '1.73'; $VERSION = eval $VERSION; BEGIN { *URI::_idna::_ENV_::JOIN_LEAKS_UTF8_FLAGS = "$]" < 5.008_003 ? sub () { 1 } : sub () { 0 } ; } my $ASCII = qr/^[\x00-\x7F]*\z/; sub encode { my $idomain = shift; my @labels = split(/\./, $idomain, -1); my @last_empty; push(@last_empty, pop @labels) if @labels > 1 && $labels[-1] eq ""; for (@labels) { $_ = ToASCII($_); } return eval 'join(".", @labels, @last_empty)' if URI::_idna::_ENV_::JOIN_LEAKS_UTF8_FLAGS; return join(".", @labels, @last_empty); } sub decode { my $domain = shift; return join(".", map ToUnicode($_), split(/\./, $domain, -1)) } sub nameprep { # XXX real implementation missing my $label = shift; $label = lc($label); return $label; } sub check_size { my $label = shift; croak "Label empty" if $label eq ""; croak "Label too long" if length($label) > 63; return $label; } sub ToASCII { my $label = shift; return check_size($label) if $label =~ $ASCII; # Step 2: nameprep $label = nameprep($label); # Step 3: UseSTD3ASCIIRules is false # Step 4: try ASCII again return check_size($label) if $label =~ $ASCII; # Step 5: Check ACE prefix if ($label =~ /^xn--/) { croak "Label starts with ACE prefix"; } # Step 6: Encode with PUNYCODE $label = encode_punycode($label); # Step 7: Prepend ACE prefix $label = "xn--$label"; # Step 8: Check size return check_size($label); } sub ToUnicode { my $label = shift; $label = nameprep($label) unless $label =~ $ASCII; return $label unless $label =~ /^xn--/; my $result = decode_punycode(substr($label, 4)); my $label2 = ToASCII($result); if (lc($label) ne $label2) { croak "IDNA does not round-trip: '\L$label\E' vs '$label2'"; } return $result; } 1;
Name | Type | Size | Permission | Actions |
---|---|---|---|---|
file | Folder | 0755 |
|
|
urn | Folder | 0755 |
|
|
Escape.pm | File | 6.9 KB | 0644 |
|
Heuristic.pm | File | 6.37 KB | 0644 |
|
IRI.pm | File | 820 B | 0644 |
|
QueryParam.pm | File | 4.77 KB | 0644 |
|
Split.pm | File | 2.32 KB | 0644 |
|
URL.pm | File | 5.36 KB | 0644 |
|
WithBase.pm | File | 3.77 KB | 0644 |
|
_foreign.pm | File | 133 B | 0644 |
|
_generic.pm | File | 5.71 KB | 0644 |
|
_idna.pm | File | 2.06 KB | 0644 |
|
_ldap.pm | File | 3.2 KB | 0644 |
|
_login.pm | File | 257 B | 0644 |
|
_punycode.pm | File | 5.52 KB | 0644 |
|
_query.pm | File | 2.5 KB | 0644 |
|
_segment.pm | File | 442 B | 0644 |
|
_server.pm | File | 3.66 KB | 0644 |
|
_userpass.pm | File | 1.04 KB | 0644 |
|
data.pm | File | 3.34 KB | 0644 |
|
file.pm | File | 9.53 KB | 0644 |
|
ftp.pm | File | 1.06 KB | 0644 |
|
gopher.pm | File | 2.4 KB | 0644 |
|
http.pm | File | 451 B | 0644 |
|
https.pm | File | 170 B | 0644 |
|
ldap.pm | File | 2.88 KB | 0644 |
|
ldapi.pm | File | 467 B | 0644 |
|
ldaps.pm | File | 170 B | 0644 |
|
mailto.pm | File | 1.27 KB | 0644 |
|
mms.pm | File | 151 B | 0644 |
|
news.pm | File | 1.45 KB | 0644 |
|
nntp.pm | File | 153 B | 0644 |
|
pop.pm | File | 1.2 KB | 0644 |
|
rlogin.pm | File | 155 B | 0644 |
|
rsync.pm | File | 233 B | 0644 |
|
rtsp.pm | File | 151 B | 0644 |
|
rtspu.pm | File | 152 B | 0644 |
|
sftp.pm | File | 124 B | 0644 |
|
sip.pm | File | 1.69 KB | 0644 |
|
sips.pm | File | 169 B | 0644 |
|
snews.pm | File | 198 B | 0644 |
|
ssh.pm | File | 201 B | 0644 |
|
telnet.pm | File | 154 B | 0644 |
|
tn3270.pm | File | 154 B | 0644 |
|
urn.pm | File | 2.15 KB | 0644 |
|