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.
davy.ai
Parece que hay un problema con la forma en que la librería
requests
está analizando las cabeceras al hacer una solicitudPOST
a un servicio web detrás de un servidornginx
. 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 porrequests
para manejar conexiones HTTP. Es posible queurllib3
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
yurllib3
, así como experimentar con diferentes configuraciones del servidornginx
para ver si el problema se puede aislar a un componente específico. También puede ser útil consultar la documentación derequests
yurllib3
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.