Skip to content

Commit

Permalink
greenio: _recv_loop behaviour with recv_into on closed sock
Browse files Browse the repository at this point in the history
make sure `_recv_loop` returns the correct value when `recv_meth` is of
foo_into type (fills a buffer and returns number of bytes, not the data)

#353
nameko/nameko#368
  • Loading branch information
davidszotten authored and temoto committed Oct 27, 2016
1 parent 7343f2e commit fc0e96f
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 6 deletions.
12 changes: 6 additions & 6 deletions eventlet/greenio/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,7 @@ def _read_trampoline(self):
timeout=self.gettimeout(),
timeout_exc=socket.timeout("timed out"))

def _recv_loop(self, recv_meth, *args):
def _recv_loop(self, recv_meth, empty_val, *args):
fd = self.fd
if self.act_non_blocking:
return recv_meth(*args)
Expand All @@ -340,7 +340,7 @@ def _recv_loop(self, recv_meth, *args):
if get_errno(e) in SOCKET_BLOCKING:
pass
elif get_errno(e) in SOCKET_CLOSED:
return b''
return empty_val
else:
raise

Expand All @@ -351,16 +351,16 @@ def _recv_loop(self, recv_meth, *args):
raise EOFError()

def recv(self, bufsize, flags=0):
return self._recv_loop(self.fd.recv, bufsize, flags)
return self._recv_loop(self.fd.recv, b'', bufsize, flags)

def recvfrom(self, bufsize, flags=0):
return self._recv_loop(self.fd.recvfrom, bufsize, flags)
return self._recv_loop(self.fd.recvfrom, b'', bufsize, flags)

def recv_into(self, buffer, nbytes=0, flags=0):
return self._recv_loop(self.fd.recv_into, buffer, nbytes, flags)
return self._recv_loop(self.fd.recv_into, 0, buffer, nbytes, flags)

def recvfrom_into(self, buffer, nbytes=0, flags=0):
return self._recv_loop(self.fd.recvfrom_into, buffer, nbytes, flags)
return self._recv_loop(self.fd.recvfrom_into, 0, buffer, nbytes, flags)

def _send_loop(self, send_method, data, *args):
if self.act_non_blocking:
Expand Down
22 changes: 22 additions & 0 deletions tests/socket_test.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import array
import os
import shutil
import sys
Expand Down Expand Up @@ -37,6 +38,27 @@ def server():
assert isinstance(s, bytes)


def test_recv_into_type():
# make sure `_recv_loop` returns the correct value when `recv_meth` is of
# foo_into type (fills a buffer and returns number of bytes, not the data)
# Using threads like `test_recv_type` above.
threading = eventlet.patcher.original('threading')
addr = []

def server():
sock = eventlet.listen(('127.0.0.1', 0))
addr[:] = sock.getsockname()
eventlet.sleep(0.2)

server_thread = threading.Thread(target=server)
server_thread.start()
eventlet.sleep(0.1)
sock = eventlet.connect(tuple(addr))
buf = array.array('B', b' ')
res = sock.recv_into(buf, 1)
assert isinstance(res, int)


def test_dns_methods_are_green():
assert socket.gethostbyname is greendns.gethostbyname
assert socket.gethostbyname_ex is greendns.gethostbyname_ex
Expand Down

0 comments on commit fc0e96f

Please sign in to comment.