You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs-cvs@perl.apache.org by st...@apache.org on 2002/07/12 11:56:39 UTC
cvs commit: modperl-docs/src/docs/2.0/user/handlers handlers.pod
stas 2002/07/12 02:56:39
Modified: src/docs/2.0/user/handlers handlers.pod
Log:
work in progress, some notes regarding filters and protocols
Revision Changes Path
1.5 +124 -2 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.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- handlers.pod 28 Jun 2002 17:59:22 -0000 1.4
+++ handlers.pod 12 Jul 2002 09:56:39 -0000 1.5
@@ -60,7 +60,7 @@
Handlers of the type C<RUN_FIRST> will be executed in the order they
have been registered until the first handler that returns something
-other than C<Apache::DECLINE>. If the return value is C<Apache::OK>,
+other than C<Apache::DECLINED>. If the return value is C<Apache::OK>,
the next handler in the chain will be run. If the return value is
C<Apache::DECLINED> the next phase will start. In all other cases the
execution will be aborted.
@@ -69,7 +69,7 @@
Handlers of the type C<RUN_ALL> will be executed in the order they
have been registered until the first handler that returns something
-other than C<Apache::OK> or C<Apache::DECLINE>.
+other than C<Apache::OK> or C<Apache::DECLINED>.
=back
@@ -226,11 +226,29 @@
soon as possible. The core server uses this phase to setup the
connection record based on the type of connection that is being used.
+In mod_perl 1.0 during code development C<Apache::Reload> was used to
+automatically reload modified since the last request Perl modules. It
+was invoked during C<post_read_request>, the first HTTP request's
+phase. In mod_perl 2.0 I<pre_connection> is the earliest phase, so if
+we want to make sure that all modified Perl modules are reloaded for
+any protocols and its phases, it's the best to set the scope of the
+Perl interpreter to the lifetime of the connection and invoke the
+C<Apache::Reload> handler during the I<pre_connection> phase. However
+this development-time advantage can become a disadvantage in
+production--for example if a connection, handled by HTTP protocol, is
+configured as C<KeepAlive> and there are several requests coming on
+the same connection and only one handled by mod_perl and the others by
+the default images handler, the Perl interpreter won't be available to
+other threads while the images are being served.
+
This phase is of type C<RUN_ALL>.
The handler's configuration scope is C<SRV>, because it's not known
yet which resource the request will be mapped to.
+
+
+
Example:
A I<pre_connection> handler accepts connection record and socket
@@ -271,6 +289,95 @@
return Apache::OK;
}
+META: the echo example doesn't work with filter, because it reads and
+writes directly from/to the socket. Here comes the echo_filter
+example. But may be echo is not so good, use something like
+eliza/'lc' to show the retrieval of the data, here is some eliza
+protocol code plus an output lc filter.
+
+ package Apache::Eliza2;
+
+ use strict;
+ use warnings FATAL => 'all';
+
+ use Apache::Connection ();
+ use APR::Bucket ();
+ use APR::Brigade ();
+ use APR::Util ();
+
+ require Chatbot::Eliza;
+
+ use APR::Const -compile => qw(SUCCESS EOF);
+ use Apache::Const -compile => qw(OK MODE_GETLINE);
+
+ my $eliza = new Chatbot::Eliza;
+
+ sub handler {
+ my Apache::Connection $c = shift;
+
+ my $bb_in = APR::Brigade->new($c->pool, $c->bucket_alloc);
+ my $bb_out = APR::Brigade->new($c->pool, $c->bucket_alloc);
+ my $last = 0;
+
+ while (1) {
+ my $rv = $c->input_filters->get_brigade($bb_in, Apache::MODE_GETLINE);
+
+ if ($rv != APR::SUCCESS or $bb_in->empty) {
+ my $error = APR::strerror($rv);
+ unless ($rv == APR::EOF) {
+ warn "[eliza] get_brigade: $error\n";
+ }
+ $bb_in->destroy;
+ last;
+ }
+
+ while (!$bb_in->empty) {
+ my $bucket = $bb_in->first;
+
+ $bucket->remove;
+
+ if ($bucket->is_eos) {
+ $bb_out->insert_tail($bucket);
+ last;
+ }
+
+ my $data;
+ my $status = $bucket->read($data);
+ return $status unless $status == APR::SUCCESS;
+
+ if ($data) {
+ $data =~ s/[\r\n]*$//;
+ $last++ if $data =~ /good bye/i;
+ $data = $eliza->transform( $data ) . "\n\n";
+ $bucket = APR::Bucket->new($data);
+ }
+
+ $bb_out->insert_tail($bucket);
+ }
+
+ my $b = APR::Bucket::flush_create($c->bucket_alloc);
+ $bb_out->insert_tail($b);
+ $c->output_filters->pass_brigade($bb_out);
+ last if $last;
+ }
+
+ Apache::OK;
+ }
+
+ use base qw(Apache::Filter);
+ use constant BUFF_LEN => 1024;
+
+ sub lowercase : FilterConnectionHandler {
+ my $filter = shift;
+
+ while ($filter->read(my $buffer, BUFF_LEN)) {
+ $filter->print(lc $buffer);
+ }
+
+ return Apache::OK;
+ }
+
+ 1;
=head1 HTTP Request Phases
@@ -584,6 +691,21 @@
</Location>
</VirtualHost>
+
+[META:
+
+Inside a connection filter the current connection object can be
+retrieved with:
+
+ my $c = $filter->c;
+
+Inside a request filter the current request object can be retrieved
+with:
+
+ my $r = $filter->r;
+
+This belongs to the Apache::Filter manpage and should be moved there.
+]
Now let's look at the input and output filters in details.
---------------------------------------------------------------------
To unsubscribe, e-mail: docs-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: docs-cvs-help@perl.apache.org