Requests: μš”μ²­ 2.11: μ •μˆ˜ 값이 μžˆλŠ” ν—€λ”μ—μ„œ check_header_validity μ‹€νŒ¨

에 λ§Œλ“  2016λ…„ 08μ›” 08일  Β·  23μ½”λ©˜νŠΈ  Β·  좜처: psf/requests

μ•ˆλ…•ν•˜μ„Έμš”,

μš”μ²­ 2.11 μ΄ν›„λ‘œ λ‚΄ 앱에 λŒ€ν•œ μš”μ²­μ„ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  호좜이 μ€‘λ‹¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 디버깅 ν›„ 이 버전은 이전과 같이 μ •μˆ˜ 값이 μžˆλŠ” 헀더λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

2.10:

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
Out[2]: <Response [200]>

2.11

In [1]: import requests

In [2]: requests.get('http://bing.com', headers={'Content-Length': 42})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    751     try:
--> 752         if not pat.match(value):
    753             raise InvalidHeader("Invalid return character or leading space in header: %s" % name)

TypeError: expected string or bytes-like object

During handling of the above exception, another exception occurred:

InvalidHeader                             Traceback (most recent call last)
<ipython-input-2-ae7ec2933e34> in <module>()
----> 1 requests.get('http://bing.com', headers={'Content-Length': 42})

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in get(url, params, **kwargs)
     68
     69     kwargs.setdefault('allow_redirects', True)
---> 70     return request('get', url, params=params, **kwargs)
     71
     72

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\api.py in request(method, url, **kwargs)
     54     # cases, and look like a memory leak in others.
     55     with sessions.Session() as session:
---> 56         return session.request(method=method, url=url, **kwargs)
     57
     58

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in request(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)
    455             hooks = hooks,
    456         )
--> 457         prep = self.prepare_request(req)
    458
    459         proxies = proxies or {}

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\sessions.py in prepare_request(self, request)
    388             auth=merge_setting(auth, self.auth),
    389             cookies=merged_cookies,
--> 390             hooks=merge_hooks(request.hooks, self.hooks),
    391         )
    392         return p

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare(self, method, url, headers, files, data, params, auth, cookies, hooks, json)
    293         self.prepare_method(method)
    294         self.prepare_url(url, params)
--> 295         self.prepare_headers(headers)
    296         self.prepare_cookies(cookies)
    297         self.prepare_body(data, files, json)

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\models.py in prepare_headers(self, headers)
    407             for header in headers.items():
    408                 # Raise exception on invalid header value.
--> 409                 check_header_validity(header)
    410                 name, value = header
    411                 self.headers[to_native_string(name)] = value

D:\VSProjects\azure-sdk-for-python\env3.5\Lib\site-packages\requests\utils.py in check_header_validity(header)
    754     except TypeError:
    755         raise InvalidHeader("Header value %s must be of type str or bytes, "
--> 756                             "not %s" % (value, type(value)))
    757
    758

InvalidHeader: Header value 42 must be of type str or bytes, not <class 'int'>

각 μš”μ²­μ—μ„œ 'Content-Length'λ₯Ό μ •μ˜ν•©λ‹ˆλ‹€. μ–΄μ¨Œλ“ , μ˜λ―Έμƒ μ •μˆ˜μΈ 헀더에 μ •μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 말이 λ˜μ§€ μ•ŠμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

λ„νŠΈ 릴리슀의 μ£Όμš” λ³€κ²½ 사항인 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ£ ?

λͺ¨λ“  23 λŒ“κΈ€

헀더 값에 λŒ€ν•œ λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 것은 μŠ¬ν”„κ²Œλ„ μš”μ²­μ„ μ‚¬μš©ν•˜λŠ” 데 ν—ˆμš©λœ 방법이 μ•„λ‹ˆλ©° 이전 λ²„μ „μ—μ„œλŠ” ν—ˆμš©λ˜μ—ˆμ§€λ§Œ κ·Έ μ΄ν›„λ‘œ 이λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 변경을 ν–ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 주둜 헀더가 _μ‹€μ œλ‘œ_ λ¬Έμžμ—΄-λ¬Έμžμ—΄ 맀핑이기 λ•Œλ¬Έμ΄κΈ°λ„ ν•˜μ§€λ§Œ Requests에 μ „λ‹¬λœ ν•­λͺ©μ— λŒ€ν•΄ str λ₯Ό ν˜ΈμΆœν•˜λŠ” 일반적인 μ ‘κ·Ό 방식은 μ‚¬μš©μžλ₯Ό λ†€λΌκ²Œ ν•˜λŠ” 예기치 μ•Šμ€ λ°©μ‹μœΌλ‘œ μ˜€μž‘λ™ν•˜λŠ” κ²½ν–₯이 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

