Opened 4 years ago
Last modified 4 years ago
#32164 closed Bug
Broken content_length header in AsyncTestClient when doing post requests with json data — at Version 1
Reported by: | patrick | Owned by: | nobody |
---|---|---|---|
Component: | Testing framework | Version: | 3.1 |
Severity: | Normal | Keywords: | aysnc |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description (last modified by )
Hello there, this is my first formal bug report, so I hope I'm doing this correctly. Anyway I was working on a async view and adding a test for it but I got this error:
ERROR django.request:log.py:224 Internal Server Error: /graphql_async Traceback (most recent call last): File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/.venv/lib/python3.9/site-packages/asgiref/sync.py", line 339, in thread_handler raise exc_info[1] File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/.venv/lib/python3.9/site-packages/django/core/handlers/exception.py", line 38, in inner response = await get_response(request) File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/.venv/lib/python3.9/site-packages/django/core/handlers/base.py", line 231, in _get_response_async response = await wrapped_callback(request, *callback_args, **callback_kwargs) File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/strawberry/django/views.py", line 145, in dispatch operation_context = self.get_execution_context(request) File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/strawberry/django/views.py", line 51, in get_execution_context data = self.parse_body(request) File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/strawberry/django/views.py", line 42, in parse_body return json.loads(request.body) File "/Users/patrick/Documents/github/strawberry-graphql/strawberry/.venv/lib/python3.9/site-packages/django/http/request.py", line 320, in body int(self.META.get('CONTENT_LENGTH') or 0) > settings.DATA_UPLOAD_MAX_MEMORY_SIZE): ValueError: invalid literal for int() with base 10: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
after digging a bit it looks like we set the content_length to bytes(len(data))
, which seems to be wrong, since it produces this string:
'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
Code is here: https://github.com/django/django/blob/d1791539a7d86739cd44c909fa8239cae7f85874/django/test/client.py#L543
Code the reproduce is this:
class AsyncRequestFactoryTestPassingData(SimpleTestCase): request_factory = AsyncRequestFactory() async def test_request_factory(self): async def async_generic_view(request): return HttpResponse(status=200, content=request.body) request = self.request_factory.post('/somewhere/', data={'example': 'data'}, content_type="application/json") response = await async_generic_view(request) self.assertEqual(response.status_code, 200) self.assertEqual(response.content, b'{"example": "data"}')
Also I did a patch for this which seems to work: https://github.com/django/django/pull/13632