From: <am...@us...> - 2007-05-18 21:01:53
|
Revision: 3233 http://svn.sourceforge.net/jython/?rev=3233&view=rev Author: amak Date: 2007-05-18 14:01:52 -0700 (Fri, 18 May 2007) Log Message: ----------- Checked in 1. A fix for [ 1169499 ] bind values not used by connect in socket.py for tcp 2. A new unittest for above bug. Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/socket.py trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-18 00:30:12 UTC (rev 3232) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-18 21:01:52 UTC (rev 3233) @@ -140,6 +140,9 @@ self.port = None self.jsocket = self.jchannel.socket() + def bind(self, host, port): + self.jsocket.bind(java.net.InetSocketAddress(host, port)) + def connect(self, host, port): self.host = host self.port = port @@ -188,10 +191,10 @@ self.jsocket = self.jchannel.socket() if port: if address is not None: - bind_address = java.net.InetSocketAddress(address, port) + local_address = java.net.InetSocketAddress(address, port) else: - bind_address = java.net.InetSocketAddress(port) - self.jsocket.bind(bind_address) + local_address = java.net.InetSocketAddress(port) + self.jsocket.bind(local_address) self._setreuseaddress(reuse_addr) def connect(self, host, port): @@ -375,7 +378,7 @@ sock_impl = None istream = None ostream = None - addr = None + local_addr = None server = 0 file_count = 0 #reuse_addr = 1 @@ -383,18 +386,18 @@ def bind(self, addr): assert not self.sock_impl - assert not self.addr + assert not self.local_addr # Do the address format check host, port = _unpack_address_tuple(addr) - self.addr = addr + self.local_addr = addr def listen(self, backlog=50): "This signifies a server socket" try: assert not self.sock_impl self.server = 1 - if self.addr: - host, port = self.addr + if self.local_addr: + host, port = self.local_addr else: host, port = "", 0 self.sock_impl = _server_socket_impl(host, port, backlog, self.reuse_addr) @@ -429,22 +432,25 @@ host = java.net.InetAddress.getLocalHost() return host, port - def connect(self, addr): - "This signifies a client socket" + def _do_connect(self, addr): assert not self.sock_impl host, port = self._get_host_port(addr) self.sock_impl = _client_socket_impl() + if self.local_addr: # Has the socket been bound to a local address? + bind_host, bind_port = self.local_addr + self.sock_impl.bind(bind_host, bind_port) self._config() # Configure timeouts, etc, now that the socket exists self.sock_impl.connect(host, port) self._setup(self.sock_impl) + def connect(self, addr): + "This signifies a client socket" + self._do_connect(addr) + self._setup(self.sock_impl) + def connect_ex(self, addr): "This signifies a client socket" - assert not self.sock_impl - host, port = self._get_host_port(addr) - self.sock_impl = _client_socket_impl() - self._config() # Configure timeouts, etc, now that the socket exists - self.sock_impl.connect(host, port) + self._do_connect(addr) if self.sock_impl.finish_connect(): self._setup(self.sock_impl) return 0 @@ -489,7 +495,7 @@ def getsockname(self): if not self.sock_impl: - host, port = self.addr or ("", 0) + host, port = self.local_addr or ("", 0) host = java.net.InetAddress.getByName(host).getHostAddress() else: if self.server: @@ -698,7 +704,7 @@ if not self.sock_impl: return sock = self.sock_impl - self.sock_impl = 0 + self.sock_impl = None sock.close() def setsockopt(self, level, optname, value): Modified: trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-18 00:30:12 UTC (rev 3232) +++ trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-18 21:01:52 UTC (rev 3233) @@ -1,5 +1,8 @@ from __future__ import nested_scopes +import sys +sys.path.append("x:\\xhaus\\jython_trunk\\sandbox\\kennedya\\asynch_sockets") + """ AMAK: 20050515: This module is the test_socket.py from cpython 2.4, ported to jython. """ @@ -660,11 +663,11 @@ # Make a connection to the server self.cli.connect((HOST, PORT)) - # - # AMAK: 20070311 - # Introduced a new test for non-blocking connect - # Renamed old testConnect to testBlockingConnect - # + # + # AMAK: 20070311 + # Introduced a new test for non-blocking connect + # Renamed old testConnect to testBlockingConnect + # def testBlockingConnect(self): # Testing blocking connect @@ -690,6 +693,23 @@ except socket.error: self.fail("Sending on connected socket should not have raised socket.error") + # + # AMAK: 20070518 + # Introduced a new test for connect with bind to specific local address + # + + def testConnectWithLocalBind(self): + # Test blocking connect + conn, addr = self.serv.accept() + + def _testConnectWithLocalBind(self): + # Testing blocking connect with local bind + self.cli.settimeout(10) + self.cli.bind( (HOST, PORT-1) ) + self.cli.connect((HOST, PORT)) + bound_host, bound_port = self.cli.getsockname() + self.failUnlessEqual(bound_port, PORT-1) + def testRecvData(self): # Testing non-blocking recv conn, addr = self.serv.accept() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2007-05-18 21:55:13
|
Revision: 3234 http://svn.sourceforge.net/jython/?rev=3234&view=rev Author: amak Date: 2007-05-18 14:55:12 -0700 (Fri, 18 May 2007) Log Message: ----------- 1. Tidied up java imports so that all required java classes and exceptions are explicitly imported, instead of just their packages. 2. Removed a hard coded path that I was using for testing, and inadvertently left in place. Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/socket.py trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-18 21:01:52 UTC (rev 3233) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-18 21:55:12 UTC (rev 3234) @@ -19,15 +19,23 @@ import threading import time import types - -import java.nio -import java.net import org.python.core import jarray import string import sys -from java.lang import InterruptedException +import java.io.InterruptedIOException +import java.lang.Exception +import java.net.BindException +import java.net.DatagramPacket +import java.net.InetAddress +import java.net.InetSocketAddress +import java.net.SocketTimeoutException +import java.nio.ByteBuffer +import java.nio.channels.DatagramChannel +import java.nio.channels.IllegalBlockingModeException +import java.nio.channels.ServerSocketChannel +import java.nio.channels.SocketChannel class error(Exception): pass class herror(error): pass Modified: trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-18 21:01:52 UTC (rev 3233) +++ trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-18 21:55:12 UTC (rev 3234) @@ -1,8 +1,5 @@ from __future__ import nested_scopes -import sys -sys.path.append("x:\\xhaus\\jython_trunk\\sandbox\\kennedya\\asynch_sockets") - """ AMAK: 20050515: This module is the test_socket.py from cpython 2.4, ported to jython. """ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2007-05-22 17:46:42
|
Revision: 3237 http://svn.sourceforge.net/jython/?rev=3237&view=rev Author: amak Date: 2007-05-22 10:46:39 -0700 (Tue, 22 May 2007) Log Message: ----------- Fix for bug [ 1722306 ] OverflowError in UDP Socket Implementation Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/socket.py trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-20 06:36:55 UTC (rev 3236) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-22 17:46:39 UTC (rev 3237) @@ -653,7 +653,7 @@ if not self.sock_impl: self.sock_impl = _datagram_socket_impl() host, port = addr - bytes = jarray.array(map(ord, data), 'b') + bytes = java.lang.String(data).getBytes('iso-8859-1') a = java.net.InetAddress.getByName(host) packet = java.net.DatagramPacket(bytes, n, a, port) self.sock_impl.send(packet) Modified: trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-20 06:36:55 UTC (rev 3236) +++ trunk/sandbox/kennedya/asynch_sockets/test/test_socket.py 2007-05-22 17:46:39 UTC (rev 3237) @@ -18,6 +18,7 @@ PORT = 50007 HOST = 'localhost' MSG = 'Michael Gilfix was here\n' +EIGHT_BIT_MSG = 'Bh\xed Al\xe1in \xd3 Cinn\xe9ide anseo\n' try: True @@ -585,6 +586,14 @@ def _testRecvFrom(self): self.cli.sendto(MSG, 0, (HOST, PORT)) + def testSendtoEightBitSafe(self): + # This test is necessary because java only supports signed bytes + msg = self.serv.recv(len(EIGHT_BIT_MSG)) + self.assertEqual(msg, EIGHT_BIT_MSG) + + def _testSendtoEightBitSafe(self): + self.cli.sendto(EIGHT_BIT_MSG, 0, (HOST, PORT)) + class BasicSocketPairTest(SocketPairTest): def __init__(self, methodName='runTest'): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <otm...@us...> - 2007-05-25 22:47:30
|
Revision: 3242 http://svn.sourceforge.net/jython/?rev=3242&view=rev Author: otmarhumbel Date: 2007-05-25 15:47:29 -0700 (Fri, 25 May 2007) Log Message: ----------- use explicit imports consistently Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/select.py trunk/sandbox/kennedya/asynch_sockets/socket.py Modified: trunk/sandbox/kennedya/asynch_sockets/select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/select.py 2007-05-25 07:53:19 UTC (rev 3241) +++ trunk/sandbox/kennedya/asynch_sockets/select.py 2007-05-25 22:47:29 UTC (rev 3242) @@ -2,7 +2,9 @@ AMAK: 20070515: New select implementation that uses java.nio """ -import java.nio.channels +import java.nio.channels.SelectableChannel +import java.nio.channels.SelectionKey +import java.nio.channels.Selector from java.nio.channels.SelectionKey import OP_ACCEPT, OP_CONNECT, OP_WRITE, OP_READ class error(Exception): pass Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-25 07:53:19 UTC (rev 3241) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-05-25 22:47:29 UTC (rev 3242) @@ -19,23 +19,28 @@ import threading import time import types -import org.python.core import jarray import string import sys +import java.io.BufferedInputStream +import java.io.BufferedOutputStream import java.io.InterruptedIOException import java.lang.Exception +import java.lang.String import java.net.BindException import java.net.DatagramPacket import java.net.InetAddress import java.net.InetSocketAddress +import java.net.Socket import java.net.SocketTimeoutException import java.nio.ByteBuffer import java.nio.channels.DatagramChannel import java.nio.channels.IllegalBlockingModeException import java.nio.channels.ServerSocketChannel import java.nio.channels.SocketChannel +import javax.net.ssl.SSLSocketFactory +import org.python.core.PyFile class error(Exception): pass class herror(error): pass @@ -730,10 +735,6 @@ # Define the SSL support -from javax.net.ssl import SSLSocketFactory -from java.io import BufferedInputStream -from java.io import BufferedOutputStream - class ssl: def __init__(self, plain_sock, keyfile=None, certfile=None): @@ -744,7 +745,7 @@ assert isinstance(java_net_socket, java.net.Socket) host = java_net_socket.getInetAddress().getHostName() port = java_net_socket.getPort() - factory = SSLSocketFactory.getDefault(); + factory = javax.net.ssl.SSLSocketFactory.getDefault(); ssl_socket = factory.createSocket(java_net_socket, host, port, auto_close) ssl_socket.setEnabledCipherSuites(ssl_socket.getSupportedCipherSuites()) ssl_socket.startHandshake() @@ -752,7 +753,7 @@ def read(self, n=4096): # Probably needs some work on efficency - in_buf = BufferedInputStream(self.ssl_sock.getInputStream()) + in_buf = java.io.BufferedInputStream(self.ssl_sock.getInputStream()) data = jarray.zeros(n, 'b') m = in_buf.read(data, 0, n) if m <= 0: @@ -763,7 +764,7 @@ def write(self, s): # Probably needs some work on efficency - out = BufferedOutputStream(self.ssl_sock.getOutputStream()) + out = java.io.BufferedOutputStream(self.ssl_sock.getOutputStream()) out.write(s) out.flush() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2007-06-17 17:16:12
|
Revision: 3251 http://svn.sourceforge.net/jython/?rev=3251&view=rev Author: amak Date: 2007-06-17 10:16:10 -0700 (Sun, 17 Jun 2007) Log Message: ----------- 1. Added support for selecting on unconnected sockets 2. Added some unit tests for poll objects. Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/select.py trunk/sandbox/kennedya/asynch_sockets/socket.py trunk/sandbox/kennedya/asynch_sockets/test/test_select.py Modified: trunk/sandbox/kennedya/asynch_sockets/select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-07 02:35:42 UTC (rev 3250) +++ trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-17 17:16:10 UTC (rev 3251) @@ -7,6 +7,8 @@ import java.nio.channels.Selector from java.nio.channels.SelectionKey import OP_ACCEPT, OP_CONNECT, OP_WRITE, OP_READ +import socket + class error(Exception): pass POLLIN = 1 @@ -18,19 +20,18 @@ def __init__(self): self.selector = java.nio.channels.Selector.open() self.chanmap = {} + self.unconnected_sockets = [] - def _getselectable(self, userobject): - if isinstance(userobject, java.nio.channels.SelectableChannel): - return userobject - else: - if hasattr(userobject, 'fileno') and callable(getattr(userobject, 'fileno')): - result = getattr(userobject, 'fileno')() - if isinstance(result, java.nio.channels.SelectableChannel): - return result - raise error("Object '%s' is not a watchable channel" % userobject, 10038) + def _getselectable(self, socket_object): + for st in socket.SocketTypes: + if isinstance(socket_object, st): + try: + return socket_object.getchannel() + except: + return None + raise error("Object '%s' is not watchable" % socket_object, 10038) - def register(self, userobject, mask): - channel = self._getselectable(userobject) + def _register_channel(self, socket_object, channel, mask): jmask = 0 if mask & POLLIN: # Note that OP_READ is NOT a valid event on server socket channels. @@ -43,10 +44,29 @@ if channel.validOps() & OP_CONNECT: jmask |= OP_CONNECT selectionkey = channel.register(self.selector, jmask) - self.chanmap[channel] = (userobject, selectionkey) + self.chanmap[channel] = (socket_object, selectionkey) - def unregister(self, userobject): - channel = self._getselectable(userobject) + def _check_unconnected_sockets(self): + temp_list = [] + for socket_object, mask in self.unconnected_sockets: + channel = self._getselectable(socket_object) + if channel is not None: + self._register_channel(socket_object, channel, mask) + else: + temp_list.append( (socket_object, mask) ) + self.unconnected_sockets = temp_list + + def register(self, socket_object, mask): + channel = self._getselectable(socket_object) + if channel is None: + # The socket is not yet connected, and thus has no channel + # Add it to a pending list, and return + self.unconnected_sockets.append( (socket_object, mask) ) + return + self._register_channel(socket_object, channel, mask) + + def unregister(self, socket_object): + channel = self._getselectable(socket_object) self.chanmap[channel][1].cancel() del self.chanmap[channel] @@ -62,6 +82,7 @@ return self.selector.selectedKeys() def poll(self, timeout=None): + self._check_unconnected_sockets() selectedkeys = self._dopoll(timeout) results = [] for k in selectedkeys.iterator(): @@ -72,7 +93,6 @@ if jmask & OP_ACCEPT: pymask |= POLLIN if jmask & OP_CONNECT: pymask |= POLLOUT # Now return the original userobject, and the return event mask - # A python 2.2 generator would be sweet here results.append( (self.chanmap[k.channel()][0], pymask) ) return results Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-06-07 02:35:42 UTC (rev 3250) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-06-17 17:16:10 UTC (rev 3251) @@ -224,7 +224,7 @@ __all__ = [ 'AF_INET', 'SO_REUSEADDR', 'SOCK_DGRAM', 'SOCK_RAW', 'SOCK_RDM', 'SOCK_SEQPACKET', 'SOCK_STREAM', 'SOL_SOCKET', - 'SocketType', 'error', 'herror', 'gaierror', 'timeout', + 'SocketType', 'SocketTypes', 'error', 'herror', 'gaierror', 'timeout', 'getfqdn', 'gethostbyaddr', 'gethostbyname', 'gethostname', 'socket', 'getaddrinfo', 'getdefaulttimeout', 'setdefaulttimeout', 'has_ipv6', 'htons', 'htonl', 'ntohs', 'ntohl', @@ -368,10 +368,11 @@ def getchannel(self): if not self.sock_impl: - raise error("No channel for indeterminate socket") - if hasattr(self.sock_impl, 'getchannel'): - return self.sock_impl.getchannel() - raise error('Operation not implemented on this JVM') + return None + return self.sock_impl.getchannel() +# if hasattr(self.sock_impl, 'getchannel'): +# return self.sock_impl.getchannel() +# raise error('Operation not implemented on this JVM') fileno = getchannel @@ -732,6 +733,7 @@ return None SocketType = _tcpsocket +SocketTypes = [_tcpsocket, _udpsocket] # Define the SSL support Modified: trunk/sandbox/kennedya/asynch_sockets/test/test_select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/test/test_select.py 2007-06-07 02:35:42 UTC (rev 3250) +++ trunk/sandbox/kennedya/asynch_sockets/test/test_select.py 2007-06-17 17:16:10 UTC (rev 3251) @@ -105,10 +105,7 @@ class TestSelectClientSocket(unittest.TestCase): - def testUnopenedSocket(self): - # This one passes on cpython - # But fails on jython, because of the deferred creation of impl sockets - if sys.platform[:4] == 'java': return + def testUnconnectedSocket(self): sockets = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for x in range(5)] for pos in range(2): # OOB not supported on Java args = [[], [], []] @@ -119,6 +116,52 @@ self.failIf(s in rfd) self.failIf(s in wfd) +def check_server_running_on_localhost_port(port_number): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.connect( ('localhost', port_number) ) + s.close() + except: + return 0 + return 1 + +class TestPollClientSocket(unittest.TestCase): + + def testSocketRegisteredBeforeConnected(self): + # You MUST be running a server on port 80 for this one to work + if not check_server_running_on_localhost_port(80): + print "Unable to run testSocketRegisteredBeforeConnected: no server on port 80" + return + sockets = [socket.socket(socket.AF_INET, socket.SOCK_STREAM) for x in range(5)] + timeout = 1 # Can't wait forever + poll_object = select.poll() + for s in sockets: + # Register the sockets before they are connected + poll_object.register(s, select.POLLOUT) + result_list = poll_object.poll(timeout) + result_sockets = [r[0] for r in result_list] + for s in sockets: + self.failIf(s in result_sockets) + # Now connect the sockets, but DO NOT register them again + for s in sockets: + s.setblocking(0) + s.connect( ('localhost', 80) ) + # Now poll again, to see if the poll object has recognised that the sockets are now connected + result_list = poll_object.poll(timeout) + result_sockets = [r[0] for r in result_list] + for s in sockets: + self.failUnless(s in result_sockets) + + def testUnregisterRaisesKeyError(self): + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + poll_object = select.poll() + try: + poll_object.unregister(s) + except KeyError: + pass + else: + self.fail("Unregistering socket that is not registered should have raised KeyError") + class TestPipes(unittest.TestCase): verbose = 1 @@ -154,6 +197,7 @@ tests = [ TestSelectInvalidParameters, TestSelectClientSocket, + TestPollClientSocket, ] if sys.platform[:4] != 'java': tests.append(TestPipes) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2007-06-17 18:33:45
|
Revision: 3252 http://svn.sourceforge.net/jython/?rev=3252&view=rev Author: amak Date: 2007-06-17 11:33:26 -0700 (Sun, 17 Jun 2007) Log Message: ----------- 1. Added declaration of unsupported event types, for cpython code compatibility. 2. Added unit test for same. 3. Corrected treatment of default parameter "mask" on poll.register method. Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/select.py trunk/sandbox/kennedya/asynch_sockets/test/test_select.py Modified: trunk/sandbox/kennedya/asynch_sockets/select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-17 17:16:10 UTC (rev 3251) +++ trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-17 18:33:26 UTC (rev 3252) @@ -15,6 +15,14 @@ POLLOUT = 2 POLLPRI = 4 +# The following event types are completely ignored on jython +# Java does not support them, AFAICT +# They are declared only to support code compatibility with cpython + +POLLERR = 8 +POLLHUP = 16 +POLLNVAL = 32 + class poll: def __init__(self): @@ -56,7 +64,7 @@ temp_list.append( (socket_object, mask) ) self.unconnected_sockets = temp_list - def register(self, socket_object, mask): + def register(self, socket_object, mask = POLLIN|POLLOUT|POLLPRI): channel = self._getselectable(socket_object) if channel is None: # The socket is not yet connected, and thus has no channel Modified: trunk/sandbox/kennedya/asynch_sockets/test/test_select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/test/test_select.py 2007-06-17 17:16:10 UTC (rev 3251) +++ trunk/sandbox/kennedya/asynch_sockets/test/test_select.py 2007-06-17 18:33:26 UTC (rev 3252) @@ -127,6 +127,10 @@ class TestPollClientSocket(unittest.TestCase): + def testEventConstants(self): + for event_name in ['IN', 'OUT', 'PRI', 'ERR', 'HUP', 'NVAL', ]: + self.failUnless(hasattr(select, 'POLL%s' % event_name)) + def testSocketRegisteredBeforeConnected(self): # You MUST be running a server on port 80 for this one to work if not check_server_running_on_localhost_port(80): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <am...@us...> - 2007-06-17 20:17:49
|
Revision: 3253 http://svn.sourceforge.net/jython/?rev=3253&view=rev Author: amak Date: 2007-06-17 13:17:47 -0700 (Sun, 17 Jun 2007) Log Message: ----------- 1. Added some more exception mapping, so that the exception signature is the same as cpython 2. Added some errno constants, until we establish an errno module. Modified Paths: -------------- trunk/sandbox/kennedya/asynch_sockets/select.py trunk/sandbox/kennedya/asynch_sockets/socket.py Modified: trunk/sandbox/kennedya/asynch_sockets/select.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-17 18:33:26 UTC (rev 3252) +++ trunk/sandbox/kennedya/asynch_sockets/select.py 2007-06-17 20:17:47 UTC (rev 3253) @@ -13,12 +13,12 @@ POLLIN = 1 POLLOUT = 2 -POLLPRI = 4 # The following event types are completely ignored on jython # Java does not support them, AFAICT # They are declared only to support code compatibility with cpython +POLLPRI = 4 POLLERR = 8 POLLHUP = 16 POLLNVAL = 32 @@ -126,6 +126,7 @@ timeout = _calcselecttimeoutvalue(timeout) # First create a poll object to do the actual watching. pobj = poll() + already_registered = {} # Check the read list try: # AMAK: Need to remove all this list searching, change to a dictionary? @@ -134,9 +135,10 @@ if fd in write_fd_list: mask |= POLLOUT pobj.register(fd, mask) + already_registered[fd] = 1 # And now the write list for fd in write_fd_list: - if not fd in read_fd_list: # fds in both have already been registered. + if not already_registered.has_key(fd): pobj.register(fd, POLLOUT) results = pobj.poll(timeout) except AttributeError, ax: Modified: trunk/sandbox/kennedya/asynch_sockets/socket.py =================================================================== --- trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-06-17 18:33:26 UTC (rev 3252) +++ trunk/sandbox/kennedya/asynch_sockets/socket.py 2007-06-17 20:17:47 UTC (rev 3253) @@ -29,6 +29,7 @@ import java.lang.Exception import java.lang.String import java.net.BindException +import java.net.ConnectException import java.net.DatagramPacket import java.net.InetAddress import java.net.InetSocketAddress @@ -42,6 +43,13 @@ import javax.net.ssl.SSLSocketFactory import org.python.core.PyFile +# Some errno constants, until we establish a separate errno module. + +ERRNO_EACCESS = 10035 +ERRNO_EWOULDBLOCK = 10035 +ERRNO_EINPROGRESS = 10036 +ERRNO_ECONNREFUSED = 10061 + class error(Exception): pass class herror(error): pass class gaierror(error): pass @@ -53,13 +61,15 @@ # (<javaexception>, <circumstance>) : lambda: <code that raises the python equivalent> -(java.net.BindException, ALL) : lambda exc: error('TODO: find python errno and string'), (java.io.InterruptedIOException, ALL) : lambda exc: timeout('timed out'), +(java.net.BindException, ALL) : lambda exc: error(ERRNO_EACCESS, 'Permission denied'), +(java.net.ConnectException, ALL) : lambda exc: error( (ERRNO_ECONNREFUSED, 'Connection refused') ), (java.net.SocketTimeoutException, ALL) : lambda exc: timeout('timed out'), + } def would_block_error(exc=None): - return error( (10035, 'The socket operation could not complete without blocking') ) + return error( (ERRNO_EWOULDBLOCK, 'The socket operation could not complete without blocking') ) def map_exception(exc, circumstance=ALL): try: @@ -417,7 +427,6 @@ self.sock_impl = _server_socket_impl(host, port, backlog, self.reuse_addr) self._config() except java.lang.Exception, jlx: - raise raise map_exception(jlx) # @@ -447,15 +456,18 @@ return host, port def _do_connect(self, addr): - assert not self.sock_impl - host, port = self._get_host_port(addr) - self.sock_impl = _client_socket_impl() - if self.local_addr: # Has the socket been bound to a local address? - bind_host, bind_port = self.local_addr - self.sock_impl.bind(bind_host, bind_port) - self._config() # Configure timeouts, etc, now that the socket exists - self.sock_impl.connect(host, port) - self._setup(self.sock_impl) + try: + assert not self.sock_impl + host, port = self._get_host_port(addr) + self.sock_impl = _client_socket_impl() + if self.local_addr: # Has the socket been bound to a local address? + bind_host, bind_port = self.local_addr + self.sock_impl.bind(bind_host, bind_port) + self._config() # Configure timeouts, etc, now that the socket exists + self.sock_impl.connect(host, port) + self._setup(self.sock_impl) + except java.lang.Exception, jlx: + raise map_exception(jlx) def connect(self, addr): "This signifies a client socket" @@ -468,7 +480,7 @@ if self.sock_impl.finish_connect(): self._setup(self.sock_impl) return 0 - return 1 + return ERRNO_EINPROGRESS def _setup(self, sock): self.sock_impl = sock This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |