[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