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.