aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorTom Christie2013-03-12 13:40:48 -0700
committerTom Christie2013-03-12 13:40:48 -0700
commit716d86863f022e7dd4b9b71ecde1d908f30bdf60 (patch)
treef211c53e772bdfebf979cf4a1c8162849feb01f8 /rest_framework
parent043d748b539a6f5b4cfdf6de650b072541f1c6da (diff)
parent2bcb8ff12c967e71fb4871a9ac9e72395394d291 (diff)
downloaddjango-rest-framework-716d86863f022e7dd4b9b71ecde1d908f30bdf60.tar.bz2
Merge pull request #695 from kuhnza/master
Support for X-HTTP-Method-Override Header
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):