Skip to content

Commit

Permalink
Disallow arbitrary sequence types in version (#7835)
Browse files Browse the repository at this point in the history
Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
(cherry picked from commit 1e86b77)
  • Loading branch information
Dreamsorcerer committed Nov 13, 2023
1 parent 9d712f2 commit 36cd97a
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
1 change: 1 addition & 0 deletions CHANGES/7835.bugfix
@@ -0,0 +1 @@
Fixed arbitrary sequence types being allowed to inject headers via version parameter -- by :user:`Dreamsorcerer`
4 changes: 2 additions & 2 deletions aiohttp/client_reqrep.py
Expand Up @@ -706,8 +706,8 @@ async def send(self, conn: "Connection") -> "ClientResponse":
self.headers[hdrs.CONNECTION] = connection

# status + headers
status_line = "{0} {1} HTTP/{2[0]}.{2[1]}".format(
self.method, path, self.version
status_line = "{0} {1} HTTP/{v.major}.{v.minor}".format(
self.method, path, v=self.version
)
await writer.write_headers(status_line, self.headers)

Expand Down
20 changes: 17 additions & 3 deletions tests/test_client_request.py
Expand Up @@ -21,6 +21,7 @@
_gen_default_accept_encoding,
_merge_ssl_params,
)
from aiohttp.http import HttpVersion
from aiohttp.test_utils import make_mocked_coro


Expand Down Expand Up @@ -623,18 +624,18 @@ async def test_connection_header(loop, conn) -> None:
req.headers.clear()

req.keep_alive.return_value = True
req.version = (1, 1)
req.version = HttpVersion(1, 1)
req.headers.clear()
await req.send(conn)
assert req.headers.get("CONNECTION") is None

req.version = (1, 0)
req.version = HttpVersion(1, 0)
req.headers.clear()
await req.send(conn)
assert req.headers.get("CONNECTION") == "keep-alive"

req.keep_alive.return_value = False
req.version = (1, 1)
req.version = HttpVersion(1, 1)
req.headers.clear()
await req.send(conn)
assert req.headers.get("CONNECTION") == "close"
Expand Down Expand Up @@ -1161,6 +1162,19 @@ async def gen():
resp.close()


async def test_bad_version(loop, conn) -> None:
req = ClientRequest(
"GET",
URL("http://python.org"),
loop=loop,
headers={"Connection": "Close"},
version=("1", "1\r\nInjected-Header: not allowed"),
)

with pytest.raises(AttributeError):
await req.send(conn)


async def test_custom_response_class(loop, conn) -> None:
class CustomResponse(ClientResponse):
def read(self, decode=False):
Expand Down

0 comments on commit 36cd97a

Please sign in to comment.