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