[ http://issues.apache.org/jira/browse/MODPYTHON-97?page=all ]
Nicolas Lehuen resolved MODPYTHON-97:
-------------------------------------
Fix Version: 3.2
Resolution: Fixed
Assign To: Nicolas Lehuen
Fixed this by reverting the changes from MODPYTHON-15.
> mod_python.publisher iterables and content_type broken
> ------------------------------------------------------
>
> Key: MODPYTHON-97
> URL: http://issues.apache.org/jira/browse/MODPYTHON-97
> Project: mod_python
> Type: Bug
> Components: publisher
> Versions: 3.2
> Reporter: Graham Dumpleton
> Assignee: Nicolas Lehuen
> Fix For: 3.2
>
> In 3.2, mod_python.publisher was modified so that if it encountered an
> interable it would recursively iterate over the items and publish each with
> the result being concatenated.
> FWIW, I personally didn't like this as I saw it potentially changing the
> behaviour of existing code, although perhaps in contrived cases or for test
> code only. I saw that this sort of behaviour should have been managed by the
> user by explicit use of a wrapper class instead, rather than it being magic.
> End of ramble. :-)
> Regardless of my concerns, the behaviour that was added is broken.
> Specifically, mod_python.publisher is setting the content type based on the
> content of the first item returned from the iterable. For example, consider
> the following:
> index = [
> '<html><body><p>',
> 1000 * "X",
> '</p></body></html>',
> ]
> When published, this is resulting in the content type being set to
> 'text/plain' and not 'text/html'. In part this is perhaps caused by the fact
> that the content type check is now performed by looking for a trailing
> '</html>' in the content whereas previously it would look for a leading
> '<html>'. This was changed because all the HTML prologue that can appear
> before '<html>' would often throw out this check with the HTML not being
> automatically being detected. Thus at the time it was thought that looking
> for the trailing '</html>' would be more reliable. It ain't going to help to
> go back to using a leading '<html>' check though as the first item may only
> contain the prologue and not '<html>'.
> These checks are only going to work for iterables if the results of
> publishing of each item were added to the end of a list of strings, rather
> than being written back immediately using req.write(). Once all that has been
> returned by the iterable is obtained, this can all be joined back together
> and then the HTML check done.
> Joining all the separate items returned from the iterable back together
> defeats the purpose of what this feature was about in the first place and may
> result in huge in memory objects needing to be created to hold the combined
> result just so the HTML check can be done.
> The only way to avoid the problem is for the content type to be set
> explicitly by the user before the iterable is processed. This is a bit tricky
> as it is mod_python.publisher which is automagically doing this. The best you
> can do is something like:
> class SetContentType:
> def __init__(self,content_type):
> self.__content_type = content_type
> def __call__(self,req):
> req.content_type = self.__content_type
> return ""
> index = [
> SetContentType('text/html'),
> '<html><body><p>',
> 1000 * "X",
> '</p></body></html>',
> ]
> Once you start doing this, the user may as well have provided their own
> published function in the first place that set the content type and manually
> iterated over items and wrote them to req.write(). This could also be managed
> by a user specified wrapper class which is how I saw this as preferably being
> done in the first place. Ie.,
> class PublishIterable:
> def __init__(self,value,content_type):
> self.__value = value
> self.__content_type = content_type
> def __call__(self,req):
> req.content_type = self.__content_type
> for item in self.__value:
> req.write(item)
> _values = [
> '<html><body><p>',
> 1000 * "X",
> '</p></body></html>',
> ]
> index = PublishIterable(_values,'text/html')
> Personally I believe this automagic publishing of iterables should be removed
> from mod_python.publisher. You might still provide a special function/wrapper
> that works like PublisherIterable but handles recursive structures and
> callable objects in the process, but I feel it should be up to the user to
> make a conscious effort to use it and mod_python.publisher shouldn't assume
> that it should process any iterable in this way automatically.
--
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