blob: 1951b0e1a93591348c5436d328df8efdbed47bd1 [file] [log] [blame]
# please insert nothing before this line: -*- mode: cperl; cperl-indent-level: 4; cperl-continued-statement-offset: 4; indent-tabs-mode: nil -*-
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
# it also demonstrates how to use a single bucket bridade to do all
# the manipulation
use strict;
use warnings FATAL => 'all';
use Apache2::Connection ();
use APR::Socket ();
use APR::Bucket ();
use APR::Brigade ();
use APR::Error ();
use Apache::TestTrace;
use Apache2::Const -compile => qw(OK MODE_GETLINE);
use APR::Const -compile => qw(SUCCESS SO_NONBLOCK);
use APR::Status ();
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::Const::SO_NONBLOCK, 0);
my $bb = APR::Brigade->new($c->pool, $c->bucket_alloc);
while (1) {
debug "asking new line";
my $rc = $c->input_filters->get_brigade($bb, Apache2::Const::MODE_GETLINE);
last if APR::Status::is_EOF($rc);
die APR::Error::strerror($rc) unless $rc == APR::Const::SUCCESS;
for (my $b = $bb->first; $b; $b = $bb->next($b)) {
last if $b->is_eos;
debug "processing new line";
if ($b->read(my $data)) {
last if $data =~ /^[\r\n]+$/;
my $nb = APR::Bucket->new($bb->bucket_alloc, uc $data);
# head->...->$nb->$b ->...->tail
# XXX: the next 3 lines could be replaced with a
# wrapper function $b->replace($nb);
$b->insert_before($nb);
$b->delete;
$b = $nb;
}
}
$c->output_filters->fflush($bb);
}
$bb->destroy;
Apache2::Const::OK;
}
1;