App-HTTP_Proxy_IMP
view release on metacpan or search on metacpan
lib/App/HTTP_Proxy_IMP/Relay.pm view on Meta::CPAN
my $idlet = AnyEvent->timer(
after => 5,
interval => 5, cb => sub {
@relays = grep { $_ } @relays or return;
#debug("check timeouts for %d conn",+@relays);
my $now = AnyEvent->now;
RELAY: for my $r (@relays) {
# timeout depends on the state of the relay and child
# if there are active requests set it to 60, if not (e.g.
# idle keep-alive connections) to 30. If this is a forked
# child with no listener which should close after all
# requests are done close idle keep-alive connections faster,
# e.g. set timeout to 1
my $idle = ! $r->{conn}->open_requests;
my $timeout =
! $idle ? 60 :
$exit_if_no_relays ? 1 :
30;
for my $fo (@{$r->{fds}}) {
next RELAY if $_->{didit} + $timeout > $now;
}
$r->xdebug("close because of timeout");
lib/App/HTTP_Proxy_IMP/Request.pm view on Meta::CPAN
'connected', # false|CONN_HOST|CONN_INTERNAL
'imp_analyzer', # App::HTTP_Proxy_IMP::IMP object
'defer_rqhdr', # deferred request header (wait until body length known)
'defer_rqbody', # deferred request body (wait until header can be sent)
'method', # request method
'rqhost', # hostname from request
'rq_version', # version of request
'rp_encoder', # sub to encode response body (chunked)
'keep_alive', # do we use keep_alive in response
);
use App::HTTP_Proxy_IMP::Debug qw(debug $DEBUG debug_context);
use Scalar::Util 'weaken';
use Net::Inspect::Debug 'trace';
use Net::IMP qw(:DEFAULT :log);
use Net::IMP::HTTP; # constants
use Sys::Hostname 'hostname';
my $HOSTNAME = hostname();
lib/App/HTTP_Proxy_IMP/Request.pm view on Meta::CPAN
$self->{rqhost} = $host;
if ( $met eq 'CONNECT' and ! $self->{up_proxy} ) {
# just skip all the header manipulation and normalization, we don't
# need your stinkin header!
$hdr = '';
goto SRVCON;
}
# do we want/support persistence?
my %conn = map { lc($_) => 1 } grep { m{\b(close|keep-alive)\b}i } (
@{ delete $head->{connection} || [] },
defined($self->{me_proxy})
? @{ delete $head->{'proxy-connection'} || [] } : ()
);
if ( keys %conn > 1 ) {
# fall back to close
$self->{keep_alive} = 0;
$head->{connection} = [ 'close' ];
} elsif ( $conn{close} ) {
$self->{keep_alive} = 0;
# default in 1.1 is keep-alive
$head->{connection} = [ 'close' ] if $version eq '1.1';
} elsif ( $conn{'keep-alive'} ) {
$self->{keep_alive} = 1;
# default in 1.0 is close
$head->{connection} = [ 'keep-alive' ] if $version eq '1.0';
} else {
# use default of version
$self->{keep_alive} = $version eq '1.1';
}
# if we are a proxy set a via tag
if ( my $via = $self->{me_proxy} ) {
push @{$head->{via}}, "$version $via";
}
# normalize header before forwarding it
# sort keys, normalize case of keys etc
$hdr = "$met ".( $self->{up_proxy} ? $url : $path )." HTTP/$version\r\n";
lib/App/HTTP_Proxy_IMP/Request.pm view on Meta::CPAN
}
$hdr .= "\r\n";
SRVCON:
if ( $xhdr->{internal_url} ) {
# the IMP plugin rewrote the url to internal://smthg,
# meaning, that the plugin will provide us with the real response
$self->{acct}{internal} = 1;
$self->{connected} = CONN_INTERNAL;
$self->{keep_alive} = 0;
# accept more body data
_call_spooled_this($conn);
$relay->mask(0,r=>1);
# inject minimal response into Net::Inspect, which than can modify
# it at will
# IMP let us not change nothing (e.g. empty body) into something, so
# we need to provide minimal content where content is expected
$conn->in(1,
lib/App/HTTP_Proxy_IMP/Request.pm view on Meta::CPAN
$head->{'transfer-encoding'} = [ 'chunked' ];
delete $head->{'content-length'};
$DEBUG && $self->xdebug("no clen known - use chunked encoding");
$self->{rp_encoder} = sub {
my $data = shift;
sprintf("%x\r\n%s\r\n", length($data),$data)
};
} else {
# disable persistance, we will end with EOF
$DEBUG && $self->xdebug("no clen known - use eof to end response");
$self->{keep_alive} = 0;
}
}
# set connection header if behavior is not default
if ( $version eq '1.1' and ! $self->{keep_alive} ) {
$head->{connection} = [ 'close' ];
} elsif ( $version eq '1.0' and $self->{keep_alive} ) {
$head->{connection} = [ 'keep-alive' ];
} else {
delete $head->{connection}
}
# create normalized header
$hdr = $status_line;
for my $k ( sort keys %$head) {
$hdr .= "\u$k: $_\r\n" for @{$head->{$k}};
}
lib/App/HTTP_Proxy_IMP/Request.pm view on Meta::CPAN
$data = $encode->($data) if $data ne '';
$data.= $encode->('') if $eof;
}
if ( $data ne '' ) {
$DEBUG && $self->xdebug("send ".length($data)." bytes to c");
$relay->forward(1,0,$data);
}
if ($eof) {
$relay->account('request');
if ( ! $self->{keep_alive} ) {
# close connection
$DEBUG && $self->xdebug("end of request: close");
return $relay->close;
}
# keep connection open
# and continue with next request if we have one
$DEBUG && $self->xdebug("end of request: keep-alive");
_call_spooled_next( $self->{conn} );
}
}
############################################################################
# Websockets, TLS upgrades etc
# if not IMP the forwarding will be done inside this function, otherwise it
# will be done in _in_data_imp, which gets called by IMP callback
############################################################################
sub in_data {
( run in 0.530 second using v1.01-cache-2.11-cpan-df04353d9ac )