Apache2-ASP
view release on metacpan or search on metacpan
lib/Apache2/ASP/Test/UserAgent.pm view on Meta::CPAN
}# end submit_form()
#==============================================================================
sub get
{
my ($s, $uri) = @_;
chdir( $s->{cwd} );
no strict 'refs';
undef(${"$ContextClass\::instance"});
my $req = GET $uri;
{
no warnings 'uninitialized';
%ENV = ( DOCUMENT_ROOT => $ENV{DOCUMENT_ROOT} );
}
$ENV{REQUEST_METHOD} = 'GET';
my $cgi = $s->_setup_cgi( $req );
$ENV{CONTENT_TYPE} = 'application/x-www-form-urlencoded';
my $r = Apache2::ASP::Mock::RequestRec->new();
$r->uri( $uri );
$r->args( $cgi->{querystring} );
$r->{headers_in}->{Cookie} = $ENV{HTTP_COOKIE};
$s->context->setup_request( $r, $cgi );
return $s->_setup_response( $s->context->execute() );
}# end get()
#==============================================================================
sub add_cookie
{
my ($s, $name, $value) = @_;
$s->{cookies}->{$name} = $value;
}# end add_cookie()
#==============================================================================
sub _setup_response
{
my ($s, $response_code) = @_;
$response_code = 200 if $response_code == 0;
my $response = HTTP::Response->new( $response_code );
$response->content( $s->context->get_prop('r')->buffer );
$response->header( 'Content-Type' => $s->context->response->{ContentType} );
foreach my $header ( $s->context->response->Headers )
{
while( my ($k,$v) = each(%$header) )
{
$response->header( $k => $v );
if( lc($k) eq 'set-cookie' )
{
my ($data) = split /;/, $v;
my ($name,$val) = map { Apache2::ASP::SimpleCGI->unescape( $_ ) } split /\=/, $data;
$s->add_cookie( $name => $val );
}# end if()
}# end while()
}# end foreach()
if( $s->context->session && $s->context->session->{SessionID} )
{
$s->add_cookie(
$s->context->config->data_connections->session->cookie_name => $s->context->session->{SessionID}
);
}# end if()
$s->context->r->pool->call_cleanup_handlers();
weaken($s->context->{cgi});
return $response;
}# end _setup_response()
#==============================================================================
sub _setup_cgi
{
my ($s, $req) = @_;
my $docroot = $ENV{DOCUMENT_ROOT};
$s->{c}->DESTROY
if $s->{c};
$req->referer( $s->{referer} || '' );
($s->{referer}) = $req->uri =~ m/.*?(\/[^\?]+)/;
no warnings 'redefine';
*HTTP::Request::AsCGI::stdout = sub { 0 };
$s->{c} = HTTP::Request::AsCGI->new($req)->setup;
$ENV{SERVER_NAME} = $ENV{HTTP_HOST} = 'localhost';
unless( $req->uri =~ m@^/handlers@ )
{
my ($uri_no_args) = split /\?/, $req->uri;
$ENV{SCRIPT_FILENAME} = $s->context->config->web->www_root . $uri_no_args;
$ENV{SCRIPT_NAME} = $uri_no_args;
}# end unless()
# User-Agent:
$req->header( 'User-Agent' => 'test-useragent v1.0' );
$ENV{HTTP_USER_AGENT} = 'test-useragent v1.0';
# Cookies:
my @cookies = ();
while( my ($name,$val) = each(%{ $s->{cookies} } ) )
{
next unless $name && $val;
push @cookies, "$name=" . Apache2::ASP::SimpleCGI->escape($val);
}# end while()
$req->header( 'Cookie' => join ';', @cookies ) if @cookies;
$ENV{HTTP_COOKIE} = join ';', @cookies;
$ENV{DOCUMENT_ROOT} = $docroot
if $docroot;
if( $ENV{REQUEST_METHOD} =~ m/^post$/i )
{
# Set up the basic params:
return Apache2::ASP::SimpleCGI->new(
querystring => $ENV{QUERY_STRING},
body => $req->content,
content_type => $req->headers->{'content-type'},
content_length => $req->headers->{'content-length'},
);
}
else
{
# Simple 'GET' request:
return Apache2::ASP::SimpleCGI->new( querystring => $ENV{QUERY_STRING} );
}# end if()
}# end _setup_cgi()
1;# return true:
=pod
=head1 NAME
Apache2::ASP::Test::UserAgent - Execute ASP scripts without a webserver.
=head1 SYNOPSIS
Generally you will be accessing this class from wither L<Apache2::ASP::Test::Base>
or L<Apache2::ASP::API>.
my $asp = Apache2::ASP::API->new()
-- or --
my $asp = Apache2::ASP::Test::Base->new();
# Get:
my $res = $asp->ua->get("/index.asp");
if( $res->is_succes ) {
...
}
# Post:
my $res = $asp->ua->post("/handlers/contact.form", [
name => "Fred",
email => 'fred@flintstone.org',
message => 'This is a test email message.'
]);
# Do the same thing, but with HTML::Form:
use HTML::Form;
my $form = HTML::Form->parse( $asp->ua->get("/contact.asp")->content, '/' );
$form->find_input('name')->value('Fred');
$form->find_input('email')->value('fred@flintstone.org');
$form->find_input('message')->value('This is a test email message');
( run in 1.195 second using v1.01-cache-2.11-cpan-39bf76dae61 )