[Jython-checkins] jython: More socket decorator consolidation

alan.kennedy jython-checkins at python.org
Mon Feb 25 10:08:18 CET 2013


http://hg.python.org/jython/rev/3af5f760f5ea
changeset:   7063:3af5f760f5ea
user:        Alan Kennedy <alan at xhaus.com>
date:        Mon Feb 25 08:55:54 2013 +0000
summary:
  More socket decorator consolidation

files:
  Lib/socket.py |  54 ++++++++++++--------------------------
  1 files changed, 17 insertions(+), 37 deletions(-)


diff --git a/Lib/socket.py b/Lib/socket.py
--- a/Lib/socket.py
+++ b/Lib/socket.py
@@ -162,26 +162,24 @@
 from functools import wraps
 
 # Used to map java exceptions to the equivalent python exception
+# And to set the _last_error attribute on socket objects, to support SO_ERROR
 def raises_java_exception(method_or_function):
     @wraps(method_or_function)
-    def map_exception(*args, **kwargs):
+    def handle_exception(*args, **kwargs):
+        is_socket = (len(args) > 0 and isinstance(args[0], _nonblocking_api_mixin))
         try:
-            return method_or_function(*args, **kwargs)
-        except java.lang.Exception, jlx:
-            raise _map_exception(jlx)
-    return map_exception
-
-# Used for SO_ERROR support.
-def raises_error(method):
-    @wraps(method)
-    def set_last_error(obj, *args, **kwargs):
-        try:
-            setattr(obj, '_last_error', 0)
-            return method(obj, *args, **kwargs)
+            try:
+                return method_or_function(*args, **kwargs)
+            except java.lang.Exception, jlx:
+                raise _map_exception(jlx)
         except error, e:
-            setattr(obj, '_last_error', e[0])
+            if is_socket:
+                setattr(args[0], '_last_error', e[0])
             raise
-    return set_last_error
+        else:
+            if is_socket:
+                setattr(args[0], '_last_error', 0)
+    return handle_exception
 
 _feature_support_map = {
     'ipv6': True,
@@ -695,6 +693,7 @@
         addrs.append(asPyString(addr.getHostAddress()))
     return (names, addrs)
 
+ at raises_java_exception
 def getfqdn(name=None):
     """
     Return a fully qualified domain name for name. If name is omitted or empty
@@ -1145,7 +1144,6 @@
     def getblocking(self):
         return self.mode == MODE_BLOCKING
 
-    @raises_error
     @raises_java_exception
     def setsockopt(self, level, optname, value):
         if self.sock_impl:
@@ -1168,7 +1166,6 @@
         else:
             return self.pending_options.get( (level, optname), None)
 
-    @raises_error
     @raises_java_exception
     def shutdown(self, how):
         assert how in (SHUT_RD, SHUT_WR, SHUT_RDWR)
@@ -1176,13 +1173,11 @@
             raise error(errno.ENOTCONN, "Transport endpoint is not connected")
         self.sock_impl.shutdown(how)
 
-    @raises_error
     @raises_java_exception
     def close(self):
         if self.sock_impl:
             self.sock_impl.close()
 
-    @raises_error
     @raises_java_exception
     def getsockname(self):
         if self.sock_impl is None:
@@ -1194,7 +1189,6 @@
             raise error(errno.EINVAL, "Invalid argument")
         return self.sock_impl.getsockname()
 
-    @raises_error
     @raises_java_exception
     def getpeername(self):
         if self.sock_impl is None:
@@ -1239,7 +1233,6 @@
             return self.server
         return _nonblocking_api_mixin.getsockopt(self, level, optname)
 
-    @raises_error
     @raises_java_exception
     def bind(self, addr):
         assert not self.sock_impl
@@ -1248,7 +1241,6 @@
         _get_jsockaddr(addr, self.family, self.type, self.proto, AI_PASSIVE)
         self.local_addr = addr
 
-    @raises_error
     @raises_java_exception
     def listen(self, backlog):
         "This signifies a server socket"
@@ -1258,7 +1250,6 @@
                               backlog, self.pending_options[ (SOL_SOCKET, SO_REUSEADDR) ])
         self._config()
 
-    @raises_error
     @raises_java_exception
     def accept(self):
         "This signifies a server socket"
@@ -1283,14 +1274,12 @@
         self._config() # Configure timeouts, etc, now that the socket exists
         self.sock_impl.connect(_get_jsockaddr(addr, self.family, self.type, self.proto, 0))
 
-    @raises_error
     @raises_java_exception
     def connect(self, addr):
         "This signifies a client socket"
         self._do_connect(addr)
         self._setup()
 
-    @raises_error
     @raises_java_exception
     def connect_ex(self, addr):
         "This signifies a client socket"
@@ -1308,7 +1297,6 @@
             self.istream = self.sock_impl.jsocket.getInputStream()
             self.ostream = self.sock_impl.jsocket.getOutputStream()
 
-    @raises_error
     @raises_java_exception
     def recv(self, n):
         if not self.sock_impl: raise error(errno.ENOTCONN, 'Socket is not connected')
@@ -1326,12 +1314,10 @@
             data = data[:m]
         return data.tostring()
 
-    @raises_error
     @raises_java_exception
     def recvfrom(self, n):
-        return self.recv(n), None
+        return self.recv(n), self.getpeername()
 
-    @raises_error
     @raises_java_exception
     def send(self, s):
         if not self.sock_impl: raise error(errno.ENOTCONN, 'Socket is not connected')
@@ -1344,7 +1330,6 @@
 
     sendall = send
 
-    @raises_error
     @raises_java_exception
     def close(self):
         if self.istream:
@@ -1365,7 +1350,6 @@
     def __init__(self):
         _nonblocking_api_mixin.__init__(self)
 
-    @raises_error
     @raises_java_exception
     def bind(self, addr):
         assert not self.sock_impl
@@ -1385,19 +1369,16 @@
         self.sock_impl.connect(_get_jsockaddr(addr, self.family, self.type, self.proto, 0))
         self.connected = True
 
-    @raises_error
     @raises_java_exception
     def connect(self, addr):
         self._do_connect(addr)
 
-    @raises_error
     @raises_java_exception
     def connect_ex(self, addr):
         if not self.sock_impl:
             self._do_connect(addr)
         return 0
 
-    @raises_error
     @raises_java_exception
     def sendto(self, data, p1, p2=None):
         if not p2:
@@ -1417,7 +1398,6 @@
         byte_array = java.lang.String(data).getBytes('iso-8859-1')
         return self.sock_impl.send(byte_array, flags)
 
-    @raises_error
     @raises_java_exception
     def recvfrom(self, num_bytes, flags=None):
         """
@@ -1437,7 +1417,6 @@
             self._config()
         return self.sock_impl.recvfrom(num_bytes, flags)
 
-    @raises_error
     @raises_java_exception
     def recv(self, num_bytes, flags=None):
         if not self.sock_impl:
@@ -1878,14 +1857,15 @@
         self._out_buf.flush()
         return len(s)
 
-    @raises_java_exception
     def _get_server_cert(self):
         return self.java_ssl_socket.getSession().getPeerCertificates()[0]
 
+    @raises_java_exception
     def server(self):
         cert = self._get_server_cert()
         return cert.getSubjectDN().toString()
 
+    @raises_java_exception
     def issuer(self):
         cert = self._get_server_cert()
         return cert.getIssuerDN().toString()

-- 
Repository URL: http://hg.python.org/jython


More information about the Jython-checkins mailing list