greenio: Fix "TypeError: an integer is required" in sendto()

The sendto() interface as defined in Python documentation:

    socket.sendto(string, address)
    socket.sendto(string, flags, address)

I didn't catch the fact that [1] broke this, this patch fixes it and add
a sendto/recvfrom test to make sure it doesn't happen again (turns out
we didn't have any).

GitHub issue: https://github.com/eventlet/eventlet/issues/290

Fixes: bc4d1b5 - gh-274: Handle blocking I/O errors in GreenSocket

[1] bc4d1b5d36
This commit is contained in:
Jakub Stasiak
2016-01-24 09:43:51 +01:00
parent 2865c23837
commit a79c0ee57a
2 changed files with 17 additions and 2 deletions

View File

@@ -376,8 +376,8 @@ class GreenSocket(object):
def send(self, data, flags=0):
return self._send_loop(self.fd.send, data, flags)
def sendto(self, data, address, flags=0):
return self._send_loop(self.fd.sendto, data, address, flags)
def sendto(self, data, *args):
return self._send_loop(self.fd.sendto, data, *args)
def sendall(self, data, flags=0):
tail = self.send(data, flags)

View File

@@ -593,6 +593,21 @@ class TestGreenSocket(tests.LimitedTestCase):
# should not raise
greenio.shutdown_safe(sock)
def test_datagram_socket_operations_work(self):
receiver = greenio.GreenSocket(socket.AF_INET, socket.SOCK_DGRAM)
receiver.bind(('127.0.0.1', 0))
address = receiver.getsockname()
sender = greenio.GreenSocket(socket.AF_INET, socket.SOCK_DGRAM)
# Two ways sendto can be called
sender.sendto(b'first', address)
sender.sendto(b'second', 0, address)
sender_address = ('127.0.0.1', sender.getsockname()[1])
eq_(receiver.recvfrom(1024), (b'first', sender_address))
eq_(receiver.recvfrom(1024), (b'second', sender_address))
def test_get_fileno_of_a_socket_works():
class DummySocket(object):