Skip to content

Commit 8705dd3

Browse files
committed
set Vary: Cookie header consistently for session
1 parent 9532cba commit 8705dd3

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

src/flask/sessions.py

+6-4
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,10 @@ def save_session(
329329
samesite = self.get_cookie_samesite(app)
330330
httponly = self.get_cookie_httponly(app)
331331

332+
# Add a "Vary: Cookie" header if the session was accessed at all.
333+
if session.accessed:
334+
response.vary.add("Cookie")
335+
332336
# If the session is modified to be empty, remove the cookie.
333337
# If the session is empty, return without setting the cookie.
334338
if not session:
@@ -341,13 +345,10 @@ def save_session(
341345
samesite=samesite,
342346
httponly=httponly,
343347
)
348+
response.vary.add("Cookie")
344349

345350
return
346351

347-
# Add a "Vary: Cookie" header if the session was accessed at all.
348-
if session.accessed:
349-
response.vary.add("Cookie")
350-
351352
if not self.should_set_cookie(app, session):
352353
return
353354

@@ -363,3 +364,4 @@ def save_session(
363364
secure=secure,
364365
samesite=samesite,
365366
)
367+
response.vary.add("Cookie")

tests/test_basic.py

+23
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,11 @@ def getitem():
501501
def setdefault():
502502
return flask.session.setdefault("test", "default")
503503

504+
@app.route("/clear")
505+
def clear():
506+
flask.session.clear()
507+
return ""
508+
504509
@app.route("/vary-cookie-header-set")
505510
def vary_cookie_header_set():
506511
response = flask.Response()
@@ -533,11 +538,29 @@ def expect(path, header_value="Cookie"):
533538
expect("/get")
534539
expect("/getitem")
535540
expect("/setdefault")
541+
expect("/clear")
536542
expect("/vary-cookie-header-set")
537543
expect("/vary-header-set", "Accept-Encoding, Accept-Language, Cookie")
538544
expect("/no-vary-header", None)
539545

540546

547+
def test_session_refresh_vary(app, client):
548+
@app.get("/#")
549+
def login():
550+
flask.session["user_id"] = 1
551+
flask.session.permanent = True
552+
return ""
553+
554+
@app.get("/ignored")
555+
def ignored():
556+
return ""
557+
558+
rv = client.get("/#")
559+
assert rv.headers["Vary"] == "Cookie"
560+
rv = client.get("/ignored")
561+
assert rv.headers["Vary"] == "Cookie"
562+
563+
541564
def test_flashes(app, req_ctx):
542565
assert not flask.session.modified
543566
flask.flash("Zap")

0 commit comments

Comments
 (0)