req.main/prev from subrequest should yield true Python request object.
----------------------------------------------------------------------
Key: MODPYTHON-152
URL: http://issues.apache.org/jira/browse/MODPYTHON-152
Project: mod_python
Type: Improvement
Components: core
Reporter: Graham Dumpleton
Assigned to: Graham Dumpleton
When a sub request is triggered using req.internal_redirect(), it is possible
to access the details of the request_rec for the parent request by acessing
req.main. Access will be via an instance of the Python request object wrapper,
but rather than it referring to the actual Python request object wrapper
instance that may have already been created for the parent request, a new
instance is created. This means that a sub request cannot access attributes
that may have been explicitly added to the Python request object wrapper in the
main request.
For example, in a parent request Python handler it may have gone:
req.session = Session.Session(req)
...
req.internal_redirect(...)
In the sub request, it is not currently possible to do something like:
req.session = req.prev.session
where it is a reasonable expectation that trying to access parent request would
allow added attributes to be seen.
What would need to be done is for actions associated with accessing req.main,
req.prev and req.next to use the get_request_object() function to get hold of
request object so that if one already exists, it will be used and if not one
will be created.
Whether this could be done though would depend on what happens when a sub
request is actually processed within the context of a distinct Python
interpreter. Would there be issues with the Python request object wrapper being
used from two distinct Python interpreters, especially where a multithreaded
MPM were being used.
If this isn't a problem, the next issue is how get_request_object() requires
that the interpreter name and phase be supplied with the supplied values
overriding those already in the request object.
For interpreter name this would be a problem as accessing the main request
object from a sub request in a different interpreter would change the value of
interpreter seen by the parent request when it gets control back.
The solution to this should perhaps be that the interpreter name should not
even be stored in the request object wrapper to begin with. Instead, when
req.interpreter is accessed, internally to mod_python it should map this to
retrieving the value of apache.interpreter. This would eliminate the need for
the interpreter name to even be supplied to get_request_object(), simplifying
its calling interface.
As to the phase attribute, all that is probably required is that when access
req.main, req.next or req.prev it passes in phase as a NULL pointer. By doing
this it wouldn't override any existing value if the request object already
existed. If the request object didn't exist, then req.phase would return None.
This latter situation would only exist where the internal redirect was
performed by something other than mod_python.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira