mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-16 19:41:06 +03:00
don't set X-Throttle-Wait-Second header if throttle wait is None
This commit is contained in:
parent
999056cde1
commit
1d8a80f5cc
|
@ -7,7 +7,7 @@ from django.contrib.auth.models import User
|
||||||
from django.core.cache import cache
|
from django.core.cache import cache
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.throttling import UserRateThrottle, ScopedRateThrottle
|
from rest_framework.throttling import BaseThrottle, UserRateThrottle, ScopedRateThrottle
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
|
|
||||||
|
@ -21,6 +21,14 @@ class User3MinRateThrottle(UserRateThrottle):
|
||||||
scope = 'minutes'
|
scope = 'minutes'
|
||||||
|
|
||||||
|
|
||||||
|
class NonTimeThrottle(BaseThrottle):
|
||||||
|
def allow_request(self, request, view):
|
||||||
|
if not hasattr(self.__class__, 'called'):
|
||||||
|
self.__class__.called = True
|
||||||
|
return True
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
class MockView(APIView):
|
class MockView(APIView):
|
||||||
throttle_classes = (User3SecRateThrottle,)
|
throttle_classes = (User3SecRateThrottle,)
|
||||||
|
|
||||||
|
@ -35,6 +43,13 @@ class MockView_MinuteThrottling(APIView):
|
||||||
return Response('foo')
|
return Response('foo')
|
||||||
|
|
||||||
|
|
||||||
|
class MockView_NonTimeThrottling(APIView):
|
||||||
|
throttle_classes = (NonTimeThrottle,)
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
return Response('foo')
|
||||||
|
|
||||||
|
|
||||||
class ThrottlingTests(TestCase):
|
class ThrottlingTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""
|
"""
|
||||||
|
@ -140,6 +155,22 @@ class ThrottlingTests(TestCase):
|
||||||
(80, None)
|
(80, None)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
def test_non_time_throttle(self):
|
||||||
|
"""
|
||||||
|
Ensure for second based throttles.
|
||||||
|
"""
|
||||||
|
request = self.factory.get('/')
|
||||||
|
|
||||||
|
self.assertFalse(hasattr(MockView_NonTimeThrottling.throttle_classes[0], 'called'))
|
||||||
|
|
||||||
|
response = MockView_NonTimeThrottling.as_view()(request)
|
||||||
|
self.assertFalse('X-Throttle-Wait-Seconds' in response)
|
||||||
|
|
||||||
|
self.assertTrue(MockView_NonTimeThrottling.throttle_classes[0].called)
|
||||||
|
|
||||||
|
response = MockView_NonTimeThrottling.as_view()(request)
|
||||||
|
self.assertFalse('X-Throttle-Wait-Seconds' in response)
|
||||||
|
|
||||||
|
|
||||||
class ScopedRateThrottleTests(TestCase):
|
class ScopedRateThrottleTests(TestCase):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -269,7 +269,7 @@ class APIView(View):
|
||||||
Handle any exception that occurs, by returning an appropriate response,
|
Handle any exception that occurs, by returning an appropriate response,
|
||||||
or re-raising the error.
|
or re-raising the error.
|
||||||
"""
|
"""
|
||||||
if isinstance(exc, exceptions.Throttled):
|
if isinstance(exc, exceptions.Throttled) and exc.wait is not None:
|
||||||
# Throttle wait header
|
# Throttle wait header
|
||||||
self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait
|
self.headers['X-Throttle-Wait-Seconds'] = '%d' % exc.wait
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user