Skip to content

Commit 1b57c72

Browse files
committed
Clear stored ETag when server stops sending one
If the server stops including ETag headers in responses, clear the stored ETag so we don't keep sending a stale If-None-Match header.
1 parent 32ac491 commit 1b57c72

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

posthog/client.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,9 +1187,8 @@ def _load_feature_flags(self):
11871187
etag=self._flags_etag,
11881188
)
11891189

1190-
# Update stored ETag
1191-
if response.etag:
1192-
self._flags_etag = response.etag
1190+
# Update stored ETag (clear if server stops sending one)
1191+
self._flags_etag = response.etag
11931192

11941193
# If 304 Not Modified, flags haven't changed - skip processing
11951194
if response.not_modified:

posthog/test/test_feature_flags.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2480,6 +2480,39 @@ def test_load_feature_flags_etag_updated_on_new_response(
24802480
self.assertEqual(client._flags_etag, '"etag-v2"')
24812481
self.assertEqual(client.feature_flags[0]["key"], "flag-v2")
24822482

2483+
@mock.patch("posthog.client.Poller")
2484+
@mock.patch("posthog.client.get")
2485+
def test_load_feature_flags_clears_etag_when_server_stops_sending(
2486+
self, patch_get, patch_poll
2487+
):
2488+
"""Test that ETag is cleared when server stops sending it"""
2489+
patch_get.side_effect = [
2490+
GetResponse(
2491+
data={
2492+
"flags": [{"id": 1, "key": "flag-v1", "active": True}],
2493+
"group_type_mapping": {},
2494+
"cohorts": {},
2495+
},
2496+
etag='"etag-v1"',
2497+
),
2498+
GetResponse(
2499+
data={
2500+
"flags": [{"id": 1, "key": "flag-v2", "active": True}],
2501+
"group_type_mapping": {},
2502+
"cohorts": {},
2503+
},
2504+
etag=None, # Server stopped sending ETag
2505+
),
2506+
]
2507+
2508+
client = Client(FAKE_TEST_API_KEY, personal_api_key="test")
2509+
client.load_feature_flags()
2510+
self.assertEqual(client._flags_etag, '"etag-v1"')
2511+
2512+
client._load_feature_flags()
2513+
self.assertIsNone(client._flags_etag)
2514+
self.assertEqual(client.feature_flags[0]["key"], "flag-v2")
2515+
24832516
def test_load_feature_flags_wrong_key(self):
24842517
client = Client(FAKE_TEST_API_KEY, personal_api_key=FAKE_TEST_API_KEY)
24852518

0 commit comments

Comments
 (0)