|
Jim Dabell
jim-mod-python at jimdabell.com
Mon Aug 23 06:03:42 EDT 2004
On Sunday 22 August 2004 09:14, Daniel West wrote:
> I have a script that needs to receive a request, set a cookie, and then
> redirect to another location. I'm using PSP on mod_python 3.1.3. I'm not
> getting the Set-Cookie header in the request response.
[snip]
> Why is it that mod_python seems to honor the Set-Cookie header for the OK
> status code, but not the others?
Your mistake is in assuming that adding something to req.headers_out will
result in headers being sent out ;).
For some reason, mod_python has separated the concept of response headers out
into two separate types - headers that are sent out in normal conditions, and
headers that are sent out in error conditions. I would guess that raising
any type of exception will cause mod_python to ignore normal headers (but
still pull out Location in the case of HTTP_SEE_OTHER).
In other words, the working version of the code you posted is:
<%
cookie = "..." # set the cookie to something
req.err_headers_out.add('Set-Cookie', cookie) # note use of err_headers_out
req.headers_out["Location"] = "http://..."
raise apache.SERVER_RETURN, apache.HTTP_SEE_OTHER
%>
I personally think it's pretty silly to have two separate sets of headers, I'm
guessing this is an internal Apache issue that is being exposed
unnecessarily. Especially in this case, it is nonsensical to consider a
simple redirect to be an error condition that should ignore normal headers.
Also note that using psp.redirect() instead of raising an exception provides
the behaviour you want. Another alternative is to set req.status to what you
want and raise apache.OK. Also, it appears whoever wrote util.redirect() is
aware of the problem, as it manually sets req.status and then raises
apache.OK, rather than simply raising an exception with the correct value.
Under what circumstances is having separate sets of headers useful? Does
anybody actually need this? It seems to me that it would be far more
intuitive to have headers_out sent for every type of response. At the very
least, 3xx status codes should not be treated as an error condition (that's
what 4xx and 5xx are for).
--
Jim Dabell
|