stas        2004/06/03 01:20:50

  Added:       t/protocol echo_bbs.t
               t/protocol/TestProtocol echo_bbs.pm
  Log:
  new test: test buckets manipulation inside the protocol handler
  
  Revision  Changes    Path
  1.1                  modperl-2.0/t/protocol/echo_bbs.t
  
  Index: echo_bbs.t
  ===================================================================
  use strict;
  use warnings FATAL => 'all';
  
  use Test;
  use Apache::TestUtil;
  use Apache::TestRequest ();
  
  my @test_strings = qw(hello world);
  
  plan tests => 1 + @test_strings;
  
  my $socket = Apache::TestRequest::vhost_socket('TestProtocol::echo_bbs');
  
  ok $socket;
  
  for (@test_strings) {
      print $socket "$_\n";
      chomp(my $reply = <$socket>||'');
      ok t_cmp(uc($_), $reply);
  }
  
  
  
  1.1                  modperl-2.0/t/protocol/TestProtocol/echo_bbs.pm
  
  Index: echo_bbs.pm
  ===================================================================
  package TestProtocol::echo_bbs;
  
  # this test is similar to TestProtocol::echo_filter, but performs the
  # manipulations on the buckets inside the connection handler, rather
  # then using filter
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Connection ();
  use APR::Socket ();
  use APR::Bucket ();
  use APR::Brigade ();
  use APR::Error ();
  
  use Apache::Const -compile => qw(OK MODE_GETLINE);
  use APR::Const    -compile => qw(SUCCESS EOF SO_NONBLOCK);
  
  sub handler {
      my $c = shift;
  
      # starting from Apache 2.0.49 several platforms require you to set
      # the socket to a blocking IO mode
      $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);
  
      while (1) {
          my $rc = $c->input_filters->get_brigade($bb_in,
                                                  Apache::MODE_GETLINE);
          if ($rc != APR::SUCCESS && $rc != APR::EOF) {
              my $error = APR::Error::strerror($rc);
              warn __PACKAGE__ . ": get_brigade: $error\n";
              last;
          }
  
          last if $bb_in->is_empty;
  
          while (!$bb_in->is_empty) {
              my $bucket = $bb_in->first;
  
              $bucket->remove;
  
              if ($bucket->is_eos) {
                  $bb_out->insert_tail($bucket);
                  last;
              }
  
              my $data = $bucket->read;
              if (length $data) {
                  last if $data =~ /^[\r\n]+$/;
                  $bucket = APR::Bucket->new(uc $data);
              }
  
              $bb_out->insert_tail($bucket);
          }
  
          $c->output_filters->fflush($bb_out);
      }
  
      $bb_in->destroy;
      $bb_out->destroy;
  
      Apache::OK;
  }
  
  1;
  
  
  

Reply via email to