Skip to content

Commit

Permalink
Fix empty ALLOW Response header for cls based View (#929)
Browse files Browse the repository at this point in the history
We must check existing lower http method names for assembing
ALLOW header and passing into web.HTTPMethodNotAllowed.
singulared authored and asvetlov committed Jul 7, 2016
1 parent b68420b commit f90f988
Showing 2 changed files with 6 additions and 1 deletion.
3 changes: 2 additions & 1 deletion aiohttp/web_urldispatcher.py
Original file line number Diff line number Diff line change
@@ -655,7 +655,8 @@ def __await__(self):
return (yield from self.__iter__())

def _raise_allowed_methods(self):
allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m)}
allowed_methods = {
m for m in hdrs.METH_ALL if hasattr(self, m.lower())}
raise HTTPMethodNotAllowed(self.request.method, allowed_methods)


4 changes: 4 additions & 0 deletions tests/test_classbasedview.py
Original file line number Diff line number Diff line change
@@ -34,11 +34,13 @@ class MyView(View):
@asyncio.coroutine
def get(self):
return web.Response(text='OK')
options = get

request = mock.Mock()
request.method = 'UNKNOWN'
with pytest.raises(web.HTTPMethodNotAllowed) as ctx:
yield from MyView(request)
assert ctx.value.headers['allow'] == 'GET,OPTIONS'
assert ctx.value.status == 405


@@ -49,9 +51,11 @@ class MyView(View):
@asyncio.coroutine
def get(self):
return web.Response(text='OK')
options = delete = get

request = mock.Mock()
request.method = 'POST'
with pytest.raises(web.HTTPMethodNotAllowed) as ctx:
yield from MyView(request)
assert ctx.value.headers['allow'] == 'DELETE,GET,OPTIONS'
assert ctx.value.status == 405

0 comments on commit f90f988

Please sign in to comment.