[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Input Filter Problem


I have a problem with a filter and a content handler:

httpd.conf:

...
PerlInputFilterHandler Apache::Filter1
PerlResponseHandler Apache::TestPost
...
--------------------------%<--------------------------------------------
-

Apache::Filter1.pm:

package Apache::Filter1;

use strict;

use Apache2::Const qw(:common);
use Apache2::Filter ();
use Apache2::Log ();
use Apache2::RequestRec ();

sub handler {
	my $f = shift;

	my $r = $f->r;
	my $buffer;
	my $context = $f->ctx;
	if ($context) {
		$buffer = $context;
	}
	while ($f->read (my $input)) {
		$buffer .= $input;
		$r->log->debug ("read <<$input>>");
	}
	if ($f->seen_eos) {
		$r->log->debug ("buffer = <<$buffer>>");
		my $printed = $f->print($buffer);
	} else {
		$f->ctx ($buffer);
		$f->print('');
	}
	Apache2::Const::OK;
}

1;
--------------------------%<--------------------------------------------
-

Apache::TestPost.pm:

#	Post Test

package Apache::TestPost;

use strict;
use Data::Dumper;
use HTTP::Response;

use Apache2::Const qw(:common :methods :http);
use Apache2::Log ();
use Apache2::URI ();
use APR::Date ();
use APR::Table ();
use APR::URI ();

sub handler {
	my $r = shift;

	# copy content data, if any
	my ($buf, $input, $ret);
	my $bufsize = 3;
	while ($ret = $r->read ($buf, $bufsize) > 0) {
		$input .= $buf;
		$r->log->debug ("read <<$buf>>, ret = $ret");
	}
	$r->log->debug ("read <<$buf>>, ret = $ret");

	$r->content_type ("text/plain");
	print "Content\n$input\n-----------\n";
	OK;
}

1;
--------------------------%<--------------------------------------------
-

When I make a http-request, I get the following output:

> POST / HTTP/1.1
> Content-type: text/xml
> Content-Length: 10
> 
> 0123456789HTTP/1.1 200 OK
< Date: Mon, 11 Jun 2007 11:01:23 GMT
< Server: Apache
< Transfer-Encoding: chunked
< Content-Type: text/plain
Content
012
-----------

I am postin
0123456789
but I see onle
012
in the response. The debugging output is:
[Mon Jun 11 16:24:23 2007] [debug] Filter1.pm(25): read <<012>>
[Mon Jun 11 16:24:23 2007] [debug] Filter1.pm(25): read <<345>>
[Mon Jun 11 16:24:23 2007] [debug] Filter1.pm(25): read <<678>>
[Mon Jun 11 16:24:23 2007] [debug] Filter1.pm(25): read <<9>>
[Mon Jun 11 16:24:23 2007] [debug] Filter1.pm(28): buffer =
<<0123456789>>
[Mon Jun 11 16:24:23 2007] [debug] TestPost.pm(24): read <<012>>, ret =
1
[Mon Jun 11 16:24:23 2007] [debug] TestPost.pm(26): read <<>>, ret = 

What am I doing wrong?
Yes, I could increase $bufsize, but if I set it to 10000 and the input
is 10001 bytes, I have the same problem.
My filter Filter1.pm needs the hole input in one string, because it
makes an XML-transformation, therfore the input is collected and printet
out as whole at the end.

If I omit the line

  $f->print ('');

in Filter1.pm, I get the following error:
[Mon Jun 11 16:29:34 2007] [error] Apache2::RequestIO::read: Aborting
read from client. One of the input filters is broken. It returned an
empty bucket brigade for the APR_BLOCK_READ mode request at
/magwien/gondor-mod-perl2-2.6.5/Apache/TestPost.pm line 22, <DATA> line
799.

Why?

Thanks,
Peter


Mail converted by mhonarc 2.6.15
This archive provided courtesy of JSW4.NET, Internet Hosting Services for Small Business.