HTTP::WebTest::Plugin::SetRequest - Initializes HTTP request for web test


HTTP-WebTest documentation Contained in the HTTP-WebTest distribution.

Index


Code Index:

NAME

Top

HTTP::WebTest::Plugin::SetRequest - Initializes HTTP request for web test

SYNOPSIS

Top

Not Applicable

DESCRIPTION

Top

This plugin initializes the HTTP request for a web test.

TEST PARAMETERS

Top

relative_urls

If set to yes than HTTP-WebTest supports relative URLs. See test parameter url for more information.

Allowed values

yes, no

Default value

no

url

URL to test.

If test parameter relative_urls is set to yes than URL for each test is treated as relative to the URL in the previous test. URL in the first test is treated as relative to http://localhost.

If test parameter relative_urls is set to no than each URL is treated as absolute. In this case if schema part of URL is omitted (i.e. URL doesn't start with http://, ftp://, etc) then http:// is implied.

method

HTTP request method.

See RFC 2616 (HTTP/1.1 protocol).

Allowed values

GET, POST

Default value

GET

http_headers

A list of HTTP header/value pairs. Can be used to override default HTTP headers or to add additional HTTP headers.

Example

    http_headers = ( Accept => text/plain, text/html )

params

A list of name/value pairs to be passed as parameters to the URL. (This element is used to test pages that process input from forms.)

If the method key is set to GET, these pairs are URI-escaped and appended to the requested URL.

Example (wtscript file):

    url = http://www.hotmail.com/cgi-bin/hmhome
    params = ( curmbox
               F001 A005
               from
               HotMail )

generates the HTTP request with URI:

    http://www.hotmail.com/cgi-bin/hmhome?curmbox=F001%20A005&from=HotMail

If the method key is set to POST, as long as all values are scalars they are URI-escaped and put into content of the HTTP request. application/x-www-form-urlencoded content type is set for such HTTP request.

If the method key is set to POST, some values may be defined as lists. In this case HTTP::WebTest uses multipart/form-data content type used for Form-based File Upload as specified in RFC 1867. Each parameter with list value is treated as file part specification with the following interpretation:

    ( FILE, FILENAME, HEADER => VALUE... )

where

* FILE

The name of a file to open. This file will be read and its content placed in the request.

* FILENAME

The optional filename to be reported in the request. If it is not specified than basename of FILE is used.

* HEADER => VALUE

Additional optional headers for file part.

Example (wtscript file):

    url = http://www.server.com/upload.pl
    method = post
    params = ( submit => ok
               file   => ( '/home/ilya/file.txt', 'myfile.txt' ) )

It generates HTTP request with /home/ilya/file.txt file included and reported under name myfile.txt.

auth

A list which contains two elements: userid/password pair to be used for web page access authorization.

proxies

A list of service name/proxy URL pairs that specify proxy servers to use for requests.

Example

    proxies = ( http => http://http_proxy.mycompany.com
                ftp  => http://ftp_proxy.mycompany.com )

pauth

A list which contains two elements: userid/password pair to be used for proxy server access authorization.

user_agent

Set the product token that is used to identify the user agent on the network.

Default value

HTTP-WebTest/NN

where NN is version number of HTTP-WebTest.

handle_redirects

If set to yes then HTTP-WebTest automatically follows redirects. It means that you never see HTTP responses with status codes 301 and 302. This feature is disabled if this test parameter is set to no.

Allowed values

yes, no

Default value

yes

timeout

Set the timeout value in seconds.

Default value

180

COPYRIGHT

Top

SEE ALSO

Top

HTTP::WebTest

HTTP::WebTest::API (HTTP::WebTest::API)

HTTP::WebTest::Plugin

HTTP::WebTest::Plugins (HTTP::WebTest::Plugins)


HTTP-WebTest documentation Contained in the HTTP-WebTest distribution.
# $Id: SetRequest.pm,v 1.20 2003/03/02 11:52:09 m_ilya Exp $

package HTTP::WebTest::Plugin::SetRequest;

use strict;
use URI;

use base qw(HTTP::WebTest::Plugin);

sub param_types {
    return q(url              uri
                          relative_urls    yesno
	     	     method           scalar('^(?:GET|POST)$')
 	      	     params           hashlist
	     	     auth             list('scalar','scalar')
	     	     proxies          hashlist
	     	     pauth            list('scalar','scalar')
	     	     http_headers     hashlist
                          user_agent       scalar
                          handle_redirects yesno
                          timeout          scalar);
}

sub prepare_request {
    my $self = shift;

    # get user agent object
    my $user_agent = $self->webtest->user_agent;

    # get request object
    my $request = $self->webtest->current_request;

    $self->validate_params(qw(url relative_urls method params
                              auth proxies pauth
                              http_headers user_agent
                              handle_redirects timeout));

    # get various params we handle
    my $url              = $self->test_param('url');
    my $relative_urls    = $self->yesno_test_param('relative_urls');
    my $method           = $self->test_param('method');
    my $params           = $self->test_param('params');
    my $auth             = $self->test_param('auth');
    my $proxies          = $self->test_param('proxies');
    my $pauth            = $self->test_param('pauth');
    my $headers          = $self->test_param('http_headers');
    my $ua_name          = $self->test_param('user_agent');
    my $handle_redirects = $self->yesno_test_param('handle_redirects', 1);
    my $timeout          = $self->test_param('timeout', 180);

    # set LWP's timeout
    $self->webtest->user_agent->timeout($timeout);

    # normalize uri
    if(defined $url) {
	if($relative_urls) {
	    my $current_test_num = $self->webtest->current_test_num;

	    my $prev_url = $current_test_num > 0 ?
		           $self->webtest->tests->[$current_test_num - 1]->request->uri :
			   'http://localhost/';

	    $url = URI->new_abs($url, $prev_url);
	} else {
	    # add shema part if it is missing
	    $url = "http://" . $url unless $url =~ m|^\w+://|;
	}
    }

    # set request uri
    $request->uri($url) if defined $url;

    # set request method (with default GET)
    if(defined $method) {
	if($method =~ /^POST$/i) {
	    $request->method('POST');
	    # ensure correct default value for content-type header
	    $request->header(Content_Type =>
			     'application/x-www-form-urlencoded');
	} else {
	    $request->method('GET');
	}
    } else {
	$request->method('GET');
    }

    # set request params
    if(defined $params) {
	my @params = ref($params) eq 'ARRAY' ? @$params : %$params;
	$request->params(\@params);
    }

    # pass authorization data
    if(defined $auth) {
	$request->authorization_basic(@$auth);
    }

    # set proxies
    if(defined $proxies) {
	for my $i (0 .. @$proxies / 2 - 1) {
	    $user_agent->proxy(@$proxies[2 * $i, 2 * $i + 1]);
	}
    }

    # pass proxy authorization data
    if(defined $pauth) {
	$request->proxy_authorization_basic(@$pauth);
    }

    # set http headers
    if(defined $headers) {
	$request->header(@$headers);
    }

    # set user agent name
    $ua_name = 'HTTP-WebTest/' . HTTP::WebTest->VERSION
	unless defined $ua_name;
    $user_agent->agent($ua_name);

    # define if requests are redirectable
    if($handle_redirects) {
	$user_agent->requests_redirectable([qw(GET POST)]);
    } else {
	$user_agent->requests_redirectable([]);
    }
}

1;