123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- from io import BytesIO
- from django.core.exceptions import RequestDataTooBig, TooManyFieldsSent
- from django.core.handlers.wsgi import WSGIRequest
- from django.test import SimpleTestCase
- from django.test.client import FakePayload
- TOO_MANY_FIELDS_MSG = 'The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.'
- TOO_MUCH_DATA_MSG = 'Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.'
- class DataUploadMaxMemorySizeFormPostTests(SimpleTestCase):
- def setUp(self):
- payload = FakePayload('a=1&a=2;a=3\r\n')
- self.request = WSGIRequest({
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': 'application/x-www-form-urlencoded',
- 'CONTENT_LENGTH': len(payload),
- 'wsgi.input': payload,
- })
- def test_size_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=12):
- with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
- self.request._load_post_and_files()
- def test_size_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=13):
- self.request._load_post_and_files()
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
- self.request._load_post_and_files()
- class DataUploadMaxMemorySizeMultipartPostTests(SimpleTestCase):
- def setUp(self):
- payload = FakePayload("\r\n".join([
- '--boundary',
- 'Content-Disposition: form-data; name="name"',
- '',
- 'value',
- '--boundary--'
- ''
- ]))
- self.request = WSGIRequest({
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
- 'CONTENT_LENGTH': len(payload),
- 'wsgi.input': payload,
- })
- def test_size_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=10):
- with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
- self.request._load_post_and_files()
- def test_size_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=11):
- self.request._load_post_and_files()
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
- self.request._load_post_and_files()
- def test_file_passes(self):
- payload = FakePayload("\r\n".join([
- '--boundary',
- 'Content-Disposition: form-data; name="file1"; filename="test.file"',
- '',
- 'value',
- '--boundary--'
- ''
- ]))
- request = WSGIRequest({
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
- 'CONTENT_LENGTH': len(payload),
- 'wsgi.input': payload,
- })
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=1):
- request._load_post_and_files()
- self.assertIn('file1', request.FILES, "Upload file not present")
- class DataUploadMaxMemorySizeGetTests(SimpleTestCase):
- def setUp(self):
- self.request = WSGIRequest({
- 'REQUEST_METHOD': 'GET',
- 'wsgi.input': BytesIO(b''),
- 'CONTENT_LENGTH': 3,
- })
- def test_data_upload_max_memory_size_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=2):
- with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
- self.request.body
- def test_size_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=3):
- self.request.body
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
- self.request.body
- class DataUploadMaxNumberOfFieldsGet(SimpleTestCase):
- def test_get_max_fields_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=1):
- with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
- request = WSGIRequest({
- 'REQUEST_METHOD': 'GET',
- 'wsgi.input': BytesIO(b''),
- 'QUERY_STRING': 'a=1&a=2;a=3',
- })
- request.GET['a']
- def test_get_max_fields_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=3):
- request = WSGIRequest({
- 'REQUEST_METHOD': 'GET',
- 'wsgi.input': BytesIO(b''),
- 'QUERY_STRING': 'a=1&a=2;a=3',
- })
- request.GET['a']
- class DataUploadMaxNumberOfFieldsMultipartPost(SimpleTestCase):
- def setUp(self):
- payload = FakePayload("\r\n".join([
- '--boundary',
- 'Content-Disposition: form-data; name="name1"',
- '',
- 'value1',
- '--boundary',
- 'Content-Disposition: form-data; name="name2"',
- '',
- 'value2',
- '--boundary--'
- ''
- ]))
- self.request = WSGIRequest({
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
- 'CONTENT_LENGTH': len(payload),
- 'wsgi.input': payload,
- })
- def test_number_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=1):
- with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
- self.request._load_post_and_files()
- def test_number_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=2):
- self.request._load_post_and_files()
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=None):
- self.request._load_post_and_files()
- class DataUploadMaxNumberOfFieldsFormPost(SimpleTestCase):
- def setUp(self):
- payload = FakePayload("\r\n".join(['a=1&a=2;a=3', '']))
- self.request = WSGIRequest({
- 'REQUEST_METHOD': 'POST',
- 'CONTENT_TYPE': 'application/x-www-form-urlencoded',
- 'CONTENT_LENGTH': len(payload),
- 'wsgi.input': payload,
- })
- def test_number_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=2):
- with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
- self.request._load_post_and_files()
- def test_number_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=3):
- self.request._load_post_and_files()
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=None):
- self.request._load_post_and_files()
|