Requests: Solicitudes 2.11: check_header_validity falló en el encabezado con valor entero

Creado en 8 ago. 2016  ·  23Comentarios  ·  Fuente: psf/requests

Hola,

Desde las solicitudes 2.11, todas mis llamadas que usan solicitudes para mi aplicación están rotas. Después de la depuración, parece que esta versión no acepta encabezados con valor entero, como lo era antes.

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

Definimos 'Content-Length' en cada solicitud. De todos modos, usar un número entero para un encabezado que semánticamente es un número entero tiene sentido, ¿no?

Comentario más útil

Parece un cambio rotundo para un lanzamiento de puntos, ¿no?

Todos 23 comentarios

Las no cadenas para los valores de encabezado nunca fueron una forma aceptada de usar Solicitudes, lamentablemente, y aunque estaba permitido en versiones anteriores, desde entonces hemos realizado cambios que no lo permiten. Esto se debe principalmente a que los encabezados son asignaciones _realmente_ cadena-cadena, pero también porque el enfoque general de llamar a str en cosas que se pasan a Requests tiene una tendencia a comportarse mal de formas inesperadas que sorprenden a los usuarios.

El TL; DR de esto es: sí, esto se hizo a propósito, y no, no creemos que sea un error.

Vea también: # 865.

Parece un cambio rotundo para un lanzamiento de puntos, ¿no?

Y no describiste esta gran modificación en el ChangeLog :(

Este no es un cambio de API importante: la API está claramente documentada como basada en cadenas en toda la documentación. El hecho de que lo estuvieras usando con números enteros, en lugar de su entrada prevista, es un error en tu código, no en esta base de código o un cambio en la API.

Agregar una nota en el registro de cambios sobre este cambio inquebrantable puede ser una buena idea.

@ clarkbreyman-yammer Para ser claros, este es un caso límite. Puede ver la toma de decisiones más reciente en # 3386 y # 3388, pero el argumento básico es: los encabezados que no son cadenas nunca fueron _ intencionados_ para funcionar, por lo que el hecho de que dejaron de funcionar es aceptable. De hecho, eso no ha funcionado anteriormente en el pasado.

@lmazuel Sin embargo, tiene razón en que esto se perdió en el registro de cambios, y eso es 100% culpa mía: la rotura aquí fue incidental de nuestra verificación más estricta de los valores del encabezado y, como resultado, no lo vi cuando estaba compilando el registro de cambios. Daría la bienvenida a un PR que actualice el registro de cambios si desea hacer uno.

Y para ser claros, los tres estamos de acuerdo en esto. El hecho de que enviar un número entero allí _ alguna vez_ funcionó fue pura suerte. Solía ​​no funcionar en absoluto y decidimos que nunca debería funcionar hace mucho tiempo. Sin embargo, nunca tuvimos nada que _aplicara_ eso.

Dicho esto, agregar eso como una característica compatible es potencialmente una gran idea, y sería un cambio de API bienvenido en mi libro (si la implementación se realizó bien). Sin embargo, es probable que el estado actual de las cosas se mantenga en el futuro.

Se agregó una nota en el registro de cambios.

Gracias @kennethreitz.

Esta bien, gracias por la aclaración. Actualizaré mi código en consecuencia.
@kennethreitz, si pudieras agregar tu nota en PyPI también, sería increíble.

@lmazuel en eso!

@lmazuel hecho ✨🍰✨

@lmazuel ps gracias por cuidar: P

Arreglé mi código, todo lo demás funciona muy bien. ¡Gracias por su tiempo de respuesta ultrarrápido!

en las documentaciones oficiales no se menciona el gran cambio. Es realmente engañoso.

El equipo de Solicitudes no lo considera un cambio importante, se considera una corrección de errores que se ajusta a los límites del comportamiento documentado de la biblioteca.

Hola @COLDMOUNT , puedes encontrar la documentación aquí en el último párrafo de la sección de inicio rápido para encabezados personalizados. También publicamos el cambio en

Es mejor ofrecer un ejemplo de los encabezados en tipo str, o cómo
traducir un encabezado en tipo dict a tipo str, gracias.

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

Hola @COLDMOUNT https://github.com/COLDMOUNT , puedes encontrar el
documentación aquí
http://docs.python-requests.org/en/master/user/quickstart/#custom -headers
en el último párrafo de la sección de inicio rápido para encabezados personalizados. Nosotros
también publicó el cambio en (HISTORY.rst) [ https: // github.
com / kennethreitz / request / blob / master / HISTORY.rst] para 2.11.0 que es
Registro de cambios de las solicitudes.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249638650,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ARIa89wU7tKL8Br2WWU6lJy8HEbNr72Vks5quAE3gaJpZM4JffFG
.

o cómo traducir un encabezado en tipo dict a tipo str

¿Esperar lo? ¿Cómo enviabas encabezados antes?

Al igual que la guía en la página:
http://docs.python-requests.org/en/master/user/quickstart/ - "Si quisieras
le gusta agregar encabezados HTTP a una solicitud, simplemente pase un dict a los encabezados
parámetro. "Pero ahora el tipo dict ya no se acepta, y ¿qué significa el str
tipo parece?

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

o cómo traducir un encabezado en tipo dict a tipo str

¿Esperar lo? ¿Cómo enviabas encabezados antes?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249819028,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ARIa8_ZPJmzxH2lWmpTvSJ3PvHE7jlpvks5quOcrgaJpZM4JffFG
.

@COLDMOUNT dict es _absolutamente_ aceptado, no lo hemos cambiado en absoluto. Lo que hemos cambiado es que las claves y valores de ese dict ahora deben ser cadenas. Anteriormente, era posible que fueran algunos otros tipos por accidente, lo que ahora se ha resuelto. No es necesario cambiar la documentación.

¡Entendido, genial! ¡Gracias! :)

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

@COLDMOUNT https://github.com/COLDMOUNT dict es _absolutamente_ aceptado,
no hemos cambiado eso en absoluto. Lo que hemos cambiado es que las claves y
los valores de ese dict ahora deben ser cadenas. Anteriormente era posible
que sean algunos otros tipos por accidente, lo que ahora se ha resuelto. los
la documentación no necesita cambios.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/kennethreitz/requests/issues/3477#issuecomment -249825918,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ARIa8z0jZ-ovBtvFWl4hTXnkk_kJXobrks5quO6ggaJpZM4JffFG
.

¿Fue útil esta página
0 / 5 - 0 calificaciones