mirror of
				https://github.com/encode/django-rest-framework.git
				synced 2025-11-04 18:08:03 +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