def test_form_POST_unicode(self): """ JSON POST via default web interface with unicode data """ # Note: environ and other variables here have simplified content compared to real Request CONTENT = b'_content_type=application%2Fjson&_content=%7B%22request%22%3A+4%2C+%22firm%22%3A+1%2C+%22text%22%3A+%22%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21%22%7D' environ = { 'REQUEST_METHOD': 'POST', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CONTENT_LENGTH': len(CONTENT), 'wsgi.input': BytesIO(CONTENT), } wsgi_request = WSGIRequest(environ=environ) wsgi_request._load_post_and_files() parsers = (JSONParser(), FormParser(), MultiPartParser()) parser_context = { 'encoding': 'utf-8', 'kwargs': {}, 'args': (), } request = Request(wsgi_request, parsers=parsers, parser_context=parser_context) method = request.method self.assertEqual(method, 'POST') self.assertEqual(request._content_type, 'application/json') self.assertEqual( request._stream.getvalue(), b'{"request": 4, "firm": 1, "text": "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"}' ) self.assertEqual(request._data, Empty) self.assertEqual(request._files, Empty)
def test_form_POST_unicode(self): """ JSON POST via default web interface with unicode data """ # Note: environ and other variables here have simplified content compared to real Request CONTENT = b'_content_type=application%2Fjson&_content=%7B%22request%22%3A+4%2C+%22firm%22%3A+1%2C+%22text%22%3A+%22%D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21%22%7D' environ = { 'REQUEST_METHOD': 'POST', 'CONTENT_TYPE': 'application/x-www-form-urlencoded', 'CONTENT_LENGTH': len(CONTENT), 'wsgi.input': BytesIO(CONTENT), } wsgi_request = WSGIRequest(environ=environ) wsgi_request._load_post_and_files() parsers = (JSONParser(), FormParser(), MultiPartParser()) parser_context = { 'encoding': 'utf-8', 'kwargs': {}, 'args': (), } request = Request(wsgi_request, parsers=parsers, parser_context=parser_context) method = request.method self.assertEqual(method, 'POST') self.assertEqual(request._content_type, 'application/json') self.assertEqual(request._stream.getvalue(), b'{"request": 4, "firm": 1, "text": "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82!"}') self.assertEqual(request._data, Empty) self.assertEqual(request._files, Empty)
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")
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 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 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 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 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()
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()
def _load_post_and_files(self): try: return WSGIRequest._load_post_and_files(self) finally: # "Resetting" the input so WebOb will read it: self._seek_input()