import select
import socket
import ssl
import sys

HOST = "127.0.0.1"
PORT = 8912

def sslProtocolVersion():
    # sslProtocolVersion
    if sys.version_info >= (2,7,13):
        # this means TLSv1 or higher
        # in the future change to
        # ssl.PROTOCOL_TLS1.2
        return ssl.PROTOCOL_TLS
    elif sys.version_info >= (2,7,9):
        # this means any SSL/TLS. SSLv2 and 3 are excluded with an option after context is created
        return ssl.PROTOCOL_SSLv23
    else:
        # this means TLSv1, there is no way to set "TLSv1 or higher" or
        # "TLSv1.2" in < 2.7.9
        return ssl.PROTOCOL_TLSv1

def connect():
    sock = socket.create_connection((HOST, PORT))
    return sock

def listen():
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.bind((HOST, PORT))
    sock.listen(0)
    return sock

def sslHandshake(sock, server=False):
    if sys.version_info >= (2,7,9):
        context = ssl.SSLContext(sslProtocolVersion())
        context.set_ciphers("AECDH-AES256-SHA")
        context.set_ecdh_curve("secp256k1")
        context.check_hostname = False
        context.verify_mode = ssl.CERT_NONE
        context.options = ssl.OP_ALL | ssl.OP_NO_SSLv2 | ssl.OP_NO_SSLv3 | ssl.OP_SINGLE_ECDH_USE | ssl.OP_CIPHER_SERVER_PREFERENCE
        sslSock = context.wrap_socket(sock, server_side = server, do_handshake_on_connect=False)
    else:
        sslSock = ssl.wrap_socket(self.sock, keyfile = os.path.join('src', 'sslkeys', 'key.pem'), certfile = os.path.join('src', 'sslkeys', 'cert.pem'), server_side = server, ssl_version=sslProtocolVersion(), do_handshake_on_connect=False, ciphers='AECDH-AES256-SHA')

    while True:
        try:
            sslSock.do_handshake()
            break
        except ssl.SSLWantReadError:
            print "Waiting for SSL socket handhake read"
            select.select([self.sslSock], [], [], 10)
        except ssl.SSLWantWriteError:
            print "Waiting for SSL socket handhake write"
            select.select([], [self.sslSock], [], 10)
        except Exception as e:
            print "SSL socket handhake failed, shutting down connection: %s" % (e)
            return
    print "Success!"
    return sslSock

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "Usage: ssltest.py client|server"
        sys.exit(0)
    elif sys.argv[1] == "server":
        serversock = listen()
        while True:
            print "Waiting for connection"
            sock, addr = serversock.accept()
            print "Got connection from %s:%i" % (addr[0], addr[1])
            sslSock = sslHandshake(sock, True)
            sslSock.shutdown(socket.SHUT_RDWR)
            sslSock.close()
    elif sys.argv[1] == "client":
        sock = connect()
        sslSock = sslHandshake(sock, False)
        sslSock.shutdown(socket.SHUT_RDWR)
        sslSock.close()
    else:
        print "Usage: ssltest.py client|server"
        sys.exit(0)

@@ -42,16 +42,33 @@
 port sys
+%0Aimport traceback
 %0A%0AHOST =
@@ -2216,18 +2216,42 @@
 tion
-: %25s%22 %25 (e
+%22%0A            traceback.print_exc(
 )%0A  
@@ -2716,16 +2716,44 @@
 , True)%0A
+            if sslSock:%0A    
         
@@ -2783,32 +2783,36 @@
 cket.SHUT_RDWR)%0A
+    
             sslS
@@ -2922,24 +2922,48 @@
 ock, False)%0A
+        if sslSock:%0A    
         sslS
@@ -2985,32 +2985,36 @@
 cket.SHUT_RDWR)%0A
+    
         sslSock.

Add more debug info and error handling to ssltest