summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAndre Cruz <andre.cruz@co.sapo.pt>2015-01-07 18:41:29 +0000
committerTim Graham <timograham@gmail.com>2016-05-12 10:17:52 -0400
commit929684d6ee0efb5afad51dc584489d0437d2451b (patch)
tree44714f4502df964790f9db9a4751c843fa49a997 /tests
parent4065f429f559533f11abbab40624a61027a52b61 (diff)
downloaddjango-929684d6ee0efb5afad51dc584489d0437d2451b.tar.gz
Fixed #21231 -- Enforced a max size for GET/POST values read into memory.
Thanks Tom Christie for review.
Diffstat (limited to 'tests')
-rw-r--r--tests/requests/test_data_upload_settings.py186
1 files changed, 186 insertions, 0 deletions
diff --git a/tests/requests/test_data_upload_settings.py b/tests/requests/test_data_upload_settings.py
new file mode 100644
index 0000000000..8855e13336
--- /dev/null
+++ b/tests/requests/test_data_upload_settings.py
@@ -0,0 +1,186 @@
+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()