#35414: Issue with AsyncClient ignoring default headers compared to synchronous
Client
-------------------------------------+-------------------------------------
Reporter: 설원준(Wonjoon | Owner: nobody
Seol)/Dispatch squad |
Type: Bug | Status: closed
Component: HTTP handling | Version: 5.0
Severity: Normal | Resolution: invalid
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
-------------------------------------+-------------------------------------
Comment (by 설원준(Wonjoon Seol)/Dispatch squad):
Hi Mariusz,
Thanks for the documentation link. So the async client intended behaviour
is inconsistent with the sync counterpart.
But I should've mentioned in my original post that the headers field does
not work neither.
Because converting the above example test using headers argument still
fails.
{{{
class EXAMPLE_TESTS(TestCase):
async def test_should_return_ok( # FAILS
self,
) -> None:
async_client = AsyncClient(headers={"HTTP_AUTHORIZATION": f"Bearer
I_AM_JWT_TOKEN"})
response = await async_client.get(
reverse("index"),
)
self.assertEqual(response.status_code, HTTPStatus.OK)
async def test_should_return_ok2( # Passes
self,
) -> None:
async_client = AsyncClient()
response = await async_client.get(
reverse("index"),
AUTHORIZATION=f"Bearer I_AM_JWT_TOKEN"
)
self.assertEqual(response.status_code, HTTPStatus.OK)
}}}
The reason is still due the the original post.
{{{
def _base_scope(self, **request):
"""The base scope for a request."""
# This is a minimal valid ASGI scope, plus:
# - headers['cookie'] for cookie support,
# - 'client' often useful, see #8551.
scope = {
"asgi": {"version": "3.0"},
"type": "http",
"http_version": "1.1",
"client": ["127.0.0.1", 0],
"server": ("testserver", "80"),
"scheme": "http",
"method": "GET",
"headers": [], # <- scope ignores default header
**self.defaults,
**request,
}
scope["headers"].append(
(
b"cookie",
b"; ".join(
sorted(
("%s=%s" % (morsel.key,
morsel.coded_value)).encode("ascii")
for morsel in self.cookies.values()
)
),
)
)
return scope
}}}
the scope only takes in default argument but ignores default header.
Using the example test, this is the constructed META header after the
initialization.
The default headers are still missing:
{{{
{'REQUEST_METHOD': 'GET', 'QUERY_STRING': '', 'SCRIPT_NAME': '',
'PATH_INFO': '/polls/', 'wsgi.multithread': True, 'wsgi.multiprocess':
True, 'REMOTE_ADDR': '127.0.0.1', 'REMOTE_HOST': '127.0.0.1',
'REMOTE_PORT': 0, 'SERVER_NAME': '127.0.0.1', 'SERVER_PORT': '80',
'HTTP_HOST': 'testserver', 'HTTP_COOKIE': ''}
}}}
Thanks.
--
Ticket URL: <https://code.djangoproject.com/ticket/35414#comment:9>
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/0107018f468dded2-194cd961-0ee4-4a2f-aa4e-ec09c91c3c14-000000%40eu-central-1.amazonses.com.