Skip to content

Commit 454f914

Browse files
[PR #9895/d8ec1b4 backport][3.11] Defer creation of SimpleCookie objects in the web server until needed (#9971)
Co-authored-by: J. Nick Koston <[email protected]>
1 parent 85ef646 commit 454f914

File tree

3 files changed

+14
-6
lines changed

3 files changed

+14
-6
lines changed

CHANGES/9895.misc.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Improved performance of creating web responses when there are no cookies -- by :user:`bdraco`.

aiohttp/web_response.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def __init__(
9393
self._compression = False
9494
self._compression_strategy: int = zlib.Z_DEFAULT_STRATEGY
9595
self._compression_force: Optional[ContentCoding] = None
96-
self._cookies = SimpleCookie()
96+
self._cookies: Optional[SimpleCookie] = None
9797

9898
self._req: Optional[BaseRequest] = None
9999
self._payload_writer: Optional[AbstractStreamWriter] = None
@@ -209,6 +209,8 @@ def headers(self) -> "CIMultiDict[str]":
209209

210210
@property
211211
def cookies(self) -> SimpleCookie:
212+
if self._cookies is None:
213+
self._cookies = SimpleCookie()
212214
return self._cookies
213215

214216
def set_cookie(
@@ -230,10 +232,8 @@ def set_cookie(
230232
Sets new cookie or updates existent with new value.
231233
Also updates only those params which are not None.
232234
"""
233-
old = self._cookies.get(name)
234-
if old is not None and old.coded_value == "":
235-
# deleted cookie
236-
self._cookies.pop(name, None)
235+
if self._cookies is None:
236+
self._cookies = SimpleCookie()
237237

238238
self._cookies[name] = value
239239
c = self._cookies[name]
@@ -277,7 +277,8 @@ def del_cookie(
277277
Creates new empty expired cookie.
278278
"""
279279
# TODO: do we need domain/path here?
280-
self._cookies.pop(name, None)
280+
if self._cookies is not None:
281+
self._cookies.pop(name, None)
281282
self.set_cookie(
282283
name,
283284
"",

tests/test_web_response.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -862,6 +862,10 @@ def test_response_cookies() -> None:
862862
assert resp.cookies == {}
863863
assert str(resp.cookies) == ""
864864

865+
resp.set_cookie("name", "value")
866+
assert str(resp.cookies) == "Set-Cookie: name=value; Path=/"
867+
resp.set_cookie("name", "")
868+
assert str(resp.cookies) == 'Set-Cookie: name=""; Path=/'
865869
resp.set_cookie("name", "value")
866870
assert str(resp.cookies) == "Set-Cookie: name=value; Path=/"
867871
resp.set_cookie("name", "other_value")
@@ -879,6 +883,8 @@ def test_response_cookies() -> None:
879883
"expires=Thu, 01 Jan 1970 00:00:00 GMT; Max-Age=0; Path=/"
880884
)
881885
assert Matches(expected) == str(resp.cookies)
886+
resp.del_cookie("name")
887+
assert str(resp.cookies) == Matches(expected)
882888

883889
resp.set_cookie("name", "value", domain="local.host")
884890
expected = "Set-Cookie: name=value; Domain=local.host; Path=/"

0 commit comments

Comments
 (0)