diff --git a/eventlet/green/socket.py b/eventlet/green/socket.py new file mode 100644 index 0000000..b016149 --- /dev/null +++ b/eventlet/green/socket.py @@ -0,0 +1,39 @@ +from __future__ import absolute_import +from socket import _fileobject, fromfd as __fromfd, socketpair as __socketpair +from socket import * + +from eventlet.greenio import GreenSocket as socket, GreenSSL as _GreenSSL +from eventlet.twisteds.util import block_on as _block_on + +def fromfd(*args): + return socket(__fromfd(*args)) + +def gethostbyname(name): + from twisted.internet import reactor + return _block_on(reactor.resolve(name)) + +# XXX there're few more blocking functions in socket + +def socketpair(family=None, type=SOCK_STREAM, proto=0): + if family is None: + try: + family = AF_UNIX + except AttributeError: + family = AF_INET + + a, b = __socketpair(family, type, proto) + return socket(a), socket(b) + +def ssl(sock, certificate=None, private_key=None): + from OpenSSL import SSL + context = SSL.Context(SSL.SSLv23_METHOD) + if certificate is not None: + context.use_certificate_file(certificate) + if private_key is not None: + context.use_privatekey_file(private_key) + context.set_verify(SSL.VERIFY_NONE, lambda *x: True) + + ## TODO only do this on client sockets? how? + connection = SSL.Connection(context, sock) + connection.set_connect_state() + return _GreenSSL(connection)