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 patrick)

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

Change History (1)

comment:1 by patrick, 4 years ago

Description: modified (diff)
Note: See TracTickets for help on using tickets.
Back to Top