TL;DR은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€. 예, 이것은 μ˜λ„μ μœΌλ‘œ μˆ˜ν–‰λœ 것이며 μ•„λ‹ˆμš”, 버그라고 μƒκ°ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ°Έμ‘°: #865.

λ„νŠΈ 릴리슀의 μ£Όμš” λ³€κ²½ 사항인 것 κ°™μŠ΅λ‹ˆλ‹€. κ·Έλ ‡μ£ ?

그리고 당신은 ChangeLogμ—μ„œ 이 κ±°λŒ€ν•œ μˆ˜μ •μ„ μ„€λͺ…ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€ :(

이것은 μ£Όμš” API λ³€κ²½ 사항이 μ•„λ‹™λ‹ˆλ‹€. APIλŠ” λ¬Έμ„œ 전체에 걸쳐 λ¬Έμžμ—΄ 기반으둜 λͺ…ν™•ν•˜κ²Œ λ¬Έμ„œν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ˜λ„ν•œ μž…λ ₯ λŒ€μ‹  μ •μˆ˜μ™€ ν•¨κ»˜ μ‚¬μš©ν–ˆλ‹€λŠ” 사싀은 이 μ½”λ“œλ² μ΄μŠ€λ‚˜ API 변경이 μ•„λ‹ˆλΌ μ½”λ“œμ˜ λ²„κ·Έμž…λ‹ˆλ‹€.

이 μ€‘μš”ν•˜μ§€ μ•Šμ€ λ³€κ²½ 사항에 λŒ€ν•œ λ©”λͺ¨λ₯Ό λ³€κ²½ λ‘œκ·Έμ— μΆ”κ°€ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

@clarkbreyman-yammer λΆ„λͺ…νžˆ λ§ν•˜μžλ©΄, 이것은 μ•½κ°„μ˜ 경계선 μΌ€μ΄μŠ€μž…λ‹ˆλ‹€. #3386κ³Ό #3388μ—μ„œ κ°€μž₯ μ΅œκ·Όμ— λ‚΄λ¦° μ˜μ‚¬κ²°μ •μ„ λ³Ό 수 μžˆμ§€λ§Œ κΈ°λ³Έ μ£Όμž₯은 λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 헀더가 μž‘λ™ν•˜λ„λ‘ _μ˜λ„λ˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ μž‘λ™μ΄ μ€‘μ§€λ˜μ—ˆλ‹€λŠ” 사싀을 받아듀일 수 μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 사싀, μ΄μ „μ—λŠ” 과거에 μž‘λ™ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€.

@lmazuel ν•˜μ§€λ§Œ 이것이 λ³€κ²½ λ‘œκ·Έμ—μ„œ λˆ„λ½λœ 것이 λ§žμŠ΅λ‹ˆλ‹€. 그리고 그것은 100% 제 잘λͺ»μž…λ‹ˆλ‹€. μ—¬κΈ°μ„œ νŒŒμ†μ€ 헀더 값에 λŒ€ν•œ 더 μ—„κ²©ν•œ κ²€μ¦μœΌλ‘œ 인해 λΆ€μˆ˜μ μœΌλ‘œ λ°œμƒν–ˆμœΌλ©° 결과적으둜 μ»΄νŒŒμΌν•  λ•Œ 보지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. λ³€κ²½ 둜그. λ³€κ²½ 둜그λ₯Ό λ§Œλ“€κ³  μ‹Άλ‹€λ©΄ λ³€κ²½ 둜그λ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” PR을 ν™˜μ˜ν•©λ‹ˆλ‹€.

그리고 λΆ„λͺ…νžˆ ν•˜μžλ©΄, 우리 μ„Έ μ‚¬λžŒ λͺ¨λ‘ 이 점에 λ™μ˜ν•©λ‹ˆλ‹€. 거기에 μ •μˆ˜λ₯Ό λ³΄λ‚΄λŠ” 것이 _ever_ μž‘λ™ν–ˆλ‹€λŠ” 사싀은 μˆœμ „νžˆ μš΄μ΄μ—ˆμŠ΅λ‹ˆλ‹€. μ΄μ „μ—λŠ” μ „ν˜€ μž‘λ™ν•˜μ§€ μ•Šμ•˜μœΌλ©° 였래 전에 μž‘λ™ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€κ³  κ²°μ •ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μš°λ¦¬λŠ” 그것을 _μ‹œν–‰_ν•œ 적이 μ—†μŠ΅λ‹ˆλ‹€.

즉, μ§€μ›λ˜λŠ” κΈ°λŠ₯으둜 μΆ”κ°€ν•˜λŠ” 것은 잠재적으둜 쒋은 아이디어이며 λ‚΄ μ±…μ—μ„œ ν™˜μ˜ν• λ§Œν•œ API 변경이 될 κ²ƒμž…λ‹ˆλ‹€(κ΅¬ν˜„μ΄ 잘 μ΄λ£¨μ–΄μ‘Œλ‹€λ©΄). κ·ΈλŸ¬λ‚˜ ν˜„μž¬μ˜ 상황은 μ•žμœΌλ‘œλ„ 계속될 κ°€λŠ₯성이 λ†’μŠ΅λ‹ˆλ‹€.

λ³€κ²½ λ‘œκ·Έμ— λ©”λͺ¨λ₯Ό μΆ”κ°€ν–ˆμŠ΅λ‹ˆλ‹€.

@kennethreitz κ°μ‚¬ν•©λ‹ˆλ‹€.

λ„€, μ„€λͺ… κ°μ‚¬ν•©λ‹ˆλ‹€. 그에 따라 μ½”λ“œλ₯Ό μ—…λ°μ΄νŠΈν•˜κ² μŠ΅λ‹ˆλ‹€.
@kennethreitz PyPI에도 λ©”λͺ¨λ₯Ό μΆ”κ°€ν•  수 μžˆλ‹€λ©΄ ν›Œλ₯­ν•  κ²ƒμž…λ‹ˆλ‹€.

@lmazuel 에!

@lmazuel μ™„λ£Œ ✨🍰✨

@lmazuel ps

λ‚΄ μ½”λ“œλ₯Ό μˆ˜μ •ν–ˆκ³  λ‹€λ₯Έ λͺ¨λ“  것은 잘 μž‘λ™ν•©λ‹ˆλ‹€. 맀우 λΉ λ₯Έ 응닡 μ‹œκ°„μ— κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

곡식 λ¬Έμ„œμ—λŠ” μ£Όμš” λ³€κ²½ 사항에 λŒ€ν•œ 언급이 μ—†μŠ΅λ‹ˆλ‹€. 정말 μ˜€ν•΄μ˜ μ†Œμ§€κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” μš”μ²­ νŒ€μ—μ„œ μ£Όμš” λ³€κ²½ μ‚¬ν•­μœΌλ‘œ κ°„μ£Όλ˜μ§€ μ•ŠμœΌλ©° λ¬Έμ„œν™”λœ 라이브러리 λ™μž‘μ˜ 경계에 λ§žλŠ” 버그 μˆ˜μ •μœΌλ‘œ κ°„μ£Όλ©λ‹ˆλ‹€.

이봐 @COLDMOUNT, 당신은 λ¬Έμ„œλ₯Ό 찾을 수 μžˆμŠ΅λ‹ˆλ‹€ 여기에 μ‚¬μš©μž μ •μ˜ 헀더에 λŒ€ν•œ λΉ λ₯Έ μ‹œμž‘ μ„Ήμ…˜μ—μ„œ λ§ˆμ§€λ§‰ λ‹¨λ½μ—μ„œ. λ˜ν•œ Requests의 λ³€κ²½ 둜그인 2.11.0에 λŒ€ν•œ HISTORY.rst의 λ³€κ²½ 사항을 κ²Œμ‹œν–ˆμŠ΅λ‹ˆλ‹€.

str μœ ν˜•μ˜ ν—€λ”μ˜ 예 λ˜λŠ” 방법을 μ œκ³΅ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
dict μœ ν˜•μ˜ 헀더λ₯Ό str μœ ν˜•μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€.

2016-09-27 1:30 GMT+08:00 Nate Prewitt [email protected] :

μ•ˆλ…•ν•˜μ„Έμš” @COLDMOUNT https://github.com/COLDMOUNT , 당신은 찾을 수 μžˆμŠ΅λ‹ˆλ‹€
여기에 λ¬Έμ„œ
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
μ‚¬μš©μž μ •μ˜ 헀더에 λŒ€ν•œ λΉ λ₯Έ μ‹œμž‘ μ„Ήμ…˜μ˜ λ§ˆμ§€λ§‰ 단락에 μžˆμŠ΅λ‹ˆλ‹€. 우리
λ˜ν•œ λ³€κ²½ 사항을 (HISTORY.rst)[ https://github.
com/kennethreitz/requests/blob/master/HISTORY.rst] 2.11.0용
μš”μ²­μ˜ λ³€κ²½ 둜그.

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249638650,
λ˜λŠ” μŠ€λ ˆλ“œ μŒμ†Œκ±°
https://github.com/notifications/unsubscribe-auth/ARIA89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quaAE3gaJpZM4JffFG
.

λ˜λŠ” dict μœ ν˜•μ˜ 헀더λ₯Ό str μœ ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법

무엇을 κΈ°λ‹€λ¦½λ‹ˆλ‹€? 이전에 헀더λ₯Ό μ–΄λ–»κ²Œ λ³΄λƒˆμŠ΅λ‹ˆκΉŒ?

νŽ˜μ΄μ§€μ˜ κ°€μ΄λ“œμ™€ λ§ˆμ°¬κ°€μ§€λ‘œ --
http://docs.python-requests.org/en/master/user/quickstart/ -- "λ§Œμ•½
μš”μ²­μ— HTTP 헀더λ₯Ό μΆ”κ°€ν•˜λ €λ©΄ 헀더에 dictλ₯Ό μ „λ‹¬ν•˜κΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.
λ§€κ°œλ³€μˆ˜." ν•˜μ§€λ§Œ 이제 dict μœ ν˜•μ€ 더 이상 ν—ˆμš©λ˜μ§€ μ•ŠμœΌλ©° str은
μœ ν˜•μ€ μ–΄λ–»κ²Œ μƒκ²ΌμŠ΅λ‹ˆκΉŒ?

2016-09-27 17:51 GMT+08:00 Cory Benfield [email protected] :

λ˜λŠ” dict μœ ν˜•μ˜ 헀더λ₯Ό str μœ ν˜•μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 방법

무엇을 κΈ°λ‹€λ¦½λ‹ˆλ‹€? 이전에 헀더λ₯Ό μ–΄λ–»κ²Œ λ³΄λƒˆμŠ΅λ‹ˆκΉŒ?

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249819028,
λ˜λŠ” μŠ€λ ˆλ“œ μŒμ†Œκ±°
https://github.com/notifications/unsubscribe-auth/ARIA8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
.

@COLDMOUNT dict 은(λŠ”) _μ ˆλŒ€μ μœΌλ‘œ_ μŠΉμΈλ˜μ—ˆμœΌλ©°, 이λ₯Ό μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ λ³€κ²½ν•œ 것은 ν•΄λ‹Ή dict의 킀와 값이 이제 λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄μ „μ—λŠ” μ‹€μˆ˜λ‘œ λͺ‡ 가지 λ‹€λ₯Έ μœ ν˜•μ΄ μžˆμ„ 수 μžˆμ—ˆμ§€λ§Œ μ§€κΈˆμ€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λ¬Έμ„œλ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

μ•Œκ² μ–΄, λ©‹μ Έ! 감사 ν•΄μš”! :)

