tsafe.py 987 B

12345678910111213141516171819202122232425262728
  1. from OpenSSL import SSL
  2. _ssl = SSL
  3. del SSL
  4. import threading
  5. _RLock = threading.RLock
  6. del threading
  7. class Connection:
  8. def __init__(self, *args):
  9. self._ssl_conn = apply(_ssl.Connection, args)
  10. self._lock = _RLock()
  11. for f in ('get_context', 'pending', 'send', 'write', 'recv', 'read',
  12. 'renegotiate', 'bind', 'listen', 'connect', 'accept',
  13. 'setblocking', 'fileno', 'shutdown', 'close', 'get_cipher_list',
  14. 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
  15. 'makefile', 'get_app_data', 'set_app_data', 'state_string',
  16. 'sock_shutdown', 'get_peer_certificate', 'want_read',
  17. 'want_write', 'set_connect_state', 'set_accept_state',
  18. 'connect_ex', 'sendall'):
  19. exec("""def %s(self, *args):
  20. self._lock.acquire()
  21. try:
  22. return self._ssl_conn.%s(*args)
  23. finally:
  24. self._lock.release()\n""" % (f, f))