Open
Description
On Windows, when the CPython repository is cloned to a slightly longer path, for example, C:\Users\xxxxx\Source\cpython
— this test case will fail:
ERROR: test_file (test.test_urllib2.HandlerTests.test_file)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\xxxxx\Source\cpython\Lib\encodings\idna.py", line 219, in encode
result.extend(ToASCII(label))
~~~~~~~^^^^^^^
File "C:\Users\xxxxx\Source\cpython\Lib\encodings\idna.py", line 115, in ToASCII
raise UnicodeEncodeError("idna", label, 0, len(label), "label too long")
UnicodeEncodeError: 'idna' codec can't encode characters in position 0-64: label too long
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\xxxxx\Source\cpython\Lib\test\test_urllib2.py", line 872, in test_file
self.assertRaises(urllib.error.URLError,
~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
h.file_open, Request(url))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxxxx\Source\cpython\Lib\unittest\case.py", line 813, in assertRaises
return context.handle('assertRaises', args, kwargs)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\xxxxx\Source\cpython\Lib\unittest\case.py", line 247, in handle
callable_obj(*args, **kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "C:\Users\xxxxx\Source\cpython\Lib\urllib\request.py", line 1469, in open_local_file
localfile = url2pathname(req.full_url, require_scheme=True)
File "C:\Users\xxxxx\Source\cpython\Lib\urllib\request.py", line 1658, in url2pathname
if not _is_local_authority(authority):
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
File "C:\Users\xxxxx\Source\cpython\Lib\urllib\request.py", line 1498, in _is_local_authority
address = socket.gethostbyname(authority)
File "C:\Users\xxxxx\Source\cpython\Lib\encodings\idna.py", line 222, in encode
raise UnicodeEncodeError(
...<5 lines>...
)
UnicodeEncodeError: 'idna' codec can't encode characters in position 8-72: label too long
encoding with 'idna' codec failed
See:
cpython/Lib/test/test_urllib2.py
Lines 857 to 860 in c336f1c
These two URLs will become:
file://127.0.0.1:80C:\Users\xxxxx\Source\cpython\build\test_python_worker_17208æ/@test_17208_tmpæ
file://somerandomhost.ontheinternet.comC:\Users\xxxxx\Source\cpython\build\test_python_worker_4676æ/@test_4676_tmpæ
Here, 127.0.0.1:80C:\Users\xxxxx\Source\cpython\build\test_python_worker_17208æ
is treated as the domain and passed to socket.gethostbyname
. However, the part 1:80C:\Users\xxxxx\Source\cpython\build\test_python_worker_17208æ
is too long to be a valid domain label. As a result, the idna
codec raises an exception, indicating the label is too long.
A patch is on the way.