[ http://issues.apache.org/jira/browse/MODPYTHON-112?page=all ]
Graham Dumpleton resolved MODPYTHON-112:
----------------------------------------
Resolution: Fixed
> If using filters value of req.phase only valid up till first
> req.read()/req.write().
> ------------------------------------------------------------------------------------
>
> Key: MODPYTHON-112
> URL: http://issues.apache.org/jira/browse/MODPYTHON-112
> Project: mod_python
> Type: Bug
> Components: core
> Versions: 3.1.4, 3.2.7
> Reporter: Graham Dumpleton
> Assignee: Graham Dumpleton
> Fix For: 3.3
> Attachments: grahamd_20060223_1.diff
>
> The request object provides a member variable called 'phase' described as:
> The phase currently being being processed, e.g. "PythonHandler". (Read-Only)
> If no Python based input and output filters are used, the value of req.phase
> will be constant for the life of a request phase. If however you use an input
> or output filter, the value of req.phase can change.
> Consider that we are in the content handler phase and where there is a Python
> based output filter, but no Python based input filter. On initially entering
> the request handler, the value of req.phase will be "PythonHandler". As soon
> as req.write() is called however, the value of req.phase changes to
> "PythonOutputFilter".
> Now, if there is a Python based input filter, but no Python based output
> filter, the value of req.phase will change to "PythonInputFilter" as soon as
> req.read() is called.
> If there are both Python based input and output filters, the value of
> req.phase will in turn change to "PythonInputFilter" and "PythonOutputFilter"
> as req.read() and then req.write() are in turn called.
> The reason for all this is that in the get_request_object() function of
> src/mod_python.c, it contains code:
> /* make a note of which phase we are in right now */
> Py_XDECREF(request_obj->phase);
> if (phase)
> request_obj->phase = PyString_FromString(phase);
> else
> request_obj->phase = PyString_FromString("");
> That is, whenever called to get the request object, it will update req.phase.
> This will occur even if the request object had already been created, as will
> be the case when there is a Python based content handler and either a Python
> based input or output filter.
> Overall this behaviour is a bit strange and unexpected. It would seem to me
> that it if there is both a handler and a filter, that the value of req.phase
> would be left as the name of the handler phase. Ie., it would stay for
> example as "PythonHandler" and not be changed to "PythonInputFilter" or
> "PythonOutFilter".
> One can't just change the code in get_request_object() not to update it if
> already set, as it has to be updated when one moves from one phase to
> another. One has to contend with where this function is called in
> python_filter() function, namely:
> /* create/acquire request object */
> request_obj = get_request_object(req, interp_name,
>
> is_input?"PythonInputFilter":"PythonOutputFilter");
> First step may be simply not to pass in "PythonInputFilter" or
> "PythonOutputFilter" and instead just call it as:
> request_obj = get_request_object(req, interp_name,0);
> At the same time change get_request_object() to:
> Py_XDECREF(request_obj->phase);
> if (phase)
> request_obj->phase = PyString_FromString(phase);
> else if (!request_obj->phase)
> request_obj->phase = PyString_FromString("");
> Ie., result will be that if req.phase is set, leave it alone when called by
> python_filter() with phase set 0. If req.phase isn't already set, set it to
> the empty string.
> The consequences of this are that if there are filters but no Python based
> handlers, then req.phase will get set to an empty string in that case.
> Another strange case is that if the only Python based handler was for an
> early phase than what is consuming or generating the content to be processed,
> then req.phase will be set to a value corresponding to that earlier phase and
> not where the current action is. For example, if there was an AccessHandler
> but then content came from a static file, output filter would see
> "AccessHandler".
> Thus, whatever is done, there will be some strangeness. Thus, question
> remains of what should be done, or if it should be left that way and that
> documentation changed to say that req.phase is only valid up until first call
> to req.read() or req.write() within a handler.
> This is not an ideal situation though as a handler may want to interogate
> req.phase after req.read() or req.write() has been called for some reason,
> which would yield incorrect results if a filter is being used. An example of
> where this occurs is in error reporting in the HandlerDispatch of
> mod_python.apache itself. When it is generating an error message, the phase
> shown in the error message will be wrong if there was a filter. It should
> perhaps at least be changed to save away req.phase at start of dispatch so it
> knows it is correct later for any error messages.
> Any comments?????
--
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