You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Brandon Allgood <al...@numerate.com> on 2009/07/14 23:35:10 UTC
RE: trying to add header field using PerlInputFilterHandler to proxy packets
FYI, this answered my question and everything is working.
thanks,
Brandon
-----Original Message-----
From: Torsten Foertsch [mailto:torsten.foertsch@gmx.net]
Sent: Tuesday, June 30, 2009 1:00 AM
To: modperl@perl.apache.org
Cc: Brandon Allgood
Subject: Re: trying to add header field using PerlInputFilterHandler to proxy packets
On Tue 30 Jun 2009, Brandon Allgood wrote:
> PerlInputFilterHandler company::AddHeader
>
> and I wrote the following example handler
>
> package company::AddHeader;
>
> use strict;
> use warnings;
>
> use Apache2::Filter ();
> use Apache2::RequestRec ();
> use APR::Table ();
>
> use Apache2::Const -compile => qw(OK DECLINED);
>
> my $debug = 1;
>
> sub handler {
> my $f = shift;
>
> # if we have already seen this do nothing
> return Apache2::Const::DECLINED if $f->ctx;
>
> # get headers
> my $headers_in = $f->r->headers_in();
>
> # add header field
> $headers_in->set("Message","Hi Mom");
> $f->r->headers_in($headers_in);
>
> if($debug)
> {
> open FILE, ">>/tmp/out.log" or die $!;
> foreach my $key (keys %{$headers_in})
> {
> print FILE "$key = $headers_in->{$key}\n";
> }
> close FILE;
> }
>
> $f->ctx(1);
>
> return Apache2::Const::OK;
> }
> 1;
>
> As you can see, if debugging is turned on the headers are written to
> the file /tmp/out.log. The contents of out.log contains the new
> header, but the requests being forwarded by the proxy don't seem to be
> altered. Why is the new header not being sent?
A request level input filter is called when the request body is read.
mod_proxy does this obviously *after* sending the request header to the backend server. Hence, adding an input header at this time is too late.
Why do you want to do that in a filter? Why don't you add it in a request phase prior to response. Fixup would be a good place for example.
PerlFixupHandler "sub { \
use Apache2::RequestRec; \
use Apache2::Const -compile=>'DECLINED'; \
$_[0]->headers_in->{Message}='Hi, Mom'; \
return Apache2::Const::DECLINED; \
}"
Another word to your filter, did you know you can remove a filter on first invocation? This way you can avoid the useless
return Apache2::Const::DECLINED if $f->ctx;
sub filter {
my ($f)=@_;
# do something
$f->remove;
return Apache2::Const::DECLINED;
}
I haven't benchmarked it but I believe this is faster than return if $f->ctx. But it only makes a difference of course if the filter is called more than once.
Torsten
--
Need professional mod_perl support?
Just hire me: torsten.foertsch@gmx.net