Show Contents Previous Page Next Page
Chapter 4 - Content Handlers / Chaining Content Handlers Other Types of Stacked Handlers
Content handlers aren't the only type of Apache Perl API handler that can be stacked. Translation handlers, type handlers, authorization handlers, and in fact all types of handlers can be chained using exactly the same techniques we used for the content phase.
A particularly useful phase for stacking is the cleanup handler. Your code can use this to register any subroutines that should be called at the very end of the transaction. You can deallocate resources, unlock files, decrement reference counts, or clear globals. For example, the CGI.pm module maintains a number of package globals controlling various programmer preferences. In order to continue to work correctly in the persistent environment of mod_perl , CGI.pm has to clear these globals after each transaction. It does this by arranging for an internal routine named _reset_globals() to be called at the end of each transaction using this line of code:
$r->push_handlers('PerlCleanupHandler',\&CGI::_reset_globals);
Your program can push as many handlers as it likes, but you should remember
that despite its name, the handler stack doesn't act like the classic LIFO (last-in/first-out)
stack. Instead it acts like a FIFO (first-in/first-out) queue. Also remember
that if the same handler is pushed twice, it will be invoked twice. Footnotes 3 At the time this was written, the Apache developers
were discussing a layered I/O system which will be part of the Apache 2.0 API.
4 The more obvious name, Apache::Filter,
is already taken by a third-party module that does output chaining in a slightly
different manner. 5 For historical reasons this facility is limited
to Unix versions of Netscape Navigator, to PowerPC versions of Navigator on
the Macintosh, and to some other Unix-based browsers such as W3-Emacs. However,
now that Navigator's source code has been released to the developer community,
we hope to see a more widespread implementation of this useful feature. 6 Andreas Koenig's Apache::GzipChain
module, which does much the same thing as this one, contains a hardcoded pattern
match for the browser type contained in the User-Agent field. You can
add this sort of test yourself if you wish, or wait for the browser developers
to implement Accept-Encoding correctly. 7 At the time this chapter was being prepared, the
author of Compress::Zlib, Paul Marquess, was enhancing his library to
make this manual manipulation of the compressed output stream unnecessary.
Show Contents Previous Page Next Page Copyright © 1999 by O'Reilly & Associates, Inc. |