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.76'; 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 | 794 B | 0644 |
|
QueryParam.pm | File | 4.75 KB | 0644 |
|
Split.pm | File | 2.3 KB | 0644 |
|
URL.pm | File | 5.36 KB | 0644 |
|
WithBase.pm | File | 3.77 KB | 0644 |
|
_foreign.pm | File | 107 B | 0644 |
|
_generic.pm | File | 5.69 KB | 0644 |
|
_idna.pm | File | 2.03 KB | 0644 |
|
_ldap.pm | File | 3.17 KB | 0644 |
|
_login.pm | File | 231 B | 0644 |
|
_punycode.pm | File | 5.49 KB | 0644 |
|
_query.pm | File | 2.47 KB | 0644 |
|
_segment.pm | File | 416 B | 0644 |
|
_server.pm | File | 3.64 KB | 0644 |
|
_userpass.pm | File | 1.01 KB | 0644 |
|
data.pm | File | 3.31 KB | 0644 |
|
file.pm | File | 9.53 KB | 0644 |
|
ftp.pm | File | 1.03 KB | 0644 |
|
gopher.pm | File | 2.37 KB | 0644 |
|
http.pm | File | 425 B | 0644 |
|
https.pm | File | 144 B | 0644 |
|
ldap.pm | File | 2.86 KB | 0644 |
|
ldapi.pm | File | 441 B | 0644 |
|
ldaps.pm | File | 144 B | 0644 |
|
mailto.pm | File | 1.25 KB | 0644 |
|
mms.pm | File | 125 B | 0644 |
|
news.pm | File | 1.42 KB | 0644 |
|
nntp.pm | File | 127 B | 0644 |
|
pop.pm | File | 1.18 KB | 0644 |
|
rlogin.pm | File | 129 B | 0644 |
|
rsync.pm | File | 207 B | 0644 |
|
rtsp.pm | File | 125 B | 0644 |
|
rtspu.pm | File | 126 B | 0644 |
|
sftp.pm | File | 98 B | 0644 |
|
sip.pm | File | 1.67 KB | 0644 |
|
sips.pm | File | 143 B | 0644 |
|
snews.pm | File | 172 B | 0644 |
|
ssh.pm | File | 175 B | 0644 |
|
telnet.pm | File | 128 B | 0644 |
|
tn3270.pm | File | 128 B | 0644 |
|
urn.pm | File | 2.12 KB | 0644 |
|