set Retry-After header when throttled

This commit is contained in:
Dmitry Mukhin 2014-04-07 20:31:12 +04:00
parent 115fe04842
commit c3891b6e00
3 changed files with 6 additions and 1 deletions

View File

@ -71,7 +71,7 @@ class UnsupportedMediaType(APIException):
class Throttled(APIException): class Throttled(APIException):
status_code = status.HTTP_429_TOO_MANY_REQUESTS status_code = status.HTTP_429_TOO_MANY_REQUESTS
default_detail = 'Request was throttled.' default_detail = 'Request was throttled.'
extra_detail = "Expected available in %d second%s." extra_detail = " Expected available in %d second%s."
def __init__(self, wait=None, detail=None): def __init__(self, wait=None, detail=None):
if wait is None: if wait is None:

View File

@ -117,8 +117,10 @@ class ThrottlingTests(TestCase):
response = view.as_view()(request) response = view.as_view()(request)
if expect is not None: if expect is not None:
self.assertEqual(response['X-Throttle-Wait-Seconds'], expect) self.assertEqual(response['X-Throttle-Wait-Seconds'], expect)
self.assertEqual(response['Retry-After'], expect)
else: else:
self.assertFalse('X-Throttle-Wait-Seconds' in response) self.assertFalse('X-Throttle-Wait-Seconds' in response)
self.assertFalse('Retry-After' in response)
def test_seconds_fields(self): def test_seconds_fields(self):
""" """
@ -165,11 +167,13 @@ class ThrottlingTests(TestCase):
response = MockView_NonTimeThrottling.as_view()(request) response = MockView_NonTimeThrottling.as_view()(request)
self.assertFalse('X-Throttle-Wait-Seconds' in response) self.assertFalse('X-Throttle-Wait-Seconds' in response)
self.assertFalse('Retry-After' in response)
self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called) self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called)
response = MockView_NonTimeThrottling.as_view()(request) response = MockView_NonTimeThrottling.as_view()(request)
self.assertFalse('X-Throttle-Wait-Seconds' in response) self.assertFalse('X-Throttle-Wait-Seconds' in response)
self.assertFalse('Retry-After' in response)
class ScopedRateThrottleTests(TestCase): class ScopedRateThrottleTests(TestCase):

View File

@ -61,6 +61,7 @@ def exception_handler(exc):
headers['WWW-Authenticate'] = exc.auth_header headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None): if getattr(exc, 'wait', None):
headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait
headers['Retry-After'] = '%d' % exc.wait
return Response({'detail': exc.detail}, return Response({'detail': exc.detail},
status=exc.status_code, status=exc.status_code,