New Features
req.add_output_filter(), req.add_input_filter(),
req.register_output_fiter(), req.register_input_filter()
methods. These allows the dynamic registration of filters and the
attaching of filters to the current request.
httponly attribute, an extension
originally created by Microsoft, but now getting more widespread use
in the battle against cross site-scripting attacks.
PythonImport directive to specify the name
of a function contained in the module to be called once the designated
module has been imported.
req.auth_name() and req.auth_type() methods.
These return the values associated with the AuthName and AuthType
directives respectively. The req.ap_auth_type has now also
been made writable so that it can be set by an authentication
handler.
req.set_etag(), req.set_last_modified() and
req.update_mtime() functions as wrappers for similar functions
provided by Apache C API. These are required to effectively use the
req.meets_condition() function. The documentation for
req.meets_condition() has also been updated as what it
previously described probably wouldn't actually work.
req.construct_url() method. Used to construct a fully
qualified URI string incorporating correct scheme, server and port.
req.discard_request_body() function as wrapper for
similar function provided by Apache C API. The function tests for
and reads any message body in the request, simply discarding
whatever it receives.
req.add_handler(), req.register_input_filter() and
req.register_output_filter() methods can now take a direct
reference to a callable object as well a string which refers to a
module or module::function combination by name.
req._request_rec, server._server_rec and
conn._conn_rec semi private members for getting accessing to
underlying Apache struct as a Python CObject. These can be used for
use in implementing SWIG bindings for lower level APIs of Apache.
These members should be regarded as experimental and there are no
guarantees that they will remain present in this specific form in the
future.
req.hlist.location. For a
handler executed directly as the result of a handler directive
within a Location directive, this will be set to the value
of the Location directive. If LocationMatch, or
wildcards or regular expressions are used with Location,
the value will be the matched value in the URL and not the pattern.
Improvements
__auth__() and
__access__() functions and the __auth_realm__ string
can now be nested within a class method as a well a normal function.
PythonEnablePdb configuration option will now be ignored
if Apache hasn't been started up in single process mode.
None being returned with a subsequent error complaining
about the handler returning an invalid value.
util.FieldStorage efficiency and made the interface
more dictionary like.
None but is otherwise not callable. Previously an exception
would not be generated if the handler evaluated to False.
req.handler attribute is now writable. This allows a handler
executing in a phase prior to the response phase to specify which
Apache module will be responsible for generating the content.
req.canonical_filename attribute writable. Changed
the req.finfo attribute from being a tuple to an actual object.
For backwards compatibility the attributes of the object can still be
accessed as if they were a tuple. New code however should access
the attributes as member data. The req.finfo attribute is
also now writable and can be assigned to using the result of calling
the new function apache.stat(). This function is a wrapper
for apr_stat().
apache.OK,
this is no longer the case and what happens is dependent on the
phase. Specifically, a handler returning apache.DECLINED no
longer causes the execution of subsequent handlers for the phase to
be skipped. Instead, it will move to the next of the stacked
handlers. In the case of PythonTransHandler,
PythonAuthenHandler, PythonAuthzHandler and
PythonTypeHandler, as soon as apache.OK is returned,
subsequent handlers for the phase will be skipped, as the result
indicates that any processing pertinent to that phase has been
completed. For other phases, stacked handlers will continue to be
executed if apache.OK is returned as well as when
apache.DECLINED is returned. This new interpretation of the
status returned also applies to stacked content handlers listed
against the PythonHandler directive even though Apache
notionally only ever calls at most one content handler. Where all
stacked content handlers in that phase run, the status returned from
the last handler becomes the overall status from the content phase.
req.proxyreq and req.uri attributes are now writable.
This allows a handler to setup these values and trigger proxying of the
current request to a remote server.
req.no_cache and req.no_local_copy attributes are
now writable.
Python*Handler, Python*Filter and PythonImport
directives. The module importer is still able to be used directly
using the apache.import_module() function. The new module
importer no longer supports automatic reloading of packages/modules
that appear on the standard Python module search path as defined by
the PythonPath directive or within an application by direct
changes to sys.path. Automatic module reloading is however
still performed on file based modules (not packages) which are
located within the document tree where handlers are located.
Locations within the document tree are however no longer added to the
standard Python module search path automatically as they are
maintained within a distinct importer search path. The
PythonPath directive MUST not be used to point at directories
within the document tree. To have additional directories be searched
by the module importer, they should be listed in the
mod_python.importer.path option using the PythonOption
directive. This is a path similar to how PythonPath argument
is supplied, but MUST not reference sys.path nor contain any
directories also listed in the standard Python module search path.
If an application does not appear to work under the module importer,
the old module importer can be reenabled by setting the
mod_python.legacy.importer option using the PythonOption
directive to the value '*'. This option must be set in the
global Apache configuration.
req.main, req.prev and req.next members now
correctly return a reference to the original Python request object
wrapper first created for the specific request_rec instance
rather than creating a new distinct Python request object. This means
that any data added explicitly to a request object can be passed
between such requests.
apache.HTTP_NOT_FOUND server
error is now returned to the client rather than raising a
ValueError exception which results in a 500 internal server error.
Note that if using SetHandler and the request is against the
directory and no DirectoryIndex directive is specified which
lists a valid PSP index file, then the same apache.HTTP_NOT_FOUND
server error is returned to the client.
req.server.log_error() and
req.connection.log_error(). The latter wraps
ap_log_cerror() (when available), allowing client information
to be logged along with message from a connection handler.
req.used_path_info is now modifiable and can
be set from within handlers. This is equivalent to having used the
AcceptPathInfo directive.
req.args is now modifiable and can be set from
within handlers.
Bug Fixes
FieldStorage object instance cached as req.form left
there by preceding code.
__auth__() functions in mod_python.publisher now execute
in context of globals from the file the function is in and not that
of mod_python.publisher itself.
Directory or
DirectoryMatch directives where wildcards or regular
expressions are used, the handler directory will be set to the
shortest directory matched by the directory pattern. Handler
directives can now also be used within Files and
FilesMatch directives and the handler directory will correctly
resolve to the directory corresponding to the enclosing
Directory or DirectoryMatch directive, or the directory
the .htaccess file is contained in.
FilterDispatch callback should not flush the filter if it
has already been closed.
req.sendfile()
was causing problems on Win32, plus code needed to be changed to work
with APR 1.2.7.
SERVER_RETURN exception was
used to return an OK status for that handler, any following
handlers weren't being run if appropriate for the phase.
Py_Finalize() function was being called on child process
shutdown. This was being done though from within the context of a
signal handler, which is generally unsafe and would cause the process
to lock up. This function is no longer called on child process shutdown.
req.phase attribute is no longer overwritten by an input
or output filter. The filter.is_input member should be used
to determine if a filter is an input or output filter.
PythonImport directive now uses the
apache.import_module() function to import modules to avoid
reloading problems when same module is imported from a handler.
sys.path when the
PythonPath directive is being used as well as problems with
infinite extension of path.
localhost doesn't resolve to 127.0.0.1 but the
actual IP address of the host.
Python*Handler or Python*Filter directive is used
inside of a Files directive container, the handler/filter
directory value will now correctly resolve to the directory corresponding
to any parent Directory directive or the location of the
.htaccess file the Files directive is contained in.
req.server.get_config() was not
being populated correctly to be the state of directives set at global
scope for the server.
PythonDebug to Off, wasn't overriding On
setting in parent scope.
util.redirect() function should be returning server status of
apache.DONE and not apache.OK otherwise it will not give
desired result if used in non content handler phase or where there are
stacked content handlers.
sys.path multiple times when
PythonImport and PythonPath directive used.
apache.PROXYREQ_RESPONSE and
apache.HTTP_UPGRADE_REQUIRED. Also added new constants for
Apache magic mime types and values for interpreting the
req.connection.keepalive and req.read_body members.
apache.init() function could be called
more than once for a specific interpreter instance whereas it should
only be called once.
PythonInterpPerDirectory was enabled and request was against
a directory but client didn't provide the trailing slash.
FieldStorage class so that it can handle multiline headers.
PythonInterpPerDirective when setting content handler to
run dynamically with req.add_handler() would cause Apache to
crash.
req.add_handler() is
canonicalized and a trailing slash added automatically. This is
needed to ensure that the directory is always in POSIX path style as
used by Apache and that convention where directories associated with
directives always have trailing slash is adhered to. If this is not
done, a different interpreter can be chosen to that expected when the
PythonInterpPerDirective is used.
PythonHandlerModule was not setting up registration of the
PythonFixupHandler or PythonAuthenHandler. For the
latter this meant that using Require directive with
PythonHandlerModule would cause a 500 error and complaint in
error log about "No groups file".
PythonDebug was On and and exception occurred, the
response to the client had a status of 200 when it really should
have been a 500 error status indicating that an internal error
occurred. A 500 error status was correctly being returned when
PythonDebug was Off.
req.write() or req.sendfile() used and data not flushed,
and then published function returned None.
apache.make_table(). This was used by
util.FieldStorage class so affected all code using forms.
SCRIPT_FILENAME when the
req.subprocess_env table was accessed in the post read request
handler phase.
repr() on a table object.