Skip to content

Commit f7e7b43

Browse files
committed
this will probably work
1 parent 4d2f22e commit f7e7b43

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

posthog/request.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,12 @@ def _process_response(
6868
log = logging.getLogger("posthog")
6969
if res.status_code == 200:
7070
log.debug(success_message)
71-
return res.json() if return_json else res
71+
response = res.json() if return_json else res
72+
# Handle quota limited decide responses by raising a specific error
73+
if isinstance(response, dict) and "quotaLimited" in response and "feature_flags" in response["quotaLimited"]:
74+
log.warning("PostHog feature flags quota limited")
75+
raise QuotaLimitError(res.status_code, "Feature flags quota limited")
76+
return response
7277
try:
7378
payload = res.json()
7479
log.debug("received response: %s", payload)
@@ -107,6 +112,10 @@ def __str__(self):
107112
return msg.format(self.message, self.status)
108113

109114

115+
class QuotaLimitError(APIError):
116+
pass
117+
118+
110119
class DatetimeSerializer(json.JSONEncoder):
111120
def default(self, obj: Any):
112121
if isinstance(obj, (date, datetime)):

posthog/test/test_request.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@
44

55
import pytest
66
import requests
7+
import mock
78

8-
from posthog.request import DatetimeSerializer, batch_post, determine_server_host
9+
from posthog.request import DatetimeSerializer, batch_post, decide, determine_server_host, QuotaLimitError
910
from posthog.test.test_utils import TEST_API_KEY
1011

1112

@@ -44,6 +45,36 @@ def test_should_timeout(self):
4445
"key", batch=[{"distinct_id": "distinct_id", "event": "python event", "type": "track"}], timeout=0.0001
4546
)
4647

48+
def test_quota_limited_response(self):
49+
mock_response = requests.Response()
50+
mock_response.status_code = 200
51+
mock_response._content = json.dumps({
52+
"quotaLimited": ["feature_flags"],
53+
"featureFlags": {},
54+
"featureFlagPayloads": {},
55+
"errorsWhileComputingFlags": False
56+
}).encode('utf-8')
57+
58+
with mock.patch('posthog.request._session.post', return_value=mock_response):
59+
with self.assertRaises(QuotaLimitError) as cm:
60+
decide("fake_key", "fake_host")
61+
62+
self.assertEqual(cm.exception.status, 200)
63+
self.assertEqual(cm.exception.message, "Feature flags quota limited")
64+
65+
def test_normal_decide_response(self):
66+
mock_response = requests.Response()
67+
mock_response.status_code = 200
68+
mock_response._content = json.dumps({
69+
"featureFlags": {"flag1": True},
70+
"featureFlagPayloads": {},
71+
"errorsWhileComputingFlags": False
72+
}).encode('utf-8')
73+
74+
with mock.patch('posthog.request._session.post', return_value=mock_response):
75+
response = decide("fake_key", "fake_host")
76+
self.assertEqual(response["featureFlags"], {"flag1": True})
77+
4778

4879
@pytest.mark.parametrize(
4980
"host, expected",

0 commit comments

Comments
 (0)