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.
|