[Python] 作 idna 編碼時出現 label empty or too long 錯誤

[Python] 作 idna 編碼時出現 label empty or too long 錯誤

今天我們的 python 程式在將一個 domain name 編碼 (encode) 成 idna 時,

出現了奇怪的 label empty or too long 錯誤:

>>> ("www." + "a"*64 + ".com").encode("idna")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/idna.py", line 164, in encode
result.append(ToASCII(label))
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/idna.py", line 73, in ToASCII
raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long

 

查了一下,原來是 domain name 裡面每個用 “.” 隔開的叫 label,

而每個 label 必須符合 DNS name 最長 63 字元的限制,

因此像 www 和 com 沒有問題,但中間的 64 個 a 就爆了~

 

對照一下 python 的 idna.py 原始碼,也的確是檢查 label 的長度如果不是 1~63 的話,

就會吐出 label empty or too long 的錯誤:

if 0 < len(label) < 64:
return label
raise UnicodeError("label empty or too long")

 

參考資料:

stackoverflow: label empty or too long – python urllib2

wikipedia: Internationalized domain name

 

(本頁面已被瀏覽過 2,160 次)

2 thoughts on “[Python] 作 idna 編碼時出現 label empty or too long 錯誤

    1. 如果這個 domain name 是外部給予的,
      可能無法避免出現錯誤,
      畢竟沒辦法限制外部只給予正確的格式。

      我們的做法就是 catch exception 再 log 記錄起來~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料