2016-09-27 18:23 GMT+08:00 Cory Benfield [email protected] :

@COLDMOUNT https://github.com/COLDMOUNT 사전은 _μ ˆλŒ€μ μœΌλ‘œ_ ν—ˆμš©λ©λ‹ˆλ‹€.
μš°λ¦¬λŠ” 그것을 μ „ν˜€ λ³€κ²½ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μš°λ¦¬κ°€ λ³€κ²½ν•œ 것은 킀와
ν•΄λ‹Ή dict의 값은 이제 λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ΄μ „μ—λŠ” κ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.
μ‹€μˆ˜λ‘œ λͺ‡ 가지 λ‹€λ₯Έ μœ ν˜•μœΌλ‘œ λ°”λ€Œμ—ˆμ§€λ§Œ μ§€κΈˆμ€ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€. NS
λ¬Έμ„œλ₯Ό λ³€κ²½ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

β€”
당신이 μ–ΈκΈ‰λ˜μ—ˆκΈ° λ•Œλ¬Έμ— 이것을 λ°›λŠ” κ²ƒμž…λ‹ˆλ‹€.
이 이메일에 직접 λ‹΅μž₯ν•˜κ³  GitHubμ—μ„œ ν™•μΈν•˜μ„Έμš”.
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918,
λ˜λŠ” μŠ€λ ˆλ“œ μŒμ†Œκ±°
https://github.com/notifications/unsubscribe-auth/ARIA8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