[pypy-svn] r30729 - in pypy/dist/pypy/module/_ssl: . test

rhymes at codespeak.net rhymes at codespeak.net
Sat Jul 29 15:08:17 CEST 2006


Author: rhymes
Date: Sat Jul 29 15:08:14 2006
New Revision: 30729

Modified:
   pypy/dist/pypy/module/_ssl/interp_ssl.py
   pypy/dist/pypy/module/_ssl/test/test_ssl.py
Log:
read() is in place. some error handling for tests too.

Modified: pypy/dist/pypy/module/_ssl/interp_ssl.py
==============================================================================
--- pypy/dist/pypy/module/_ssl/interp_ssl.py	(original)
+++ pypy/dist/pypy/module/_ssl/interp_ssl.py	Sat Jul 29 15:08:14 2006
@@ -167,7 +167,10 @@
 libssl.SSL_CTX_free.restype = c_void
 libssl.SSL_write.argtypes = [POINTER(SSL), c_char_p, c_int]
 libssl.SSL_write.restype = c_int
-
+libssl.SSL_pending.argtypes = [POINTER(SSL)]
+libssl.SSL_pending.restype = c_int
+libssl.SSL_read.argtypes = [POINTER(SSL), c_char_p, c_int]
+libssl.SSL_read.restype = c_int
 
 def _init_ssl():
     libssl.SSL_load_error_strings()
@@ -295,6 +298,69 @@
             raise OperationError(space.w_Exception,
                 space.wrap("%s: %d" % (errstr, errval)))
     write.unwrap_spec = ['self', str]
+    
+    def read(self, num_bytes=1024):
+        """read([len]) -> string
+
+        Read up to len bytes from the SSL socket."""
+
+        count = libssl.SSL_pending(self.ssl)
+        if not count:
+            sockstate = check_socket_and_wait_for_timeout(self.space,
+                self.w_socket, False)
+            if sockstate == SOCKET_HAS_TIMED_OUT:
+                raise OperationError(self.space.w_Exception,
+                    self.space.wrap("The read operation timed out"))
+            elif sockstate == SOCKET_TOO_LARGE_FOR_SELECT:
+                raise OperationError(self.space.w_Exception,
+                    self.space.wrap("Underlying socket too large for select()."))
+        
+        buf = create_string_buffer(num_bytes)
+        while True:
+            err = 0
+            
+            count = libssl.SSL_read(self.ssl, buf, num_bytes)
+            err = libssl.SSL_get_error(self.ssl, count)
+        
+            if err == SSL_ERROR_WANT_READ:
+                sockstate = check_socket_and_wait_for_timeout(self.space,
+                    self.w_socket, False)
+            elif err == SSL_ERROR_WANT_WRITE:
+                sockstate = check_socket_and_wait_for_timeout(self.space,
+                    w_socket, True)
+            else:
+                sockstate = SOCKET_OPERATION_OK
+        
+            if sockstate == SOCKET_HAS_TIMED_OUT:
+                raise OperationError(space.w_Exception,
+                    space.wrap("The read operation timed out"))
+            elif sockstate == SOCKET_IS_NONBLOCKING:
+                break
+        
+            if err == SSL_ERROR_WANT_READ or err == SSL_ERROR_WANT_WRITE:
+                continue
+            else:
+                break
+                
+        if count <= 0:
+            errstr, errval = _ssl_seterror(self.space, self, count)
+            raise OperationError(self.space.w_Exception,
+                self.space.wrap("%s: %d" % (errstr, errval)))
+        
+        if count != num_bytes:
+            # resize
+            data = buf.raw
+            assert count >= 0
+            try:
+                new_data = data[0:count]
+            except:
+                raise OperationError(self.space.w_MemoryException,
+                    self.space.wrap("error in resizing of the buffer."))
+            buf = create_string_buffer(count)
+            buf.raw = new_data
+            
+        return self.space.wrap(buf.value)
+    read.unwrap_spec = ['self', int]
 
 
 SSLObject.typedef = TypeDef("SSLObject",
@@ -302,7 +368,9 @@
         unwrap_spec=SSLObject.server.unwrap_spec),
     issuer = interp2app(SSLObject.issuer,
         unwrap_spec=SSLObject.issuer.unwrap_spec),
-    write = interp2app(SSLObject.write, unwrap_spec=SSLObject.write.unwrap_spec)
+    write = interp2app(SSLObject.write,
+        unwrap_spec=SSLObject.write.unwrap_spec),
+    read = interp2app(SSLObject.read, unwrap_spec=SSLObject.read.unwrap_spec)
 )
 
 

Modified: pypy/dist/pypy/module/_ssl/test/test_ssl.py
==============================================================================
--- pypy/dist/pypy/module/_ssl/test/test_ssl.py	(original)
+++ pypy/dist/pypy/module/_ssl/test/test_ssl.py	Sat Jul 29 15:08:14 2006
@@ -51,7 +51,10 @@
         # https://connect.sigen-ca.si/index-en.html
         ADDR = "connect.sigen-ca.si", 443
         s = socket.socket()
-        s.connect(ADDR)
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
         ss = socket.ssl(s)
         s.close()
     
@@ -59,7 +62,10 @@
         import socket
         ADDR = "connect.sigen-ca.si", 443
         s = socket.socket()
-        s.connect(ADDR)
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
         ss = socket.ssl(s)
         assert isinstance(ss.server(), str)
         s.close()
@@ -68,7 +74,10 @@
         import socket
         ADDR = "connect.sigen-ca.si", 443
         s = socket.socket()
-        s.connect(ADDR)
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
         ss = socket.ssl(s)
         assert isinstance(ss.issuer(), str)
         s.close()
@@ -77,9 +86,44 @@
         import socket
         ADDR = "connect.sigen-ca.si", 443
         s = socket.socket()
-        s.connect(ADDR)
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
         ss = socket.ssl(s)
+        raises(TypeError, ss.write, 123)
         num_bytes = ss.write("hello\n")
         assert isinstance(num_bytes, int)
         assert num_bytes >= 0
         s.close()
+        
+    def test_read(self):
+        import socket
+        ADDR = "connect.sigen-ca.si", 443
+        s = socket.socket()
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
+        ss = socket.ssl(s)
+        raises(TypeError, ss.read, "foo")
+        ss.write("hello\n")
+        data = ss.read()
+        assert isinstance(data, str)
+        s.close()
+
+    def test_read_upto(self):
+        import socket
+        ADDR = "connect.sigen-ca.si", 443
+        s = socket.socket()
+        try:
+            s.connect(ADDR)
+        except:
+            skip("no network available or issues with connection")
+        ss = socket.ssl(s)
+        raises(TypeError, ss.read, "foo")
+        ss.write("hello\n")
+        data = ss.read(10)
+        assert isinstance(data, str)
+        assert len(data) == 10
+        s.close()
\ No newline at end of file



More information about the Pypy-commit mailing list