Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support HTTP PATCH method #106

Merged
merged 3 commits into from Aug 10, 2013
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 22 additions & 0 deletions tests/test_request.py
Expand Up @@ -618,6 +618,10 @@ def test_is_body_readable_POST(self):
req = self._blankOne('/', environ={'REQUEST_METHOD':'POST'})
self.assertTrue(req.is_body_readable)

def test_is_body_readable_PATCH(self):
req = self._blankOne('/', environ={'REQUEST_METHOD':'PATCH'})
self.assertTrue(req.is_body_readable)

def test_is_body_readable_GET(self):
req = self._blankOne('/', environ={'REQUEST_METHOD':'GET'})
self.assertFalse(req.is_body_readable)
Expand Down Expand Up @@ -3193,6 +3197,24 @@ def test_request_put(self):
# Not OK, should return 412 Precondition Failed:
self.assertTrue(not server_token in req.if_match)

def test_request_patch(self):
from webob.multidict import MultiDict
from webob.multidict import GetDict
req = self._blankOne('/test?check=a&check=b&name=Bob')
req.method = 'PATCH'
req.body = b'var1=value1&var2=value2&rep=1&rep=2'
req.environ['CONTENT_LENGTH'] = str(len(req.body))
req.environ['CONTENT_TYPE'] = 'application/x-www-form-urlencoded'
GET = GetDict([('check', 'a'),
('check', 'b'),
('name', 'Bob')], {})
self.assertEqual(req.GET, GET)
self.assertEqual(req.POST, MultiDict(
[('var1', 'value1'),
('var2', 'value2'),
('rep', '1'),
('rep', '2')]))

def test_call_WSGI_app(self):
req = self._blankOne('/')
def wsgi_app(environ, start_response):
Expand Down
8 changes: 4 additions & 4 deletions webob/request.py
Expand Up @@ -92,7 +92,7 @@ def __repr__(self):
http_method_probably_has_body = dict.fromkeys(
('GET', 'HEAD', 'DELETE', 'TRACE'), False)
http_method_probably_has_body.update(
dict.fromkeys(('POST', 'PUT'), True))
dict.fromkeys(('POST', 'PUT', 'PATCH'), True))

_LATIN_ENCODINGS = (
'ascii', 'latin-1', 'latin', 'latin_1', 'l1', 'latin1',
Expand Down Expand Up @@ -740,11 +740,11 @@ def POST(self):
Return a MultiDict containing all the variables from a form
request. Returns an empty dict-like object for non-form requests.

Form requests are typically POST requests, however PUT requests with
an appropriate Content-Type are also supported.
Form requests are typically POST requests, however PUT & PATCH requests
with an appropriate Content-Type are also supported.
"""
env = self.environ
if self.method not in ('POST', 'PUT'):
if self.method not in ('POST', 'PUT', 'PATCH'):
return NoVars('Not a form request')
if 'webob._parsed_post_vars' in env:
vars, body_file = env['webob._parsed_post_vars']
Expand Down