Skip to content

Commit

Permalink
refuse empty request-target in HTTP request
Browse files Browse the repository at this point in the history
A single slash is valid, but nothing at all can be safely refused.

Python stdlib explicitly tells us it will not perform validation.
https://docs.python.org/3/library/urllib.parse.html#url-parsing-security
There are *four* `request-target` forms in rfc9112, none of them can be empty.
  • Loading branch information
pajod committed Jul 31, 2024
1 parent 79b9a52 commit 9ca4f1f
Showing 1 changed file with 11 additions and 0 deletions.
11 changes: 11 additions & 0 deletions gunicorn/http/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,17 @@ def parse_request_line(self, line_bytes):
# URI
self.uri = bits[1]

# Python stdlib explicitly tells us it will not perform validation.
# https://docs.python.org/3/library/urllib.parse.html#url-parsing-security
# There are *four* `request-target` forms in rfc9112, none of them can be empty:
# 1. origin-form, which starts with a slash
# 2. absolute-form, which starts with a non-empty scheme
# 3. authority-form, (for CONNECT) which contains a colon after the host
# 4. asterisk-form, which is an asterisk (`\x2A`)
# => manually reject one always invalid URI: empty
if len(self.uri) == 0:
raise InvalidRequestLine(bytes_to_str(line_bytes))

try:
parts = split_request_uri(self.uri)
except ValueError:
Expand Down

0 comments on commit 9ca4f1f

Please sign in to comment.