Requests: ๋น„์ •์ƒ์ ์ธ URL ๋ฌธ์ž์—ด ์ถฉ๋Œ์€ py3์ž…๋‹ˆ๋‹ค.

์— ๋งŒ๋“  2017๋…„ 06์›” 19์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: psf/requests

์ตœ๊ทผ python3 conda ํ™˜๊ฒฝ์—์„œ pip install zipfile๋กœ ํ˜„์žฌ ๋งˆ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

base_url = ' http://...........127.0.0.1 :8082'
request.get(base_url)
์ถฉ๋Œ

UniodeError๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค.
python3.6/encodings/idna.py",
165ํ–‰, ์ธ์ฝ”๋”ฉ
raise UnicodeError("๋ ˆ์ด๋ธ”์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค.")
UnicodeError: ๋ ˆ์ด๋ธ”์ด ๋น„์–ด ์žˆ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ๊น๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ์ด๊ฒƒ์„ ์žก์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

ํŒŒ์ด์ฌ ์ธก ๋ฌธ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด
https://bugs.python.org/issue32958

๋ชจ๋“  4 ๋Œ“๊ธ€

ํ›„์†์„ ์œ„ํ•ด ์ „์ฒด ์—ญ์ถ”์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

>>> requests.get(base_url)
Traceback (most recent call last):
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/encodings/idna.py", line 165, in encode
    raise UnicodeError("label empty or too long")
UnicodeError: label empty or too long

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 72, in get
    return request('get', url, params=params, **kwargs)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 493, in request
    prep.url, proxies, stream, verify, cert
  File "/Users/cory/Documents/Python/requests_org/requests/requests/sessions.py", line 666, in merge_environment_settings
    env_proxies = get_environ_proxies(url, no_proxy=no_proxy)
  File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 692, in get_environ_proxies
    if should_bypass_proxies(url, no_proxy=no_proxy):
  File "/Users/cory/Documents/Python/requests_org/requests/requests/utils.py", line 676, in should_bypass_proxies
    bypass = proxy_bypass(netloc)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2616, in proxy_bypass
    return proxy_bypass_macosx_sysconf(host)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2593, in proxy_bypass_macosx_sysconf
    return _proxy_bypass_macosx_sysconf(host, proxy_settings)
  File "/Users/cory/.pyenv/versions/3.6.0/lib/python3.6/urllib/request.py", line 2566, in _proxy_bypass_macosx_sysconf
    hostIP = socket.gethostbyname(hostonly)
UnicodeError: encoding with 'idna' codec failed (UnicodeError: label empty or too long)

์ด์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ๋งŽ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ค๋ฅ˜๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ๋‚˜์˜ต๋‹ˆ๋‹ค(ํŠนํžˆ, urllib proxy_bypass ํ•จ์ˆ˜์—์„œ). socket.gethostbyname ๋ฅผ ํ˜ธ์ถœํ•  ํ•„์š”์„ฑ์„ ๋Š๋ผ๋Š” Python 3์—๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํžˆ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ์œ ๋‹ˆ์ฝ”๋“œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์ž๋™์œผ๋กœ IDNA ์ธ์ฝ”๋”ฉํ•˜๊ณ  ํ•ด๋‹น IDNA ์ธ์ฝ”๋”๊ฐ€ ์ด๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ๋ฐฉ๋ฒ•์€ URL์„ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์ •๊ทœํ™”ํ•˜๋Š” ํ›จ์”ฌ ๋” ์Šค๋งˆํŠธํ•œ URL ์ฒ˜๋ฆฌ ๊ตฌํ˜„์œผ๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ข‹์€ ํ›„๋ณด๋Š” ํ•˜์ดํผ๋งํฌ์ด์ง€๋งŒ ํ•˜์ดํผ๋งํฌ ๋„ ๋น„์Šทํ•œ ์ด์œ ๋กœ ์ด์— ๋Œ€ํ•ด ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค(IDNA ์ธ์ฝ”๋”ฉ์„ ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•จ).

์ด๊ฒƒ์€ URL ํ˜ธ์ŠคํŠธ ๋…ธ๋ฉ€๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•˜์ดํผ๋งํฌ๋ฅผ ํ™•์žฅํ•œ ๋‹ค์Œ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ WHATWG URL ์‚ฌ์–‘๋„ ์ด๋Ÿฌํ•œ ํ˜•์‹์˜ URL์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Chrome์ด ์ •์ƒํ™”ํ•˜๋ฏ€๋กœ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(Safari๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ).

์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ž‘์—…์˜ ์–‘์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฅผ ์šฉ์ธํ•  ์ด์œ ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. URL์€ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ๊ฒƒ๊ณผ๋Š” ๋งค์šฐ ๊ฑฐ๋ฆฌ๊ฐ€ ๋ฉ€๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๊ฒฐ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ฏ€๋กœ ์ด URL์„ ๋‹ซ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

ํ˜•์‹์˜ URL์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

https://key:[email protected]/path/file.json

๊ธธ์ด๋Š” 132์ž์ž…๋‹ˆ๋‹ค.

@johnpaulhayes ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์š”์ฒญ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์ง€๋งŒ, ๋˜ํ•œ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ญ์ œํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ทธ๊ฒƒ์„ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” url์˜ ์ „์ฒด ๊ธธ์ด๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹จ์ง€ ๊ทธ๊ฒƒ์˜ ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์˜ ์ฒซ ๋ฒˆ์งธ ๋ถ€๋ถ„์ด 64์ž๋ณด๋‹ค ๊ธธ๋ฉด idna ์ธ์ฝ”๋”๊ฐ€ URL์—์„œ ์ค‘๋‹จ๋˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด์œ ๊ฐ€ ๋ฌด์—‡์ด๋“  ๊ฑฐ๊ธฐ์—๋Š” ํ‚ค์™€ ๋น„๋ฐ€๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์ด ์ˆ˜์ •๋  ๋•Œ๊นŒ์ง€ python3์„ ํ”ผํ•˜๊ฑฐ๋‚˜ ๊ธด " key:secret@example " ๋ฌธ์ž์—ด์„ ํ”ผํ•˜์‹ญ์‹œ์˜ค(๊ธด API ํ‚ค๋ฅผ ํ”ผํ•จ์œผ๋กœ์จ). ์–ด์ œ python tracker์— ๋ฒ„๊ทธ๋ฅผ ์ œ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ ์ธก ๋ฌธ์ œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด
https://bugs.python.org/issue32958

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