Passing unicode to Email validator
Leandro Lucarella <[email protected]> Tue, 14 Oct 2008 22:48:58 -0300
| Newsgroups | gmane.comp.python.formencode |
|---|---|
| Message-ID | <[email protected]> |
Well, I found the previos "bug" because of this. When you pass an unicode string to an Email validator using resolve_domain=True, strange things happen (mainly you get "random" UnicodeDecodeErrors). For example: luca@turing:~/sercom:master$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from formencode import validators >>> v = validators.Email(resolve_domain=True) >>> v.to_python(u'[email protected]') u'[email protected]' >>> v.to_python(u'[email protected]') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/site-packages/formencode/api.py", line 371, in to_python vp(value, state) File "/usr/lib/python2.5/site-packages/formencode/validators.py", line 1233, in validate_python a=DNS.DnsRequest(domain).req().answers File "/var/lib/python-support/python2.5/DNS/Base.py", line 202, in req m.addQuestion(qname, qtype, Class.IN) File "/var/lib/python-support/python2.5/DNS/Lib.py", line 462, in addQuestion self.addname(qname) File "/var/lib/python-support/python2.5/DNS/Lib.py", line 129, in addname self.buf = self.buf + buf UnicodeDecodeError: 'ascii' codec can't decode byte 0x9c in position 0: ordinal not in range(128) >>> luca@turing:~/sercom:master$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from formencode import validators >>> v = validators.Email(resolve_domain=True) >>> v.to_python(u'[email protected]') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.5/site-packages/formencode/api.py", line 371, in to_python vp(value, state) File "/usr/lib/python2.5/site-packages/formencode/validators.py", line 1233, in validate_python a=DNS.DnsRequest(domain).req().answers File "/var/lib/python-support/python2.5/DNS/Base.py", line 202, in req m.addQuestion(qname, qtype, Class.IN) File "/var/lib/python-support/python2.5/DNS/Lib.py", line 462, in addQuestion self.addname(qname) File "/var/lib/python-support/python2.5/DNS/Lib.py", line 129, in addname self.buf = self.buf + buf UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 1: ordinal not in range(128) >>> luca@turing:~/sercom:master$ python Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> from formencode import validators >>> v = validators.Email(resolve_domain=True) >>> v.to_python(u'[email protected]') u'[email protected]' >>> Please, note the randomness of offending decoded byte (and that sometimes it works). I tried to take a look to PyDNS sources and I can't find how this "randomness" can happen, but didn't succeded (there are some binary manipulations there so it expects its input to be ASCII, because some internal buffer is "promoted" to unicode when unicode strings are used and that makes all blows). Should Email validator first check if the domain is valid ASCII? (at least if IDN[1] are not supported by pyDNS). Should I send a patch? Or you think this is a pyDNS bug? [1] http://en.wikipedia.org/wiki/Internationalized_domain_name -- Leandro Lucarella (luca) | Blog colectivo: http://www.mazziblog.com.ar/blog/ ---------------------------------------------------------------------------- GPG Key: 5F5A8D05 (F8CD F9A7 BF00 5431 4145 104C 949E BFB6 5F5A 8D05) ---------------------------------------------------------------------------- The world's best known word is "okay" The second most well-known word is "Coca-Cola" ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/