Any-Daemon-HTTP
view release on metacpan or search on metacpan
lib/Any/Daemon/HTTP/Proxy.pm view on Meta::CPAN
# Copyrights 2013-2020 by [Mark Overmeer].
# For other contributors see ChangeLog.
# See the manual pages for details on the licensing terms.
# Pod stripped from pm file by OODoc 2.02.
# This code is part of distribution Any-Daemon-HTTP. Meta-POD processed
# with OODoc into POD and HTML manual-pages. See README.md
# Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
package Any::Daemon::HTTP::Proxy;
use vars '$VERSION';
$VERSION = '0.30';
use parent 'Any::Daemon::HTTP::Source';
use warnings;
use strict;
use Log::Report 'any-daemon-http';
use LWP::UserAgent ();
use HTTP::Status qw(HTTP_TOO_MANY_REQUESTS);
use Time::HiRes qw(time);
sub init($)
{ my ($self, $args) = @_;
$self->SUPER::init($args);
$self->{ADHDP_ua} = $args->{user_agent}
|| LWP::UserAgent->new(keep_alive => 30);
$self->{ADHDP_via} = $args->{via};
if(my $fm = $args->{forward_map})
{ $self->{ADHDP_map} = $fm eq 'RELAY' ? sub {$_[3]} : $fm;
}
if(my $rem = $args->{remote_proxy})
{ $self->{ADHDP_proxy} = ref $rem eq 'CODE' ? $rem : sub {$rem};
}
$self->{ADHDP_fwd_to} = $args->{forward_timeout} // 100;
# to be run before a request can be sent off
my @prepare =
( $self->stripHeaders($args->{strip_req_headers})
, $self->addHeaders ($args->{add_req_headers})
, $args->{change_request} || ()
);
# to be run before a response is passed on the the client
my @postproc =
( $self->stripHeaders($args->{strip_resp_headers})
, $self->addHeaders ($args->{add_resp_headers})
, $args->{change_response} || ()
);
$self->{ADHDP_prepare} = \@prepare;
$self->{ADHDP_postproc} = \@postproc;
$self;
}
#-----------------
sub userAgent() {shift->{ADHDP_ua}}
sub via() {shift->{ADHDP_via}}
sub forwardMap(){shift->{ADHDP_map}}
sub remoteProxy(@)
{ my $rem = shift->{ADHDP_proxy};
$rem ? $rem->(@_) : undef;
}
#-----------------
my $last_used_proxy = '';
sub _collect($$$$)
{ my ($self, $vhost, $session, $req, $rel_uri) = @_;
my $resp;
my $vhost_name = $vhost ? $vhost->name : '';
my $tohost = $req->header('Host') || $vhost_name;
#XXX MO: need to support https as well
my $uri = URI->new_abs($rel_uri, "http://$tohost");
# Via: RFC2616 section 14.45
( run in 0.585 second using v1.01-cache-2.11-cpan-99c4e6809bf )