From a79c0ee57af25ab176e34ae7ceb27a1c0262ae5d Mon Sep 17 00:00:00 2001 From: Jakub Stasiak Date: Sun, 24 Jan 2016 09:43:51 +0100 Subject: [PATCH] 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] bc4d1b5d362e5baaeded35b1e339b9db08172dd2 --- eventlet/greenio/base.py | 4 ++-- tests/greenio_test.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/eventlet/greenio/base.py b/eventlet/greenio/base.py index 634304a..5f0108c 100644 --- a/eventlet/greenio/base.py +++ b/eventlet/greenio/base.py @@ -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) diff --git a/tests/greenio_test.py b/tests/greenio_test.py index 7b0ff7c..5eb4a90 100644 --- a/tests/greenio_test.py +++ b/tests/greenio_test.py @@ -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):