Skip to content

Commit a91361d

Browse files
Ryan P Kilbycarltongibson
authored andcommitted
Perform type check on passed request argument (#5618)
* Add test for wrapped request instance * Add 'request' argument type check to Request init * Fix metadata tests' request object
1 parent c2c9225 commit a91361d

File tree

3 files changed

+20
-3
lines changed

3 files changed

+20
-3
lines changed

rest_framework/request.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from __future__ import unicode_literals
1212

1313
from django.conf import settings
14-
from django.http import QueryDict
14+
from django.http import HttpRequest, QueryDict
1515
from django.http.multipartparser import parse_header
1616
from django.http.request import RawPostDataException
1717
from django.utils import six
@@ -132,6 +132,12 @@ class Request(object):
132132

133133
def __init__(self, request, parsers=None, authenticators=None,
134134
negotiator=None, parser_context=None):
135+
assert isinstance(request, HttpRequest), (
136+
'The `request` argument must be an instance of '
137+
'`django.http.HttpRequest`, not `{}.{}`.'
138+
.format(request.__class__.__module__, request.__class__.__name__)
139+
)
140+
135141
self._request = request
136142
self.parsers = parsers or ()
137143
self.authenticators = authenticators or ()

tests/test_metadata.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,11 @@
99
exceptions, metadata, serializers, status, versioning, views
1010
)
1111
from rest_framework.renderers import BrowsableAPIRenderer
12-
from rest_framework.request import Request
1312
from rest_framework.test import APIRequestFactory
1413

1514
from .models import BasicModel
1615

17-
request = Request(APIRequestFactory().options('/'))
16+
request = APIRequestFactory().options('/')
1817

1918

2019
class TestMetadata:

tests/test_request.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@
2525
factory = APIRequestFactory()
2626

2727

28+
class TestInitializer(TestCase):
29+
def test_request_type(self):
30+
request = Request(factory.get('/'))
31+
32+
message = (
33+
'The `request` argument must be an instance of '
34+
'`django.http.HttpRequest`, not `rest_framework.request.Request`.'
35+
)
36+
with self.assertRaisesMessage(AssertionError, message):
37+
Request(request)
38+
39+
2840
class PlainTextParser(BaseParser):
2941
media_type = 'text/plain'
3042

0 commit comments

Comments
 (0)