| Viewing file:  https_server.py (3.59 KB)      -rw-r--r-- Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
###############################################################################
 # Copyright (c) 2004, Ng Pheng Siong.
 # All Rights Reserved.
 #
 # XXX license TBD; should be Zope 3's ZPL, I just haven't read thru that.
 #
 ##############################################################################
 """HTTPS Server
 
 This is a HTTPS version of HTTPServer.
 
 $Id: https_server.py 240 2004-10-02 12:40:14Z ngps $
 """
 
 import asyncore, logging, os.path
 
 from zope.server.http.httpserver import HTTPServer
 from zope.server.http.https_serverchannel import HTTPS_ServerChannel
 from M2Crypto import SSL, version
 
 
 # 2004-09-27, ngps:
 # 'sslv2' or 'sslv23' interoperates with Firefox and IE.
 # 'sslv3' or 'tlsv1' doesn't.
 def make_ssl_context(dir, ssl_proto='sslv23'):
 sslctx = SSL.Context(ssl_proto)
 sslctx.load_cert(os.path.join(dir, 'server.pem'))
 sslctx.load_verify_locations(os.path.join(dir, 'ca.pem'))
 sslctx.load_client_CA(os.path.join(dir, 'ca.pem'))
 sslctx.set_verify(SSL.verify_none, 10)
 sslctx.set_session_id_ctx('someblahblahthing')
 sslctx.set_tmp_dh(os.path.join(dir, 'dh1024.pem'))
 #sslctx.set_info_callback() # debugging only; not thread-safe
 return sslctx
 
 
 class HTTPS_Server(HTTPServer):
 """This is a generic HTTPS Server."""
 
 channel_class = HTTPS_ServerChannel
 SERVER_IDENT = 'zope.server.zserverssl_https'
 
 def __init__(self, ip, port, ssl_ctx=None, task_dispatcher=None, adj=None, start=1,
 hit_log=None, verbose=0):
 HTTPServer.__init__(self, ip, port, task_dispatcher, adj, start, hit_log, verbose)
 if ssl_ctx is None:
 self.ssl_ctx = make_ssl_context(os.path.realpath(__file__))
 else:
 self.ssl_ctx = ssl_ctx
 
 def executeRequest(self, task):
 """Execute an HTTP request."""
 # This is a default implementation, meant to be overridden.
 body = "The HTTPS server is running!\r\n" * 10
 task.response_headers['Content-Type'] = 'text/plain'
 task.response_headers['Content-Length'] = str(len(body))
 task.write(body)
 
 def handle_accept(self):
 """See zope.server.interfaces.IDispatcherEventHandler"""
 try:
 v = self.accept()
 if v is None:
 return
 conn, addr = v
 except socket.error:
 # Linux: On rare occasions we get a bogus socket back from
 # accept.  socketmodule.c:makesockaddr complains that the
 # address family is unknown.  We don't want the whole server
 # to shut down because of this.
 if self.adj.log_socket_errors:
 self.log_info ('warning: server accept() threw an exception',
 'warning')
 return
 for (level, optname, value) in self.adj.socket_options:
 conn.setsockopt(level, optname, value)
 # Turn the vanilla socket into an SSL connection.
 try:
 ssl_conn = SSL.Connection(self.ssl_ctx, conn)
 ssl_conn._setup_ssl(addr)
 ssl_conn.accept_ssl()
 self.channel_class(self, ssl_conn, addr, self.adj)
 except SSL.SSLError, why:
 self.log_info('accept: cannot make SSL connection %s' % (why,), 'warning')
 pass
 
 
 
 if __name__ == '__main__':
 
 from zope.server.taskthreads import ThreadedTaskDispatcher
 td = ThreadedTaskDispatcher()
 td.setThreadCount(4)
 HTTPS_Server('', 8443, ssl_ctx=None, task_dispatcher=td, verbose=1)
 
 try:
 import asyncore
 while 1:
 asyncore.poll(5)
 
 except KeyboardInterrupt:
 print 'shutting down...'
 td.shutdown()
 
 |