aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/request.py7
-rw-r--r--rest_framework/tests/request.py8
2 files changed, 13 insertions, 2 deletions
diff --git a/rest_framework/request.py b/rest_framework/request.py
index 3e2fbd88..f26d934d 100644
--- a/rest_framework/request.py
+++ b/rest_framework/request.py
@@ -231,10 +231,13 @@ class Request(object):
"""
self._content_type = self.META.get('HTTP_CONTENT_TYPE',
self.META.get('CONTENT_TYPE', ''))
+
self._perform_form_overloading()
- # if the HTTP method was not overloaded, we take the raw HTTP method
if not _hasattr(self, '_method'):
- self._method = self._request.method
+ # Method wasn't overloaded by hidden form element, so look for
+ # method override in header. If not present default to raw HTTP method
+ self._method = self.META.get('HTTP_X_HTTP_METHOD_OVERRIDE',
+ self._request.method)
def _load_stream(self):
"""
diff --git a/rest_framework/tests/request.py b/rest_framework/tests/request.py
index 4892f7a6..97e5af20 100644
--- a/rest_framework/tests/request.py
+++ b/rest_framework/tests/request.py
@@ -58,6 +58,14 @@ class TestMethodOverloading(TestCase):
request = Request(factory.post('/', {api_settings.FORM_METHOD_OVERRIDE: 'DELETE'}))
self.assertEqual(request.method, 'DELETE')
+ def test_x_http_method_override_header(self):
+ """
+ POST requests can also be overloaded to another method by setting
+ the X-HTTP-Method-Override header.
+ """
+ request = Request(factory.post('/', {'foo': 'bar'}, HTTP_X_HTTP_METHOD_OVERRIDE='DELETE'))
+ self.assertEqual(request.method, 'DELETE')
+
class TestContentParsing(TestCase):
def test_standard_behaviour_determines_no_content_GET(self):