##################################################
# SPYCE - Python-based HTML Scripting
# Copyright (c) 2002 Rimon Barr.
#
# Refer to spyce.py
# CVS: $Id: spyceModpy.py 726 2005-05-13 16:29:50Z jbe $
##################################################
import string, sys, os
import spyce, spyceException, spyceUtil, spycePreload
__doc__ = '''Apache mod_python-based Spyce entry point.'''
##################################################
# Request / response handlers
#
import _apache # fails when not running under apache
from mod_python import apache
class NoFlush:
"Elide flush calls"
def __init__(self, apacheRequest):
self.write = apacheRequest.write
def flush(self):
pass
# make sure that both sets of classes have identical functionality
class spyceModpyRequest(spyce.spyceRequest):
"Apache Spyce request object. (see spyce.spyceRequest)"
def __init__(self, apacheRequest):
spyce.spyceRequest.__init__(self)
self._in = apacheRequest
def env(self, name=None):
return spyceUtil.extractValue(self._in.subprocess_env, name)
def getHeader(self, type=None):
if type:
if self._in.headers_in.has_key(type):
return self._in.headers_in[type]
else: return self._in.headers_in
def getServerID(self):
return os.getpid()
class spyceModpyResponse(spyce.spyceResponse):
"Apache Spyce response object. (see spyce.spyceResponse)"
def __init__(self, apacheRequest):
spyce.spyceResponse.__init__(self)
self.origout = apacheRequest
self.out = spyceUtil.BufferedOutput(NoFlush(apacheRequest))
self.isCTset = 0
self.headersSent = 0
self.returncode = self.origout.status = self.RETURN_OK
# functions (for performance)
self.write = self.out.write
self.writeErr = sys.stderr.write
def close(self):
self.flush()
#self.out.close()
def clear(self):
self.out.clear()
def sendHeaders(self):
if self.headersSent:
return
if not self.isCTset:
self.setContentType("text/html")
self.origout.send_http_header()
self.headersSent = 1
def clearHeaders(self):
if self.headersSent:
raise 'headers already sent'
for header in self.origout.headers_out.keys():
del self.origout.headers_out[header]
def setContentType(self, content_type):
if self.headersSent:
raise 'headers already sent'
self.origout.content_type = content_type
self.isCTset = 1
def setReturnCode(self, code):
if self.headersSent:
raise 'headers already sent'
self.returncode = self.origout.status = code
def addHeader(self, type, data, replace=0):
if self.headersSent:
raise 'headers already sent'
if replace:
self.origout.headers_out[type] = data
else:
self.origout.headers_out.add(type, data)
def flush(self, stopFlag=0):
if stopFlag: return
self.sendHeaders()
self.out.flush()
def unbuffer(self):
self.flush()
self.out.unbuffer()
##################################################
# Apache config
#
def getApacheConfig(apachereq, param, default=None):
"Return Apache mod_python configuration parameter."
try:
return apachereq.get_options()[param]
except:
return default
##################################################
# Apache entry point
#
configmod = None
def spyceMain(apacheRequest):
"Apache entry point."
os.environ[spyce.SPYCE_ENTRY] = 'modpy'
apacheRequest.add_common_vars()
request = spyceModpyRequest(apacheRequest)
response = spyceModpyResponse(apacheRequest)
filename = apacheRequest.filename
global configmod
if configmod == None:
configFile = getApacheConfig(apacheRequest, 'SPYCE_CONFIG')
configmod = spycePreload.getConfigModule(configFile)
try:
result = spyce.spyceFileHandler(request, response, filename, config=configmod)
except (spyceException.spyceForbidden, spyceException.spyceNotFound), e:
response.clear()
response.setContentType('text/plain')
response.write(str(e)+'\n')
except:
response.clear()
response.setContentType('text/plain')
response.write(spyceUtil.exceptionString()+'\n')
try:
response.flush()
except: pass
return apache.OK
|