| Viewing file:  publisherhttps_server.py (2.76 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 that uses the Zope Publisher for executing a task.
 
 $Id: publisherhttps_server.py 240 2004-10-02 12:40:14Z ngps $
 """
 import os.path, sys
 from zope.server.http.https_server import HTTPS_Server, make_ssl_context
 from zope.publisher.publish import publish
 
 
 def get_instance_ssldir():
 # This is real cheesy: It seems Zope3 doesn't have convenient
 # programmatic access to INSTANCE_HOME. This code relies on zopectl
 # setting the first entry of PYTHONPATH to $INSTANCE_HOME/lib/python.
 return os.path.join(os.path.dirname(os.path.dirname(sys.path[0])), 'ssl')
 
 
 class PublisherHTTPS_Server(HTTPS_Server):
 """Zope Publisher-specific HTTPS Server"""
 
 def __init__(self, request_factory, sub_protocol=None, *args, **kw):
 
 # The common HTTP
 self.request_factory = request_factory
 
 # An HTTP server is not limited to serving up HTML; it can be
 # used for other protocols, like XML-RPC, SOAP and so as well
 # Here we just allow the logger to output the sub-protocol type.
 if sub_protocol:
 self.SERVER_IDENT += ' (%s)' %str(sub_protocol)
 
 kw['ssl_ctx'] = make_ssl_context(get_instance_ssldir())
 HTTPS_Server.__init__(self, *args, **kw)
 
 def executeRequest(self, task):
 """Overrides HTTPServer.executeRequest()."""
 env = task.getCGIEnvironment()
 env['HTTPS'] = 'ON'
 try:
 del env['HTTP']
 except KeyError:
 pass
 instream = task.request_data.getBodyStream()
 
 request = self.request_factory(instream, task, env)
 response = request.response
 response.setHeaderOutput(task)
 response.setHTTPTransaction(task)
 publish(request)
 
 
 class PMDBHTTPS_Server(PublisherHTTPS_Server):
 """Enter the post-mortem debugger when there's an error"""
 
 def executeRequest(self, task):
 """Overrides HTTPServer.executeRequest()."""
 env = task.getCGIEnvironment()
 env['HTTPS'] = 'ON'
 try:
 del env['HTTP']
 except KeyError:
 pass
 instream = task.request_data.getBodyStream()
 
 request = self.request_factory(instream, task, env)
 response = request.response
 response.setHeaderOutput(task)
 try:
 publish(request, handle_errors=False)
 except:
 import sys, pdb
 print "%s:" % sys.exc_info()[0]
 print sys.exc_info()[1]
 pdb.post_mortem(sys.exc_info()[2])
 raise
 
 
 |