I’m starting to get a sense of what publisher functionality I can put in a WSGI pipeline and what I shouldn’t.
The pipeline is very useful for specifying the order things should happen. For example, the error handling should be as early in the pipeline as possible, so it can handle many kinds of errors, but it has to come after the pipeline element that opens and closes the root database connection. Constraints like that have never been expressed clearly in the current publisher.
I was planning to encapsulate the <base> tag mangling logic in a simple pipeline step, but I’ve studied how it currently works and I realize now that WSGI doesn’t provide a good abstraction for the kind of heuristics Zope uses to makes the <base> tag logic fast. I am considering several choices:
- Split the base tag handling between a pipeline element and a new adapter.
- Add short-lived output filter hooks to the response, similar to the traversal_hooks I added to requests, which I think turned out quite nice.
- Stick to the original plan, which might cause performance problems since Zope would then have to buffer potentially large output streams.
I need to choose the pattern that maximizes clarity for readers. #1 and #2 are very similar. #1 is less direct and thus more ambiguous than #2, but #1 is used more often in Zope code.
Option #2 seems best to me.