test_data_upload_settings.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. from io import BytesIO
  2. from django.core.exceptions import RequestDataTooBig, TooManyFieldsSent
  3. from django.core.handlers.wsgi import WSGIRequest
  4. from django.test import SimpleTestCase
  5. from django.test.client import FakePayload
  6. TOO_MANY_FIELDS_MSG = 'The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS.'
  7. TOO_MUCH_DATA_MSG = 'Request body exceeded settings.DATA_UPLOAD_MAX_MEMORY_SIZE.'
  8. class DataUploadMaxMemorySizeFormPostTests(SimpleTestCase):
  9. def setUp(self):
  10. payload = FakePayload('a=1&a=2;a=3\r\n')
  11. self.request = WSGIRequest({
  12. 'REQUEST_METHOD': 'POST',
  13. 'CONTENT_TYPE': 'application/x-www-form-urlencoded',
  14. 'CONTENT_LENGTH': len(payload),
  15. 'wsgi.input': payload,
  16. })
  17. def test_size_exceeded(self):
  18. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=12):
  19. with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
  20. self.request._load_post_and_files()
  21. def test_size_not_exceeded(self):
  22. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=13):
  23. self.request._load_post_and_files()
  24. def test_no_limit(self):
  25. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
  26. self.request._load_post_and_files()
  27. class DataUploadMaxMemorySizeMultipartPostTests(SimpleTestCase):
  28. def setUp(self):
  29. payload = FakePayload("\r\n".join([
  30. '--boundary',
  31. 'Content-Disposition: form-data; name="name"',
  32. '',
  33. 'value',
  34. '--boundary--'
  35. ''
  36. ]))
  37. self.request = WSGIRequest({
  38. 'REQUEST_METHOD': 'POST',
  39. 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
  40. 'CONTENT_LENGTH': len(payload),
  41. 'wsgi.input': payload,
  42. })
  43. def test_size_exceeded(self):
  44. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=10):
  45. with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
  46. self.request._load_post_and_files()
  47. def test_size_not_exceeded(self):
  48. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=11):
  49. self.request._load_post_and_files()
  50. def test_no_limit(self):
  51. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
  52. self.request._load_post_and_files()
  53. def test_file_passes(self):
  54. payload = FakePayload("\r\n".join([
  55. '--boundary',
  56. 'Content-Disposition: form-data; name="file1"; filename="test.file"',
  57. '',
  58. 'value',
  59. '--boundary--'
  60. ''
  61. ]))
  62. request = WSGIRequest({
  63. 'REQUEST_METHOD': 'POST',
  64. 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
  65. 'CONTENT_LENGTH': len(payload),
  66. 'wsgi.input': payload,
  67. })
  68. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=1):
  69. request._load_post_and_files()
  70. self.assertIn('file1', request.FILES, "Upload file not present")
  71. class DataUploadMaxMemorySizeGetTests(SimpleTestCase):
  72. def setUp(self):
  73. self.request = WSGIRequest({
  74. 'REQUEST_METHOD': 'GET',
  75. 'wsgi.input': BytesIO(b''),
  76. 'CONTENT_LENGTH': 3,
  77. })
  78. def test_data_upload_max_memory_size_exceeded(self):
  79. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=2):
  80. with self.assertRaisesMessage(RequestDataTooBig, TOO_MUCH_DATA_MSG):
  81. self.request.body
  82. def test_size_not_exceeded(self):
  83. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=3):
  84. self.request.body
  85. def test_no_limit(self):
  86. with self.settings(DATA_UPLOAD_MAX_MEMORY_SIZE=None):
  87. self.request.body
  88. class DataUploadMaxNumberOfFieldsGet(SimpleTestCase):
  89. def test_get_max_fields_exceeded(self):
  90. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=1):
  91. with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
  92. request = WSGIRequest({
  93. 'REQUEST_METHOD': 'GET',
  94. 'wsgi.input': BytesIO(b''),
  95. 'QUERY_STRING': 'a=1&a=2;a=3',
  96. })
  97. request.GET['a']
  98. def test_get_max_fields_not_exceeded(self):
  99. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=3):
  100. request = WSGIRequest({
  101. 'REQUEST_METHOD': 'GET',
  102. 'wsgi.input': BytesIO(b''),
  103. 'QUERY_STRING': 'a=1&a=2;a=3',
  104. })
  105. request.GET['a']
  106. class DataUploadMaxNumberOfFieldsMultipartPost(SimpleTestCase):
  107. def setUp(self):
  108. payload = FakePayload("\r\n".join([
  109. '--boundary',
  110. 'Content-Disposition: form-data; name="name1"',
  111. '',
  112. 'value1',
  113. '--boundary',
  114. 'Content-Disposition: form-data; name="name2"',
  115. '',
  116. 'value2',
  117. '--boundary--'
  118. ''
  119. ]))
  120. self.request = WSGIRequest({
  121. 'REQUEST_METHOD': 'POST',
  122. 'CONTENT_TYPE': 'multipart/form-data; boundary=boundary',
  123. 'CONTENT_LENGTH': len(payload),
  124. 'wsgi.input': payload,
  125. })
  126. def test_number_exceeded(self):
  127. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=1):
  128. with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
  129. self.request._load_post_and_files()
  130. def test_number_not_exceeded(self):
  131. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=2):
  132. self.request._load_post_and_files()
  133. def test_no_limit(self):
  134. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=None):
  135. self.request._load_post_and_files()
  136. class DataUploadMaxNumberOfFieldsFormPost(SimpleTestCase):
  137. def setUp(self):
  138. payload = FakePayload("\r\n".join(['a=1&a=2;a=3', '']))
  139. self.request = WSGIRequest({
  140. 'REQUEST_METHOD': 'POST',
  141. 'CONTENT_TYPE': 'application/x-www-form-urlencoded',
  142. 'CONTENT_LENGTH': len(payload),
  143. 'wsgi.input': payload,
  144. })
  145. def test_number_exceeded(self):
  146. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=2):
  147. with self.assertRaisesMessage(TooManyFieldsSent, TOO_MANY_FIELDS_MSG):
  148. self.request._load_post_and_files()
  149. def test_number_not_exceeded(self):
  150. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=3):
  151. self.request._load_post_and_files()
  152. def test_no_limit(self):
  153. with self.settings(DATA_UPLOAD_MAX_NUMBER_FIELDS=None):
  154. self.request._load_post_and_files()