Skip to content

Commit 93b700f

Browse files
committed
Merge pull request #364 from KeepSafe/req_content
Add web.Request.has_body property
2 parents d83dac2 + 7f285b5 commit 93b700f

File tree

3 files changed

+50
-0
lines changed

3 files changed

+50
-0
lines changed

aiohttp/web_reqrep.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ def __init__(self, app, message, payload, transport, reader, writer, *,
108108
self._cookies = None
109109

110110
self._read_bytes = None
111+
self._has_body = not payload.at_eof()
111112

112113
@property
113114
def method(self):
@@ -224,6 +225,11 @@ def content(self):
224225
"""Return raw payload stream."""
225226
return self._payload
226227

228+
@property
229+
def has_body(self):
230+
"""Return True if request has HTTP BODY, False otherwise."""
231+
return self._has_body
232+
227233
@asyncio.coroutine
228234
def release(self):
229235
"""Release request.

docs/web_reference.rst

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,14 @@ first positional parameter.
139139

140140
.. versionadded:: 0.15
141141

142+
.. attribute:: has_body
143+
144+
Return ``True`` if request has no *HTTP BODY*, ``False`` otherwise.
145+
146+
Read-only :class:`bool` property.
147+
148+
.. versionadded:: 0.16
149+
142150
.. attribute:: payload
143151

144152
A :class:`~aiohttp.streams.FlowControlStreamReader` instance,

tests/test_web_functional.py

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -662,3 +662,39 @@ def go():
662662
f.close()
663663

664664
self.loop.run_until_complete(go())
665+
666+
def test_empty_content_for_query_without_body(self):
667+
668+
@asyncio.coroutine
669+
def handler(request):
670+
self.assertFalse(request.has_body)
671+
return web.Response(body=b'OK')
672+
673+
@asyncio.coroutine
674+
def go():
675+
_, srv, url = yield from self.create_server('GET', '/', handler)
676+
resp = yield from request('GET', url, loop=self.loop)
677+
self.assertEqual(200, resp.status)
678+
txt = yield from resp.text()
679+
self.assertEqual('OK', txt)
680+
681+
self.loop.run_until_complete(go())
682+
683+
def test_empty_content_for_query_with_body(self):
684+
685+
@asyncio.coroutine
686+
def handler(request):
687+
self.assertTrue(request.has_body)
688+
body = yield from request.read()
689+
return web.Response(body=body)
690+
691+
@asyncio.coroutine
692+
def go():
693+
_, srv, url = yield from self.create_server('POST', '/', handler)
694+
resp = yield from request('POST', url, data=b'data',
695+
loop=self.loop)
696+
self.assertEqual(200, resp.status)
697+
txt = yield from resp.text()
698+
self.assertEqual('data', txt)
699+
700+
self.loop.run_until_complete(go())

0 commit comments

Comments
 (0)