http.server: HTTP/1.1 requests without Host, with two Host fields or with an invalid Host value are accepted
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Accessibilité débutants
- 35/100
- Type d'issue
- Bug
- Clarté
- Clairement spécifiée
- Activité
- À l'abandon
- Stack technique
- python
- Domaine
- backend-api-design, networking
Piste de recherche
Start with BaseHTTPRequestHandler.parse_request and trace how it handles HTTP/1.1 headers. The report’s three examples define the cases to check: missing Host, duplicate Host fields, and an invalid Host value. Done means each case receives a 400 Bad Request; note that the issue body references linked PR gh-161696.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Bug report
BaseHTTPRequestHandler.parse_request does not look at the Host field. RFC 9112 section 3.2 states: "A server MUST respond with a 400 (Bad Request) status code to any HTTP/1.1 request message that lacks a Host header field and to any request message that contains more than one Host header field line or a Host header field with an invalid field value."
All three kinds of request below get status 200 and reach the handler. The 400 for a missing Host is from RFC 2616 section 14.23; the 400 for duplicate or invalid Host values was added in RFC 7230 section 5.4 (2014).
import http.server, socket, threading
class Handler(http.server.BaseHTTPRequestHandler):
protocol_version = "HTTP/1.1"
def do_GET(self):
body = ("Host: %r\n" % self.headers.get_all("Host")).encode()
self.send_response(200)
self.send_header("Content-Length", str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, *args): pass
server = http.server.ThreadingHTTPServer(("127.0.0.1", 0), Handler)
threading.Thread(target=server.serve_forever, daemon=True).start()
for request in [b"GET / HTTP/1.1\r\n\r\n",
b"GET / HTTP/1.1\r\nHost: a.example\r\nHost: b.example\r\n\r\n",
b"GET / HTTP/1.1\r\nHost: a b\r\n\r\n"]:
with socket.create_connection(server.server_address, timeout=2) as s:
s.sendall(request)
s.shutdown(socket.SHUT_WR)
lines = s.makefile("rb").read().split(b"\r\n")
print(request, "->", lines[0], lines[-1])
server.shutdown()
Output:
b'GET / HTTP/1.1\r\n\r\n' -> b'HTTP/1.1 200 OK' b'Host: None\n'
b'GET / HTTP/1.1\r\nHost: a.example\r\nHost: b.example\r\n\r\n' -> b'HTTP/1.1 200 OK' b"Host: ['a.example', 'b.example']\n"
b'GET / HTTP/1.1\r\nHost: a b\r\n\r\n' -> b'HTTP/1.1 200 OK' b"Host: ['a b']\n"
Expected: HTTP/1.1 400 Bad Request for all three requests.
CPython versions tested on:
3.14
Operating systems tested on:
Linux
Linked PRs
- gh-161696
- Langage dominant
- Python
- Étoiles
- 78.2k
- Forks
- 36.6k
- Merge moyen
- 19 h 57 min
- PR mergées (30 j)
- 630
Préparer son environnement
Lance le conteneur de développement du projet dans votre navigateur, avec votre propre compte GitHub.
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de python/cpython
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
stdlib type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
-
extension-modules stdlib topic-XML type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
python/cpython#161807 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
stdlib type-feature
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
python/cpython#161788 · 7 commentaires ·
Les mainteneurs répondent en général sous 1 jour
-
extension-modules topic-IO type-bug
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de python/cpython
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
cpp-best-practices/project_validator#267 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
Project-N-E-K-O/N.E.K.O#3725 ·
Les mainteneurs répondent en général sous 1 jour
-
[Bug] Sending a Telegram message chain twice duplicates mentionsPeut-être pris @123XieC l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
AstrBotDevs/AstrBot#11125 ·
Les mainteneurs répondent en général sous 1 jour
-
backend bug priority: high
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
nooriegarg/ContribIQ#73 ·
Les mainteneurs répondent en général sous 1 jour
-
bug p3 security
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
amd/gaia#8197 · 2 commentaires ·
Les mainteneurs répondent en général sous 1 jour