From 97a38c2514a1690a190d57019497d12ce000786d Mon Sep 17 00:00:00 2001 From: Allan Saddi Date: Tue, 2 Jan 2007 22:15:05 +0000 Subject: Re-commit r2304 since it was found that mod_scgi does set SCRIPT_NAME/ PATH_INFO correctly when using SCGIMount (vs. SCGIHandler/SCGIServer). --- ChangeLog | 3 --- flup/server/scgi.py | 4 ++-- flup/server/scgi_base.py | 49 ++++++++++++++++++++++++++++++++---------------- flup/server/scgi_fork.py | 4 ++-- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5a7f795..c9da87a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,5 @@ 2006-12-29 Allan Saddi - * Back out previous commit. PATH_INFO is still not set - correctly by mod_scgi. - * Deprecate WSGI_SCRIPT_NAME and scriptName in scgi_base. Modern versions of mod_scgi correctly set SCRIPT_NAME & PATH_INFO. diff --git a/flup/server/scgi.py b/flup/server/scgi.py index ee9d769..ada352e 100644 --- a/flup/server/scgi.py +++ b/flup/server/scgi.py @@ -66,7 +66,7 @@ __version__ = '$Revision$' import logging import socket -from flup.server.scgi_base import BaseSCGIServer, Connection +from flup.server.scgi_base import BaseSCGIServer, Connection, NoDefault from flup.server.threadedserver import ThreadedServer __all__ = ['WSGIServer'] @@ -87,7 +87,7 @@ class WSGIServer(BaseSCGIServer, ThreadedServer): of preforking to be quite superior. So if your application really doesn't mind running in multiple processes, go use SWAP. ;) """ - def __init__(self, application, scriptName='', environ=None, + def __init__(self, application, scriptName=NoDefault, environ=None, multithreaded=True, multiprocess=False, bindAddress=('localhost', 4000), umask=None, allowedServers=None, diff --git a/flup/server/scgi_base.py b/flup/server/scgi_base.py index a1d4d86..0bcb652 100644 --- a/flup/server/scgi_base.py +++ b/flup/server/scgi_base.py @@ -36,6 +36,7 @@ import cStringIO as StringIO import signal import datetime import os +import warnings # Threads are required. If you want a non-threaded (forking) version, look at # SWAP . @@ -273,7 +274,7 @@ class BaseSCGIServer(object): # What Request class to use. requestClass = Request - def __init__(self, application, scriptName='', environ=None, + def __init__(self, application, scriptName=NoDefault, environ=None, multithreaded=True, multiprocess=False, bindAddress=('localhost', 4000), umask=None, allowedServers=NoDefault, @@ -471,29 +472,45 @@ class BaseSCGIServer(object): def _sanitizeEnv(self, environ): """Fill-in/deduce missing values in environ.""" - # Namely SCRIPT_NAME/PATH_INFO + # Ensure QUERY_STRING exists + if not environ.has_key('QUERY_STRING'): + environ['QUERY_STRING'] = '' + + # Check WSGI_SCRIPT_NAME scriptName = environ.get('WSGI_SCRIPT_NAME') if scriptName is None: scriptName = self.scriptName - elif scriptName.lower() == 'none': - scriptName = None + else: + warnings.warn('WSGI_SCRIPT_NAME environment variable for scgi ' + 'servers is deprecated', + DeprecationWarning) + if scriptName.lower() == 'none': + scriptName = None if scriptName is None: # Do nothing (most likely coming from cgi2scgi) return - value = environ['SCRIPT_NAME'] - # Pull PATH_INFO from environ, if it exists. (cgi2scgi actually - # passes it in.) - value += environ.get('PATH_INFO', '') - if not value.startswith(scriptName): - self.logger.warning('scriptName does not match request URI') - - environ['PATH_INFO'] = value[len(scriptName):] - environ['SCRIPT_NAME'] = scriptName - - if not environ.has_key('QUERY_STRING'): - environ['QUERY_STRING'] = '' + if scriptName is NoDefault: + # Pull SCRIPT_NAME/PATH_INFO from environment, with empty defaults + if not environ.has_key('SCRIPT_NAME'): + environ['SCRIPT_INFO'] = '' + if not environ.has_key('PATH_INFO'): + environ['PATH_INFO'] = '' + else: + # Configured scriptName + warnings.warn('Configured SCRIPT_NAME is deprecated\n' + 'Do not use WSGI_SCRIPT_NAME or the scriptName\n' + 'keyword parameter -- they will be going away', + DeprecationWarning) + + value = environ['SCRIPT_NAME'] + value += environ.get('PATH_INFO', '') + if not value.startswith(scriptName): + self.logger.warning('scriptName does not match request URI') + + environ['PATH_INFO'] = value[len(scriptName):] + environ['SCRIPT_NAME'] = scriptName def error(self, request): """ diff --git a/flup/server/scgi_fork.py b/flup/server/scgi_fork.py index 46cb1e0..ce04899 100644 --- a/flup/server/scgi_fork.py +++ b/flup/server/scgi_fork.py @@ -66,7 +66,7 @@ __version__ = '$Revision$' import logging import socket -from flup.server.scgi_base import BaseSCGIServer, Connection +from flup.server.scgi_base import BaseSCGIServer, Connection, NoDefault from flup.server.preforkserver import PreforkServer __all__ = ['WSGIServer'] @@ -87,7 +87,7 @@ class WSGIServer(BaseSCGIServer, PreforkServer): of preforking to be quite superior. So if your application really doesn't mind running in multiple processes, go use SWAP. ;) """ - def __init__(self, application, scriptName='', environ=None, + def __init__(self, application, scriptName=NoDefault, environ=None, bindAddress=('localhost', 4000), umask=None, allowedServers=None, loggingLevel=logging.INFO, debug=True, **kw): -- cgit v1.2.1