Requests: RequĂȘtes 2.11 : Ă©chec de check_header_validity sur l'en-tĂȘte avec une valeur entiĂšre

CrĂ©Ă© le 8 aoĂ»t 2016  Â·  23Commentaires  Â·  Source: psf/requests

Salut,

Depuis les requĂȘtes 2.11, tous mes appels utilisant des requĂȘtes pour mon application sont interrompus. AprĂšs dĂ©bogage, il semble que cette version n'accepte pas les en-tĂȘtes avec une valeur entiĂšre, comme c'Ă©tait le cas auparavant.

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'>

Nous dĂ©finissons 'Content-Length' dans chaque requĂȘte. Quoi qu'il en soit, utiliser un entier pour un en-tĂȘte qui est sĂ©mantiquement un entier a du sens non?

Commentaire le plus utile

Cela ressemble à un changement radical pour une libération de points, non ?

Tous les 23 commentaires

Les non-chaĂźnes pour les valeurs d'en-tĂȘte n'ont jamais Ă©tĂ© un moyen acceptĂ© d'utiliser les requĂȘtes, malheureusement, et alors que cela Ă©tait autorisĂ© dans les versions prĂ©cĂ©dentes, nous avons depuis apportĂ© des modifications qui l'interdisent. C'est principalement parce que les en-tĂȘtes sont _vraiment_ des mappages de chaĂźnes de caractĂšres, mais aussi parce que l'approche gĂ©nĂ©rale consistant Ă  appeler str sur des Ă©lĂ©ments transmis Ă  Requests a tendance Ă  mal se comporter de maniĂšre inattendue qui surprend les utilisateurs.

Le TL;DR de ceci est : oui, cela a été fait exprÚs, et non, nous ne pensons pas que ce soit un bug.

Voir aussi : #865.

Cela ressemble à un changement radical pour une libération de points, non ?

Et vous n'avez pas décrit cette énorme modification dans le ChangeLog :(

Il ne s'agit pas d'un changement d'API de rupture — l'API est clairement documentĂ©e comme Ă©tant basĂ©e sur des chaĂźnes, tout au long de la documentation. Le fait que vous l'utilisiez avec des entiers, au lieu de son entrĂ©e prĂ©vue, est un bogue dans votre code, pas dans cette base de code ou un changement dans l'API.

L'ajout d'une note dans le journal des modifications Ă  propos de ce changement permanent peut ĂȘtre une bonne idĂ©e.

@clarkbreyman-yammer Pour ĂȘtre clair, c'est un peu un cas limite. Vous pouvez voir la prise de dĂ©cision la plus rĂ©cente dans #3386 et #3388, mais l'argument de base est le suivant : les en-tĂȘtes non-chaĂźne n'ont jamais Ă©tĂ© destinĂ©s Ă  fonctionner, donc le fait qu'ils aient cessĂ© de fonctionner est acceptable. En fait, cela n'a pas fonctionnĂ© auparavant dans le passĂ©.

@lmazuel Vous avez raison de dire que cela a été manqué dans le

Et pour ĂȘtre clair, nous sommes tous les trois d'accord sur ce point. Le fait que l'envoi d'un entier lĂ -bas ait jamais fonctionnĂ© Ă©tait purement chanceux. Cela ne fonctionnait pas du tout et nous avons dĂ©cidĂ© que cela ne devrait jamais fonctionner il y a longtemps. Nous n'avons jamais rien eu qui _enforce_ cela cependant.

Cela étant dit, ajouter qu'en tant que fonctionnalité prise en charge est potentiellement une excellente idée et serait un changement d'API bienvenu dans mon livre (si l'implémentation a été bien faite). Cependant, l'état actuel des choses est susceptible de rester dans un avenir prolongé.

Ajout d'une note dans le changelog.

Merci @kennethreitz.

D'accord, merci pour la précision. Je mettrai à jour mon code en conséquence.
@kennethreitz si vous pouviez Ă©galement ajouter votre note dans PyPI, ce serait incroyable.

@lmazuel dessus !

@lmazuel terminé

@lmazuel ps merci de votre attention :P

J'ai corrigé mon code, tout le reste fonctionne trÚs bien. Merci pour votre temps de réponse ultra rapide !

dans les documentations officielles, il n'y a aucune mention du changement majeur. C'est vraiment trompeur.

Ce n'est pas considéré comme un changement majeur par l'équipe des demandes, c'est considéré comme une correction de bogue qui s'inscrit dans les limites du comportement de la bibliothÚque documentée.

HĂ© @COLDMOUNT , vous pouvez trouver la documentation ici dans le dernier paragraphe de la section de dĂ©marrage rapide pour les en-tĂȘtes personnalisĂ©s. Nous avons Ă©galement publiĂ© le changement dans HISTORY.rst pour 2.11.0 qui est le changelog de Requests.

Il est prĂ©fĂ©rable de proposer un exemple des en-tĂȘtes de type str, ou comment
traduire un en-tĂȘte de type dict en type str, merci.

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

HĂ© @COLDMOUNT https://github.com/COLDMOUNT , vous pouvez trouver le
documentation ici
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
dans le dernier paragraphe de la section de dĂ©marrage rapide pour les en-tĂȘtes personnalisĂ©s. Nous
a également publié le changement dans (HISTORY.rst)[ https://github.
com/kennethreitz/requests/blob/master/HISTORY.rst] pour 2.11.0 qui est
Changelog des requĂȘtes.

-
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, consultez-le sur GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment-249638650 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ARIa89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quAE3gaJpZM4JffFG
.

ou comment traduire un en-tĂȘte de type dict en type str

Attends quoi? Comment envoyiez-vous les en-tĂȘtes avant ?

Tout comme le guide sur la page --
http://docs.python-requests.org/en/master/user/quickstart/ -- "Si vous vouliez
comme ajouter des en-tĂȘtes HTTP Ă  une requĂȘte, passez simplement un dict aux en-tĂȘtes
paramÚtre." Mais maintenant, le type dict n'est plus accepté, et qu'est-ce que le str
type ressembler?

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

ou comment traduire un en-tĂȘte de type dict en type str

Attends quoi? Comment envoyiez-vous les en-tĂȘtes avant ?

-
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, consultez-le sur GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment-249819028 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ARIa8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
.

@COLDMOUNT dict est _absolument_ acceptĂ©, nous n'avons rien changĂ© du tout. Ce que nous avons changĂ©, c'est que les clĂ©s et les valeurs de ce dict doivent maintenant ĂȘtre des chaĂźnes. Auparavant, il Ă©tait possible qu'ils soient quelques autres types par accident, ce qui a maintenant Ă©tĂ© rĂ©solu. La documentation n'a pas besoin d'ĂȘtre modifiĂ©e.

Compris, cool ! Merci! :)

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

@COLDMOUNT https://github.com/COLDMOUNT dict est _absolument_ accepté,
nous n'avons rien changé du tout. Ce que nous avons changé, c'est que les clés et
les valeurs de ce dict doivent maintenant ĂȘtre des chaĂźnes. Auparavant, il Ă©tait possible pour
eux pour ĂȘtre quelques autres types par accident, qui a maintenant Ă©tĂ© rĂ©solu. Les
la documentation n'a pas besoin d'ĂȘtre modifiĂ©e.

-
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, consultez-le sur GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/ARIa8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
.

Cette page vous a été utile?
0 / 5 - 0 notes