# $Id: ApacheHandler.py 2028 2006-01-16 23:39:04Z zzzeek $
# ApacheHandler.py - handles apache requests for Myghty
# Copyright (C) 2004, 2005 Michael Bayer mike_mp@zzzcomputing.com
#
# This module is part of Myghty and is released under
# the MIT License: http://www.opensource.org/licenses/mit-license.php
#
#
from mod_python import apache
from mod_python import util
import myghty.exception as exception
import myghty.buffer
import re,string, types, time
from myghty.util import *
from myghty.resolver import *
import myghty.http.HTTPHandler as HTTPHandler
def handle(httpreq, interpreter_name = None, **params):
return get_handler(httpreq, interpreter_name, **params).handle(httpreq = httpreq, **params)
def get_handler(httpreq, interpreter_name = None, **params):
if interpreter_name is None:
try:
interpreter_name = httpreq.get_options()['MyghtyInterpreterName']
except KeyError:
pass
return HTTPHandler.get_handler(ApacheHandler, httpreq = httpreq, interpreter_name = interpreter_name, **params)
class ApacheHandler(HTTPHandler.HTTPHandler):
def __init__(self, httpreq, **params):
HTTPHandler.HTTPHandler.__init__(self, httpreq, LogBuffer(httpreq.server), **params)
def do_handle_result(self, httpreq, status_code, reason):
httpreq.status = HTTPHandler.HTTP_OK
if status_code == HTTPHandler.HTTP_OK:
return apache.OK
else:
return status_code
def do_get_init_params(self, httpreq, **params):
table = httpreq.get_options()
options = params.copy()
for key in table.keys():
match = re.match("^Myghty(.*)$", key)
if not match: continue
param = match.group(1)
param = string.lower(re.sub(r"(\w)([A-Z])", r"\1_\2", param))
if not options.has_key(param):
options[param] = eval(table[key])
return options
def do_make_request_impl(self, httpreq, **params):
httpreq.add_common_vars()
return ApacheRequestImpl(httpreq, **params)
def do_get_resolver(self, **params):
return ApacheResolver(**params)
def do_get_component(self, httpreq, **params):
return httpreq.uri
class LogBuffer(object):
def __init__(self, server, retcode = apache.APLOG_NOTICE):
self.server = server
self.retcode = retcode
def write(self, s):
apache.log_error(string.rstrip(s), self.retcode, self.server)
def writelines(self, list):
for line in list:
apache.log_error(string.rstrip(line), self.retcode, self.server)
def flush(self):
pass
class ApacheBuffer(HTTPHandler.HTTPWriter):
def send_headers(self):
if self.headers_sent:
return
self.headers_sent = True
if not self.httpreq._content_type_set:
self.httpreq.content_type = 'text/html'
# this method is only documented in mod py 2.7
# (where its needed) but seems harmless though useless
# to use in mod py 3.0 as well
self.httpreq.send_http_header()
def writelines(self, list):
for line in list:
self.write(line + "\n")
def flush(self):pass
class ApacheResolver(HTTPHandler.HTTPResolver):pass
class ApacheRequestImpl(HTTPHandler.HTTPRequestImpl):
def __init__(self, httpreq, use_modpython_session = False, **params):
self.use_modpython_session = use_modpython_session
HTTPHandler.HTTPRequestImpl.__init__(self, httpreq, LogBuffer(httpreq.server),
LogBuffer(httpreq.server, apache.APLOG_ERR), **params)
def get_session(self, **params):
if not hasattr(self, 'session'):
if self.use_modpython_session:
import mod_python.Session
self.session = mod_python.Session.Session(timeout = self.session_args.timeout)
else:
self.session = self.session_args.get_session(self.httpreq, **params)
return self.session
def do_get_out_buffer(self, httpreq, out_buffer = None, **params):
if out_buffer is None:
out_buffer = httpreq
return ApacheBuffer(httpreq, out_buffer = out_buffer, **params)
def do_make_request_args(self, httpreq, **params):
"""given a mod_python request, returns a real dict of key values, where the values are
one of: a string, a list of strings, a Field object with an upload value, a list of
Field objects with upload values."""
def formatfield(field):
if type(field) == types.ListType:
return map(formatfield, field)
elif isinstance(field, mputil.Field):
return field
else:
return str(field)
request_args = {}
fields = mputil.FieldStorage(httpreq, keep_blank_values = True)
for key in fields.keys():
request_args[key] = formatfield(fields[key])
return request_args
|