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 2004/06/03 10:43:13 UTC

cvs commit: modperl-docs/src/docs/2.0/user/handlers protocols.pod

stas        2004/06/03 01:43:12

  Modified:    src/docs/2.0/user/handlers protocols.pod
  Log:
  sync the code with reality
  
  Revision  Changes    Path
  1.21      +61 -36    modperl-docs/src/docs/2.0/user/handlers/protocols.pod
  
  Index: protocols.pod
  ===================================================================
  RCS file: /home/cvs/modperl-docs/src/docs/2.0/user/handlers/protocols.pod,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -u -r1.20 -r1.21
  --- protocols.pod	2 Jun 2004 19:09:52 -0000	1.20
  +++ protocols.pod	3 Jun 2004 08:43:12 -0000	1.21
  @@ -226,7 +226,7 @@
   Here is the code:
   
     file:MyApache/EchoSocket.pm
  -  ------------------
  +  ---------------------------
     package MyApache::EchoSocket;
     
     use strict;
  @@ -326,8 +326,8 @@
   
     Connection closed by foreign host.
   
  -As you can see the response now was all in lower case, because of the
  -output filter.
  +As you can see the response part this time was all in lower case,
  +because of the output filter.
   
   And here is the implementation of the connection and the filter
   handlers.
  @@ -340,25 +340,27 @@
     use warnings FATAL => 'all';
     
     use Apache::Connection ();
  +  use APR::Socket ();
     use APR::Bucket ();
     use APR::Brigade ();
  -  use APR::Util ();
  +  use APR::Error ();
     
  -  use APR::Const -compile => qw(SUCCESS EOF);
  +  use APR::Const    -compile => qw(SUCCESS EOF SO_NONBLOCK);
     use Apache::Const -compile => qw(OK MODE_GETLINE);
     
     sub handler {
         my $c = shift;
     
  +      $c->client_socket->opt_set(APR::SO_NONBLOCK => 0);
  +  
         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,
  +          my $rc = $c->input_filters->get_brigade($bb_in,
                                                     Apache::MODE_GETLINE);
  -          if ($rv != APR::SUCCESS && $rv != APR::EOF) {
  -              my $error = APR::strerror($rv);
  +          if ($rc != APR::SUCCESS && $rc != APR::EOF) {
  +              my $error = APR::Error::strerror($rc);
                 warn __PACKAGE__ . ": get_brigade: $error\n";
                 last;
             }
  @@ -375,26 +377,23 @@
                     last;
                 }
     
  -              my $data;
  -              my $status = $bucket->read($data);
  -              return $status unless $status == APR::SUCCESS;
  -  
  -              if ($data) {
  -                  $last++ if $data =~ /^[\r\n]+$/;
  -                  # could do something with the data here
  +              my $data = $bucket->read;
  +              if (length $data) {
  +                  last if $data =~ /^[\r\n]+$/;
  +                  # could do some transformation on data here
                     $bucket = APR::Bucket->new($data);
                 }
     
                 $bb_out->insert_tail($bucket);
             }
     
  -          my $b = APR::Bucket::flush_create($c->bucket_alloc);
  -          $bb_out->insert_tail($b);
  +          my $fb = APR::Bucket::flush_create($c->bucket_alloc);
  +          $bb->insert_tail($fb);
             $c->output_filters->pass_brigade($bb_out);
  -          last if $last;
         }
     
         $bb_in->destroy;
  +      $bb_out->destroy;
     
         Apache::OK;
     }
  @@ -440,6 +439,19 @@
   bucket brigade is passed out to the outgoing connection filters, it
   won't be buffered but sent to the client right away.
   
  +It's possible to make the flushing code simpler, by using a dedicated
  +method C<L<fflush()|docs::2.0::api::Apache::Filter/C_fflush_>> that
  +does just that -- flushing of the bucket brigade. It replaces 3 lines
  +of code:
  +
  +          my $fb = APR::Bucket::flush_create($c->bucket_alloc);
  +          $bb_out->insert_tail($fb);
  +          $c->output_filters->pass_brigade($bb_out);
  +
  +with just one line:
  +
  +          $c->output_fiilters->fflush($bb_out);
  +
   If you look at the complete handler, the loop is terminated when one
   of the following conditions occurs: an error happens, the end of
   stream bucket has been seen (no more input at the connection) or when
  @@ -455,25 +467,38 @@
   it's inserted to the outgoing brigade.
   
   We will skip the filter discussion here, since we are going to talk in
  -depth about filters in the dedicated to filters sections. But all you
  -need to know at this stage is that the data sent from the connection
  -handler is filtered by the outgoing filter and which transforms it to
  -be all lowercase.
  -
  -Also it's worth mentioning
  -C<L<fflush()|docs::2.0::api::Apache::Filter/C_fflush_>>, which can
  -replace 3 lines of code:
  -
  -          my $b = APR::Bucket::flush_create($c->bucket_alloc);
  -          $bb_out->insert_tail($b);
  -          $c->output_filters->pass_brigade($bb_out);
  -
  -with just one line:
  -
  -          $c->output_fiilters->fflush($bb_out);
  -
  +depth about filters in L<the dedicated to filters
  +tutorial|docs::2.0::user::handlers::filter>. But all you need to know
  +at this stage is that the data sent from the connection handler is
  +filtered by the outgoing filter and which transforms it to be all
  +lowercase.
   
  +And here is the simplified version of this handler, which doesn't
  +attempt to do any transformation, but simply passes the data though:
   
  +  sub handler {
  +      my $c = shift;
  +  
  +      $c->client_socket->opt_set(APR::SO_NONBLOCK => 0);
  +  
  +      my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc);
  +  
  +      while (1) {
  +          my $rc = $c->input_filters->get_brigade($bb,
  +                                                  Apache::MODE_GETLINE);
  +          if ($rc != APR::SUCCESS && $rc != APR::EOF) {
  +              my $error = APR::Error::strerror($rc);
  +              warn __PACKAGE__ . ": get_brigade: $error\n";
  +              last;
  +          }
  +  
  +          $c->output_filters->fflush($bb);
  +      }
  +  
  +      $bb->destroy;
  +  
  +      Apache::OK;
  +  }
   
   
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: docs-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: docs-cvs-help@perl.apache.org