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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy