[3.1.x] Fixed #32159 -- Ensured AsyncRequestFactory correctly sets headers.

Backport of ebb08d1942 from master
This commit is contained in:
Carlton Gibson 2020-11-04 11:07:15 +01:00 committed by Carlton Gibson
parent bb74d2db98
commit 8b3010a298
4 changed files with 36 additions and 3 deletions

View File

@ -541,7 +541,13 @@ class AsyncRequestFactory(RequestFactory):
(b'content-type', content_type.encode('ascii')),
])
s['_body_file'] = FakePayload(data)
s.update(extra)
follow = extra.pop('follow', None)
if follow is not None:
s['follow'] = follow
s['headers'] += [
(key.lower().encode('ascii'), value.encode('latin1'))
for key, value in extra.items()
]
# If QUERY_STRING is absent or empty, we want to extract it from the
# URL.
if not s.get('query_string'):

View File

@ -11,3 +11,6 @@ Bugfixes
* Fixed setting the ``Content-Length`` HTTP header in ``AsyncRequestFactory``
(:ticket:`32162`).
* Fixed passing extra HTTP headers to ``AsyncRequestFactory`` request methods
(:ticket:`32159`).

View File

@ -1778,9 +1778,22 @@ If you are testing from an asynchronous function, you must also use the
asynchronous test client. This is available as ``django.test.AsyncClient``,
or as ``self.async_client`` on any test.
With the exception of the ``follow`` parameter, which is not supported,
``AsyncClient`` has the same methods and signatures as the synchronous (normal)
test client, but any method that makes a request must be awaited::
test client, with two exceptions:
* The ``follow`` parameter is not supported.
* Headers passed as ``extra`` keyword arguments should not have the ``HTTP_``
prefix required by the synchronous client (see :meth:`Client.get`). For
example, here is how to set an HTTP ``Accept`` header::
>>> c = AsyncClient()
>>> c.get(
... '/customers/details/',
... {'name': 'fred', 'age': 7},
... ACCEPT='application/json'
... )
Using ``AsyncClient`` any method that makes a request must be awaited::
async def test_my_thing(self):
response = await self.async_client.get('/some-url/')

View File

@ -988,3 +988,14 @@ class AsyncRequestFactoryTest(SimpleTestCase):
response = await async_generic_view(request)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.content, b'{"example": "data"}')
def test_request_factory_sets_headers(self):
request = self.request_factory.get(
'/somewhere/',
AUTHORIZATION='Bearer faketoken',
X_ANOTHER_HEADER='some other value',
)
self.assertEqual(request.headers['authorization'], 'Bearer faketoken')
self.assertIn('HTTP_AUTHORIZATION', request.META)
self.assertEqual(request.headers['x-another-header'], 'some other value')
self.assertIn('HTTP_X_ANOTHER_HEADER', request.META)