package Apache::ProxyPassThru;

use strict;
use LWP::UserAgent ();
use Apache::Constants ':common';

sub handler {
   my($r) = @_;
   return DECLINED unless $r->proxyreq;
   $r->handler("perl-script"); #ok, let's do it
   $r->push_handlers(PerlHandler => \&proxy_handler);
   return OK;
}

sub proxy_handler {
   my($r) = @_;
   my($key,$val);

   my $request = new HTTP::Request $r->method, $r->uri;

   my(%headers_in) = $r->headers_in;
   while(($key,$val) = each %headers_in) {
       $request->header($key,$val);
   }

   my $res = (new LWP::UserAgent)->request($request);
   $r->content_type($res->header('Content-type'));
   #feed reponse back into our request_rec*
   $r->status($res->code);
   $r->status_line(join " ", $res->code, $res->message);
   $res->scan(sub {
       $r->header_out(@_);
   });

   $r->send_http_header();
   $r->print($res->content);

   return OK;
}

1;

__END__

=head1 NAME

Apache::ProxyPassThru - Skeleton for vanilla proxy

=head1 SYNOPSIS

#httpd.conf or some such
PerlTransHandler  Apache::ProxyPassThru


=head1 DESCRIPTION

This module uses libwww-perl as it's web client, feeding the response
back into the Apache API request_rec structure.
`PerlHandler' will only be invoked if the request is a proxy request,
otherwise, your normal server configuration will handle the request.

=head1 SEE ALSO

mod_perl(3), Apache(3), LWP::UserAgent(3)

=head1 AUTHOR

Doug MacEachern <[email protected]>