123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270 |
- from io import BytesIO
- from django.core.exceptions import (
- RequestDataTooBig,
- TooManyFieldsSent,
- TooManyFilesSent,
- )
- 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_MANY_FILES_MSG = (
- "The number of files exceeded settings.DATA_UPLOAD_MAX_NUMBER_FILES."
- )
- 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
- def test_empty_content_length(self):
- self.request.environ["CONTENT_LENGTH"] = ""
- 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 DataUploadMaxNumberOfFilesMultipartPost(SimpleTestCase):
- def setUp(self):
- payload = FakePayload(
- "\r\n".join(
- [
- "--boundary",
- (
- 'Content-Disposition: form-data; name="name1"; '
- 'filename="name1.txt"'
- ),
- "",
- "value1",
- "--boundary",
- (
- 'Content-Disposition: form-data; name="name2"; '
- 'filename="name2.txt"'
- ),
- "",
- "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_FILES=1):
- with self.assertRaisesMessage(TooManyFilesSent, TOO_MANY_FILES_MSG):
- self.request._load_post_and_files()
- def test_number_not_exceeded(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FILES=2):
- self.request._load_post_and_files()
- def test_no_limit(self):
- with self.settings(DATA_UPLOAD_MAX_NUMBER_FILES=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()
|