initial source import
diff --git a/examples/simple/server.py b/examples/simple/server.py
new file mode 100644
index 0000000..a592ec3
--- /dev/null
+++ b/examples/simple/server.py
@@ -0,0 +1,101 @@
+#
+# server.py
+#
+# Copyright (C) 2001 Martin Sjögren and AB Strakt, All rights reserved
+#
+# $Id: server.py,v 1.2 2002/07/25 08:26:34 martin Exp $
+#
+"""
+Simple echo server, using nonblocking I/O
+"""
+
+from OpenSSL import SSL
+import sys, os, select, socket
+
+
+def verify_cb(conn, cert, errnum, depth, ok):
+ # This obviously has to be updated
+ print 'Got certificate: %s' % cert.get_subject()
+ return ok
+
+if len(sys.argv) < 2:
+ print 'Usage: python[2] server.py PORT'
+ sys.exit(1)
+
+dir = os.path.dirname(sys.argv[0])
+if dir == '':
+ dir = os.curdir
+
+# Initialize context
+ctx = SSL.Context(SSL.SSLv23_METHOD)
+ctx.set_options(SSL.OP_NO_SSLv2)
+ctx.set_verify(SSL.VERIFY_PEER|SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_cb) # Demand a certificate
+ctx.use_privatekey_file (os.path.join(dir, 'server.pkey'))
+ctx.use_certificate_file(os.path.join(dir, 'server.cert'))
+ctx.load_verify_locations(os.path.join(dir, 'CA.cert'))
+
+# Set up server
+server = SSL.Connection(ctx, socket.socket(socket.AF_INET, socket.SOCK_STREAM))
+server.bind(('', int(sys.argv[1])))
+server.listen(3)
+server.setblocking(0)
+
+clients = {}
+writers = {}
+
+def dropClient(cli, errors=None):
+ if errors:
+ print 'Client %s left unexpectedly:' % (clients[cli],)
+ print ' ', errors
+ else:
+ print 'Client %s left politely' % (clients[cli],)
+ del clients[cli]
+ if writers.has_key(cli):
+ del writers[cli]
+ if not errors:
+ cli.shutdown()
+ cli.close()
+
+while 1:
+ try:
+ r,w,_ = select.select([server]+clients.keys(), writers.keys(), [])
+ except:
+ break
+
+ for cli in r:
+ if cli == server:
+ cli,addr = server.accept()
+ print 'Connection from %s' % (addr,)
+ clients[cli] = addr
+
+ else:
+ try:
+ ret = cli.recv(1024)
+ except (SSL.WantReadError, SSL.WantWriteError, SSL.WantX509LookupError):
+ pass
+ except SSL.ZeroReturnError:
+ dropClient(cli)
+ except SSL.Error, errors:
+ dropClient(cli, errors)
+ else:
+ if not writers.has_key(cli):
+ writers[cli] = ''
+ writers[cli] = writers[cli] + ret
+
+ for cli in w:
+ try:
+ ret = cli.send(writers[cli])
+ except (SSL.WantReadError, SSL.WantWriteError, SSL.WantX509LookupError):
+ pass
+ except SSL.ZeroReturnError:
+ dropClient(cli)
+ except SSL.Error, errors:
+ dropClient(cli, errors)
+ else:
+ writers[cli] = writers[cli][ret:]
+ if writers[cli] == '':
+ del writers[cli]
+
+for cli in clients.keys():
+ cli.close()
+server.close()