#35414: Issue with AsyncClient ignoring default headers compared to synchronous
Client
-------------------------------------+-------------------------------------
Reporter: 설원준(Wonjoon | Owner: nobody
Seol)/Dispatch squad |
Type: Bug | Status: new
Component: HTTP handling | Version: 5.0
Severity: Normal | Resolution:
Keywords: AsyncClient, | Triage Stage:
ASGIRequest | Unreviewed
Has patch: 0 | Needs documentation: 0
Needs tests: 0 | Patch needs improvement: 0
Easy pickings: 0 | UI/UX: 0
-------------------------------------+-------------------------------------
Changes (by Natalia Bidart):
* cc: Andrew Godwin, Carlton Gibson (added)
Comment:
I've been thinking about this report for a while, and after making some
experiments, I think this is a valid issue. Originally I thought this was
a dupe of #32159 but I don't think that's the case.
What I can't put my finger on is whether there is an issue with the docs,
or if the headers should really be added to the ASGI scope `headers` key
(as the reporter says). The docs shows:
> AsyncClient has the same methods and signatures as the synchronous
(normal) test client, with the following exceptions:
> In the initialization, arbitrary keyword arguments in defaults are added
directly into the ASGI scope.
> Headers passed as extra keyword arguments should not have the HTTP_
prefix required by the synchronous client (see Client.get()). For example,
here is how to set an HTTP Accept header:
To me this implies that the `headers` parameter at class instantiation
time could be use to set parameters to be used in every client operation
(just like with `Client`). But when using the test case provided by the
reporter this is not the case (using a simple Django app with the provided
middleware and a simple view):
{{{#!python
from django.test import TestCase, AsyncClient
class Ticket35414Tests(TestCase):
async def test_should_return_ok(self):
async_client = AsyncClient(headers={"AUTHORIZATION": "A Token"})
response = await async_client.get("/ticket_35414/")
self.assertEqual(response.status_code, 200)
}}}
Failure:
{{{
======================================================================
FAIL: test_should_return_ok
(ticket_35414.tests.Ticket35414Tests.test_should_return_ok)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/nessita/.virtualenvs/djangodev/lib/python3.11/site-
packages/asgiref/sync.py", line 254, in __call__
return call_result.result()
^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/concurrent/futures/_base.py", line 449, in
result
return self.__get_result()
^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in
__get_result
raise self._exception
File "/home/nessita/.virtualenvs/djangodev/lib/python3.11/site-
packages/asgiref/sync.py", line 331, in main_wrap
result = await self.awaitable(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/nessita/fellowship/projectfromrepo/ticket_35414/tests.py",
line 9, in test_should_return_ok
self.assertEqual(response.status_code, 200)
AssertionError: 401 != 200
}}}
Carlton, Andrew, would you have an opinion?
--
Ticket URL: <https://code.djangoproject.com/ticket/35414#comment:11>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
--
You received this message because you are subscribed to the Google Groups
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/django-updates/0107018f5f35c96a-7a3d0435-e4ac-40e6-97d5-cfa254ad43b3-000000%40eu-central-1.amazonses.com.