81 lines
2.6 KiB
Python
81 lines
2.6 KiB
Python
#
|
|
# Copyright (C) 2000, 2001, 2013 Gregory Trubetskoy
|
|
# Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Apache Software Foundation
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you
|
|
# may not use this file except in compliance with the License. You
|
|
# may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied. See the License for the specific language governing
|
|
# permissions and limitations under the License.
|
|
#
|
|
# Originally developed by Gregory Trubetskoy.
|
|
#
|
|
|
|
import sys
|
|
from mod_python import apache
|
|
|
|
def handler(req):
|
|
|
|
options = req.get_options()
|
|
|
|
## Find the application callable
|
|
|
|
app = None
|
|
app_str = options['mod_python.wsgi.application']
|
|
if app_str:
|
|
if '::' in app_str:
|
|
mod_str, callable_str = app_str.split('::', 1)
|
|
else:
|
|
mod_str, callable_str = app_str, 'application'
|
|
config = req.get_config()
|
|
autoreload, log = True, False
|
|
if "PythonAutoReload" in config:
|
|
autoreload = config["PythonAutoReload"] == "1"
|
|
if "PythonDebug" in config:
|
|
log = config["PythonDebug"] == "1"
|
|
module = apache.import_module(mod_str, autoreload=autoreload, log=log)
|
|
|
|
try:
|
|
app = module.__dict__[callable_str]
|
|
except KeyError: pass
|
|
|
|
if not app:
|
|
req.log_error(
|
|
'WSGI handler: mod_python.wsgi.application (%s) not found, declining.'
|
|
% repr(app_str), apache.APLOG_WARNING)
|
|
return apache.DECLINED
|
|
|
|
## Build env
|
|
|
|
env = req.build_wsgi_env()
|
|
if env is None:
|
|
# None means base_uri mismatch. The problem can be either
|
|
# base_uri or Location, but because we couldn't be here if it
|
|
# was Location, then it must be mod_python.wsgi.base_uri.
|
|
base_uri = options.get('mod_python.wsgi.base_uri')
|
|
req.log_error(
|
|
"WSGI handler: req.uri (%s) does not start with mod_python.wsgi.base_uri (%s), declining."
|
|
% (repr(req.uri), repr(base_uri)), apache.APLOG_WARNING)
|
|
return apache.DECLINED
|
|
|
|
## Run the app
|
|
|
|
response = None
|
|
try:
|
|
response = app(env, req.wsgi_start_response)
|
|
[req.write(token) for token in response]
|
|
finally:
|
|
# call close() if there is one
|
|
if type(response) not in (list, tuple):
|
|
getattr(response, 'close', lambda: None)()
|
|
|
|
return apache.OK
|
|
|
|
|