Apache-Test
view release on metacpan or search on metacpan
lib/Apache/TestRequest.pm view on Meta::CPAN
sub user_agent_keepalive {
$ENV{APACHE_TEST_HTTP11} = shift;
}
sub do_request {
my($ua, $method, $url, $callback) = @_;
my $r = HTTP::Request->new($method, resolve_url($url));
my $response = $ua->request($r, $callback);
lwp_trace($response);
}
sub hostport {
my $config = shift || Apache::Test::config();
my $vars = $config->{vars};
local $vars->{scheme} =
$Apache::TestRequest::Scheme || $vars->{scheme};
my $hostport = $config->hostport;
my $default_hostport = join ':', $vars->{servername}, $vars->{port};
if (my $module = $Apache::TestRequest::Module) {
$hostport = $module eq 'default'
? $default_hostport
: $config->{vhosts}->{$module}->{hostport};
}
$hostport || $default_hostport;
}
sub resolve_url {
my $url = shift;
Carp::croak("no url passed") unless defined $url;
return $url if $url =~ m,^(\w+):/,;
$url = "/$url" unless $url =~ m,^/,;
my $vars = Apache::Test::vars();
local $vars->{scheme} =
$Apache::TestRequest::Scheme || $vars->{scheme} || 'http';
scheme_fixup($vars->{scheme});
my $hostport = hostport();
return "$vars->{scheme}://$hostport$url";
}
my %wanted_args = map {$_, 1} qw(username password realm content filename
redirect_ok cert);
sub wanted_args {
\%wanted_args;
}
sub redirect_ok {
my $self = shift;
if ($have_lwp) {
# Return user setting or let LWP handle it.
return $RedirectOK if defined $RedirectOK;
return $self->SUPER::redirect_ok(@_);
}
# No LWP. We don't support redirect on POST.
return 0 if $self->method eq 'POST';
# Return user setting or our internal calculation.
return $RedirectOK if defined $RedirectOK;
return $REDIR;
}
my %credentials;
#subclass LWP::UserAgent
sub new {
my $self = shift->SUPER::new(@_);
lwp_debug(); #init from %ENV (set by Apache::TestRun)
my $config = Apache::Test::config();
if (my $proxy = $config->configure_proxy) {
#t/TEST -proxy
$self->proxy(http => "http://$proxy");
}
$self->timeout(UA_TIMEOUT);
$self;
}
sub credentials {
my $self = shift;
return $self->get_basic_credentials(@_);
}
sub get_basic_credentials {
my($self, $realm, $uri, $proxy) = @_;
for ($realm, '__ALL__') {
next unless $_ && $credentials{$_};
return @{ $credentials{$_} };
}
return (undef,undef);
}
sub vhost_socket {
my $module = shift;
local $Apache::TestRequest::Module = $module if $module;
my $hostport = hostport(Apache::Test::config());
my($host, $port) = split ':', $hostport;
my(%args) = (PeerAddr => $host, PeerPort => $port);
if ($module and ($module =~ /ssl/ || $module eq 'h2')) {
require IO::Socket::SSL;
# Add all conn_opts to args
map {$args{$_} = $conn_opts->{$_}} keys %{$conn_opts};
return IO::Socket::SSL->new(%args, Timeout => UA_TIMEOUT);
}
else {
require IO::Socket;
return IO::Socket::INET->new(%args);
}
}
#IO::Socket::SSL::getline does not correctly handle OpenSSL *_WANT_*.
#Could care less about performance here, just need a getline()
#that returns the same results with or without ssl.
#Inspired from Net::SSLeay::ssl_read_all().
my %getline = (
'IO::Socket::SSL' => sub {
my $self = shift;
# _get_ssl_object in IO::Socket::SSL only meant for internal use!
# But we need to compensate for unsufficient getline impl there.
( run in 1.588 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )