stas 2002/06/19 12:24:42 Modified: src/docs/2.0/user/handlers handlers.pod Log: add PerlOutputFilterHandler example Revision Changes Path 1.2 +75 -11 modperl-docs/src/docs/2.0/user/handlers/handlers.pod Index: handlers.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/handlers.pod,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- handlers.pod 15 Jun 2002 18:26:33 -0000 1.1 +++ handlers.pod 19 Jun 2002 19:24:42 -0000 1.2 @@ -483,27 +483,91 @@ =head2 PerlOutputFilterHandler -This handler registers an stream-orientered output filter (i.e. it -works with the response stream). To actually use it the core -C<AddOutputFilter> directive must be used. +This handler registers and configures a stream-orientered output +filter (i.e. it works with the response stream). This handler is of type C<VOID>. The handler's configuration scope is C<DIR>. -Example: - -In this example the output filter C<Apache::ReverseFilter> - -The following filter reverts XXX +The output filter in the following example reverses every line of the +response, preserving the new line characters in their places: + file:httpd.conf + --------------- + PerlModule Apache::ReverseFilter <Location /reverse> SetHandler modperl - PerlOutputFilterHandler TestFilter::reverse - PerlResponseHandler TestFilter::reverse::response + PerlOutputFilterHandler Apache::ReverseFilter::output_filter + PerlResponseHandler Apache::ReverseFilter::response </Location> - + file:Apache/ReverseFilter.pm + ---------------------------- + package Apache::ReverseFilter; + + use strict; + use warnings FATAL => 'all'; + + use Apache::RequestRec (); + use Apache::RequestIO (); + use Apache::Filter (); + + use Apache::Const -compile => qw(OK); + + my $clrf = qr/[\r\n]+/; + + sub output_filter { + my $filter = shift; + + my $left_over = ''; + while ($filter->read(my $buffer, 2)) { + $buffer = $left_over . $buffer; + $left_over = ''; + while ($buffer =~ /([^\r\n]*)([\r\n]*)/g) { + $left_over = $1, last unless $2; + $filter->print(scalar(reverse $1), $2); + } + } + $filter->print(scalar reverse $left_over) if length $left_over; + + Apache::OK; + } + + sub response { + my $r = shift; + + $r->content_type('text/plain'); + $r->puts(1..9, "0\n"); + $r->puts('a'..'z', "\n"); + + Apache::OK; + } + 1; + + +In this example when a request to I</reverse> is made, the response +handler C<Apache::ReverseFilter::response()> sends: + + 1234567890 + abcdefghijklmnopqrstuvwxyz + +as a response and the output filter handler +C<Apache::ReverseFilter::output_filter> reverses the lines, so the +client gets: + + 0987654321 + zyxwvutsrqponmlkjihgfedcba + +The reversing filter is quite simple: it reads from the output stream +in chunks of 1024 characters, and then prints all lines reversed +preserving the new line control characters at the end of each +line. The special handling of new lines is needed for cases where an +input line is longer than the buffer size, (1024 in our example), when +this happens we store the reminder of the string in C<$left_over> and +prepend it to the buffer when the next chunk is read. At the end we +print out the reminder of the input when there is no more data left on +the stream.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]