Author: stas
Date: Mon May  9 19:08:49 2005
New Revision: 169395

URL: http://svn.apache.org/viewcvs?rev=169395&view=rev
Log:
add a test which demonstrates the buffering of data, modifying its length and 
setting the correct C-L header before sending it out

Added:
    perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm   (with props)
    perl/modperl/trunk/t/filter/out_str_buffer.t   (with props)

Added: perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm
URL: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm?rev=169395&view=auto
==============================================================================
--- perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm (added)
+++ perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm Mon May  9 
19:08:49 2005
@@ -0,0 +1,98 @@
+package TestFilter::out_str_buffer;
+
+# in this test we want to buffer the data, modify the length of the
+# response, set the c-l header and make sure that the client sees the
+# right thing
+#
+# notice that a bucket brigades based filter must be used. The streaming
+# API lets FLUSH buckets through which causes an early flush of HTTP
+# response headers
+
+use strict;
+use warnings FATAL => 'all';
+
+use Apache2::RequestRec ();
+use Apache2::RequestIO ();
+
+use APR::Table ();
+use APR::Bucket ();
+use APR::Brigade ();
+
+use TestCommon::Utils ();
+
+use base qw(Apache2::Filter);
+
+use Apache2::Const -compile => qw(OK M_POST);
+use APR::Const     -compile => ':common';
+
+sub flatten_bb {
+    my ($bb) = shift;
+
+    my $seen_eos = 0;
+
+    my @data;
+    for (my $b = $bb->first; $b; $b = $bb->next($b)) {
+        $seen_eos++, last if $b->is_eos;
+        $b->read(my $bdata);
+        push @data, $bdata;
+    }
+    return (join('', @data), $seen_eos);
+}
+
+sub handler {
+    my($filter, $bb) = @_;
+
+    my $ctx = $filter->ctx;
+
+    # no need to unset the C-L header, since this filter makes sure to
+    # correct it before any headers go out.
+    #unless ($ctx) {
+    #    $filter->r->headers_out->unset('Content-Length');
+    #}
+
+    my $data = exists $ctx->{data} ? $ctx->{data} : '';
+    $ctx->{invoked}++;
+    my($bdata, $seen_eos) = flatten_bb($bb);
+    $bdata =~ s/-//g;
+    $data .= $bdata if $bdata;
+
+    if ($seen_eos) {
+        my $len = length $data;
+        $filter->r->headers_out->set('Content-Length', $len);
+        $filter->print($data) if $data;
+    }
+    else {
+        # store context for all but the last invocation
+        $ctx->{data} = $data;
+        $filter->ctx($ctx);
+    }
+
+    return Apache2::Const::OK;
+}
+
+sub response {
+    my $r = shift;
+
+    $r->content_type('text/plain');
+
+    my $data = '';
+    if ($r->method_number == Apache2::Const::M_POST) {
+        $data = TestCommon::Utils::read_post($r);
+        $r->headers_out->set('Content-Length' => length $data);
+    }
+
+    for my $chunk (split /0/, $data) {
+        $r->print($chunk);
+        $r->rflush; # so the filter reads a chunk at a time
+    }
+
+    return Apache2::Const::OK;
+}
+
+1;
+__DATA__
+
+SetHandler modperl
+PerlModule          TestFilter::out_str_buffer
+PerlResponseHandler TestFilter::out_str_buffer::response
+

Propchange: perl/modperl/trunk/t/filter/TestFilter/out_str_buffer.pm
------------------------------------------------------------------------------
    svn:eol-style = native

Added: perl/modperl/trunk/t/filter/out_str_buffer.t
URL: 
http://svn.apache.org/viewcvs/perl/modperl/trunk/t/filter/out_str_buffer.t?rev=169395&view=auto
==============================================================================
--- perl/modperl/trunk/t/filter/out_str_buffer.t (added)
+++ perl/modperl/trunk/t/filter/out_str_buffer.t Mon May  9 19:08:49 2005
@@ -0,0 +1,22 @@
+use strict;
+use warnings FATAL => 'all';
+
+use Apache::Test;
+use Apache::TestRequest;
+use Apache::TestUtil;
+
+plan tests => 2;
+
+my $sep = "-0-";
+my $data = join $sep, "aa" .. "zz";
+
+(my $expected = $data) =~ s/$sep//g;
+my $expected_len = length $expected;
+
+my $location = '/TestFilter__out_str_buffer';
+my $res = POST $location, content => $data;
+#t_debug $res->as_string;
+my $received_len = $res->header('Content-Length') || 0;
+ok t_cmp $received_len, $expected_len, "Content-Length header";
+ok t_cmp $res->content, $expected, "filtered data";
+

Propchange: perl/modperl/trunk/t/filter/out_str_buffer.t
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to