|
Sidnei da Silva
sidnei at enfoldsystems.com
Wed Sep 5 12:21:27 EDT 2007
Ok, I was finally able to figure out part of the problem and a solution for
it.
The issue is that if the response fits in 'io_buffer_size' which defaults to
8k, then the output filters get all called in the same iteration. In
particular, there's one filter called 'HTTP_HEADER' which is responsible for
emitting the headers. Obviously, to make things work right, it should be the
last one to be called, which it is apparently.
However, when the response is larger than io_buffer_size, the filters get
called multiple times. Unfortunately, HTTP_HEADER is one such filter, so the
first time around the mod_python filter gets called, but hasn't seen EOS, so
it doesn't change the headers. Then the HTTP_HEADER gets called and sends
the headers. Then after that you can't change the headers anymore.
My initial hack was to set 'req.assbackwards', which prevented the
HTTP_HEADER from doing it's thing, and then when the mod_python filter sees
EOS then I set 'req.assbackwards' to 1 and call
req.add_output_filter('HTTP_HEADER'). That works, but depends on filter
implementation internals, so I felt I needed a better fix.
Then I stumble upon 'mod_filter', which has lots of interesting
configuration knobs. The interesting one is 'FilterProtocol', which lets you
specify if your filter will change the content length and if it supports
byte ranges, and also that you want your filter to be the first one in the
chain. So I toggled those settings, and it magically works.
Here's my configuration file:
https://svn.enfoldsystems.com/browse/public/enfold.lxml/trunk/docs/sample-apache.conf?rev=1321&view=auto
It would be great to document this somewhere, so that the next person
doesn't have to suffer that much. Maybe add some notes to mod_python docs? I
will certainly write a blog entry.
--
Sidnei da Silva
Enfold Systems, Inc.
|