es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Encabezado HTTP cortado por la mitad con `urllib3.exceptions.HeaderParsingError: [MissingHeaderBodySeparatorDefect()], datos no analizados`

Vi una advertencia extraña en los registros:

[WARNING] urllib3.connectionpool: 467: No se pudieron analizar las cabeceras (url = https://REDACTED): [MissingHeaderBodySeparatorDefect()], datos no analizados: ‘trol,Content-Type \r\n\r\n’
Traceback (las llamadas más recientes por último):
Archivo "/usr/local/lib/python3.8/dist-packages/urllib3/connectionpool.py", línea 465, en _make_request
assert_header_parsing(httplib_response.msg)
Archivo "/usr/local/lib/python3.8/dist-packages/urllib3/util/response.py", línea 91, en assert_header_parsing
raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
urllib3.exceptions.HeaderParsingError: [MissingHeaderBodySeparatorDefect()], datos no analizados: ‘trol,Content-Type \r\n\r\n’

Esto proviene de llamar a un estándar requests.post() en un servicio web que controlo completamente (una aplicación de Python detrás de nginx).

Cuando activo debuglevel=1 en http.client.HTTPResponse, veo esto:

reply: ‘HTTP/1.1 200 OK\r\n’
header: Server: nginx/1.18.0 (Ubuntu)
header: Date: Tue, 30 Nov 2021 22:14:04 GMT
header: Content-Type: application/json
header: Transfer-Encoding: chunked
header: Connection: keep-alive
header: Vary: Accept-Encoding
header: Access-Control-Allow-Origin: *
header: Access-Control-Allow-Credentials: true
header: Access-Control-Allow-Methods: GET, POST, OPTIONS
header: Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Con

Tenga en cuenta que la última cabecera termina abruptamente en ,If-Modified-Since,Cache-Con.

Claramente, requests==2.26.0 (a través de urllib3==1.26.7 a través de http.client) corta la última cabecera por alguna razón durante el análisis, y luego posteriormente se queja de que tiene datos “no utilizados” con el resto de trol,Content-Type \r\n\r\n.

En este caso, la advertencia no es crítica porque la cabecera no es realmente necesaria. Pero es alarmante que esto esté sucediendo porque… ¿qué más se está cortando/analizando mal?

El mismo punto final funciona bien desde ej. curl:

“`bash
$ curl -i -XPOST https://REDACTED
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Sat, 04 Dec 2021 20:08:59 GMT
Content-Type: application/json
Content-Length: 53
Connection: keep-alive
Vary: Accept-Encoding
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Con
trol,Content-Type

…respuesta JSON…

¿Alguna idea de qué podría estar mal? Muchas gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que hay un problema con la forma en que la librería requests está analizando las cabeceras al hacer una solicitud POST a un servicio web detrás de un servidor nginx. La advertencia mostrada en los registros indica que la cabecera no se está analizando correctamente y que hay algunos datos restantes que no se pueden procesar.

    Una posible causa de este problema podría estar relacionada con la librería urllib3, que es utilizada por requests para manejar conexiones HTTP. Es posible que urllib3 no esté manejando correctamente casos extremos en el análisis de cabeceras, lo que lleva a errores como este.

    Una sugerencia para investigar más a fondo sería probar diferentes versiones de requests y urllib3, así como experimentar con diferentes configuraciones del servidor nginx para ver si el problema se puede aislar a un componente específico. También puede ser útil consultar la documentación de requests y urllib3 para ver si hay algún problema o limitación conocidos relacionados con el análisis de cabeceras.

    En general, es importante investigar y resolver problemas como este para garantizar que las aplicaciones web funcionen correctamente y de manera segura.

Comments are closed.