Apache-Test
view release on metacpan or search on metacpan
lib/Apache/TestRequest.pm view on Meta::CPAN
# IO::Socket:SSL raw socket compatibility
$conn_opts->{SSL_ca_file} = $cafile;
}
eval { $UA ||= __PACKAGE__->new(%$args); };
}
sub user_agent_request_num {
my $res = shift;
$res->header('Client-Request-Num') || #lwp 5.60
$res->header('Client-Response-Num'); #lwp 5.62+
}
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;
lib/Apache/TestRequest.pm view on Meta::CPAN
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.
my $ssl = $self->_get_ssl_object;
my ($got, $rv, $errs);
my $reply = '';
while (1) {
($got, $rv) = Net::SSLeay::read($ssl, 1);
if (! defined $got) {
my $err = Net::SSLeay::get_error($ssl, $rv);
if ($err != Net::SSLeay::ERROR_WANT_READ() and
$err != Net::SSLeay::ERROR_WANT_WRITE()) {
$errs = Net::SSLeay::print_errs('SSL_read');
last;
}
next;
}
last if $got eq ''; # EOF
$reply .= $got;
last if $got eq "\n";
}
wantarray ? ($reply, $errs) : $reply;
},
);
sub getline {
my $sock = shift;
my $class = ref $sock;
my $method = $getline{$class} || 'getline';
$sock->$method();
}
sub socket_trace {
my $sock = shift;
return unless $sock->can('get_peer_certificate');
#like having some -v info
my $cert = $sock->get_peer_certificate;
print "#Cipher: ", $sock->get_cipher, "\n";
print "#Peer DN: ", $cert->subject_name, "\n";
}
sub prepare {
my $url = shift;
if ($have_lwp) {
user_agent();
$url = resolve_url($url);
}
else {
lwp_debug() if $ENV{APACHE_TEST_DEBUG_LWP};
}
my($pass, $keep) = Apache::TestConfig::filter_args(\@_, \%wanted_args);
%credentials = ();
if (defined $keep->{username}) {
$credentials{$keep->{realm} || '__ALL__'} =
[$keep->{username}, $keep->{password}];
}
if (defined(my $content = $keep->{content})) {
if ($content eq '-') {
$content = join '', <STDIN>;
}
elsif ($content =~ /^x(\d+)$/) {
$content = 'a' x $1;
}
push @$pass, content => $content;
}
if (exists $keep->{cert}) {
set_client_cert($keep->{cert});
}
return ($url, $pass, $keep);
}
sub UPLOAD {
my($url, $pass, $keep) = prepare(@_);
local $RedirectOK = exists $keep->{redirect_ok}
? $keep->{redirect_ok}
: $RedirectOK;
if ($keep->{filename}) {
return upload_file($url, $keep->{filename}, $pass);
}
else {
return upload_string($url, $keep->{content});
}
}
sub UPLOAD_BODY {
UPLOAD(@_)->content;
}
sub UPLOAD_BODY_ASSERT {
content_assert(UPLOAD(@_));
}
#lwp only supports files
sub upload_string {
my($url, $data) = @_;
my $CRLF = "\015\012";
my $bound = 742617000027;
my $req = HTTP::Request->new(POST => $url);
my $content = join $CRLF,
"--$bound",
"Content-Disposition: form-data; name=\"HTTPUPLOAD\"; filename=\"b\"",
"Content-Type: text/plain", "",
$data, "--$bound--", "";
$req->header("Content-Length", length($content));
$req->content_type("multipart/form-data; boundary=$bound");
$req->content($content);
$UA->request($req);
}
( run in 0.786 second using v1.01-cache-2.11-cpan-39bf76dae61 )