Incorrectly strips trailing dot from absolute hostnames, causing TooManyRedirects
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Aptitud para principiantes
- 38/100
- Tipo de issue
- Error
- Claridad
- Bastante claro
- Estado de actividad
- Estancado
- Stack tecnológico
- python
- Área
- api, networking
Línea de trabajo
Comienza con requests/api.py y requests/sessions.py, especialmente con las rutas de request y redirect mostradas en el traceback, y sigue después cómo urllib3 construye el SNI de TLS y el encabezado Host. Reproduce el problema con requests.get("https://pyropus.ca./") y verifica que el encabezado Host conserve el punto final mientras la solicitud se completa sin un bucle de redirección.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
requests appears to be incorrectly stripping the trailing dot on absolute hostnames (i.e. explicitly marked as in the root DNS namespace) in URLs when constructing the Host: request header, like pyropus.ca.. This causes redirect loops when the site chooses the absolute hostname as canonical and redirects requests without the trailing dot.
The example site redirects requests with a host header of Host: pyropus.ca to the same URL with the host name changed to the canonical absolute version:
HTTP/1.1 301 Moved Permanently
[...]
Location: https://pyropus.ca./
requests then strips the dot and resends the request, resulting in a redirect loop.
The trailing dot needs to be stripped from the SNI header for https requests (required by TLS/etc spec) but it should not be stripped from the Host: header value.
When fixing the SNI trailing dot issue, curl had this bug because they changed it to also affect the Host: header value, but they've fixed it by reverting that part of the change:
https://github.com/curl/curl/issues/8290
Many other common user agents that I've tested handle this properly:
- all GUI browers, to my knowledge, preserve the absolute domain name in the Host: header - I've tested Firefox, Chromium, Vivaldi, Konqueror, and Safari
- wget also preserves the absolute domain name on redirect URLs
- curl is now fixed and handles it
A few less common ones have the same buggy behaviour, or did -- I haven't re-checked:
- lynx, links, and elinks handle it like curl, erroring out on a redirect loop
Expected Result
Successful 200 response with content.
Actual Result
Traceback (most recent call last):
File "<string>", line 1, in <module>
File ".../test/.venv/lib/python3.9/site-packages/requests/api.py", line 75, in get
return request('get', url, params=params, **kwargs)
File ".../test/.venv/lib/python3.9/site-packages/requests/api.py", line 61, in request
return session.request(method=method, url=url, **kwargs)
File ".../test/.venv/lib/python3.9/site-packages/requests/sessions.py", line 529, in request
resp = self.send(prep, **send_kwargs)
File ".../test/.venv/lib/python3.9/site-packages/requests/sessions.py", line 667, in send
history = [resp for resp in gen]
File ".../test/.venv/lib/python3.9/site-packages/requests/sessions.py", line 667, in <listcomp>
history = [resp for resp in gen]
File ".../test/.venv/lib/python3.9/site-packages/requests/sessions.py", line 166, in resolve_redirects
raise TooManyRedirects('Exceeded {} redirects.'.format(self.max_redirects), response=resp)
requests.exceptions.TooManyRedirects: Exceeded 30 redirects.
Reproduction Steps
import requests
requests.get("https://pyropus.ca./")
System Information
$ python -m requests.help
{
"chardet": {
"version": null
},
"charset_normalizer": {
"version": "2.0.12"
},
"cryptography": {
"version": ""
},
"idna": {
"version": "3.3"
},
"implementation": {
"name": "CPython",
"version": "3.9.2"
},
"platform": {
"release": "5.17.5",
"system": "Linux"
},
"pyOpenSSL": {
"openssl_version": "",
"version": null
},
"requests": {
"version": "2.27.1"
},
"system_ssl": {
"version": "101010bf"
},
"urllib3": {
"version": "1.26.9"
},
"using_charset_normalizer": true,
"using_pyopenssl": false
}
Edit: added a couple words to the summary to clarify.
- Lenguaje dominante
- Python
- Estrellas
- 54.7k
- Forks
- 10.8k
- Merge medio
- 18 min
- PR fusionados (30 d)
- 1
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de psf/requests
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
-
`iter_lines(decode_unicode=True, delimiter=<str>)` raises `TypeError` when `Response.encoding` is `None`Quizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
-
get_encoding_from_headers treats any content type containing 'text' as text/* (ISO-8859-1)Posiblemente ocupada @suyashgitt la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Invalid `params` type (e.g. int) raises misleading "TypeError: Cannot mix str and non-str arguments"Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Todos los issues de psf/requests
Issues similares
-
README Quick Start query command fails, and doctor points to a missing Prerequisites sectionAbiertodocumentation type/bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
add entry to blockAbierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 65/100
StevenBlack/hosts#3299 ·
-
`garak --report` overwrites the input report when its name has no ".report"Posiblemente ocupada @0z5a la tomó hoy. Abiertoneeds-triage
Dificultad 2/5 Medio día Aptitud para principiantes 72/100
Los mantenedores suelen responder en 2 días
-
trace: Pi's 1-hour cache writes are priced at 1.25x, but billed at 2xPosiblemente ocupada @Shizoqua la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
microsoft/TokenEconomizer#221 ·
Los mantenedores suelen responder en 1 día
-
plot_graph crashes when a mesh node has no m2m edgePosiblemente ocupada @tygvi la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
mllam/neural-lam#883 · 1 comentario ·
Los mantenedores suelen responder en 2 días