The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

HTTP::Request::Generator - generate HTTP requests

SYNOPSIS

    use HTTP::Request::Generator 'generate_requests';

    @requests = generate_requests(
        method  => 'GET',
        pattern => 'https://example.com/{bar,foo,gallery}/[00..99].html',
    );

    # generates 300 requests from
    #     https://example.com/bar/00.html to
    #     https://example.com/gallery/99.html

    @requests = generate_requests(
        method => 'POST',
        url    => '/profiles/:name',
        url_params => {
            name => ['Corion','Co-Rion'],
        },
        query_params => {
            stars => [2,3],
        },
        body_params => {
            comment => ['Some comment', 'Another comment, A++'],
        },
        headers => [
            {
                "Content-Type" => 'text/plain; encoding=UTF-8',
                Cookie => 'my_session_id',
            },
            {
                "Content-Type" => 'text/plain; encoding=Latin-1',
                Cookie => 'my_session_id',
            },
        ],
    );
    # Generates 16 requests out of the combinations

    for my $req (@requests) {
        $ua->request( $req );
    };

generate_requests( %options )

  my $g = generate_requests(
      url => '/profiles/:name',
      url_params => ['Mark','John'],
      wrap => sub {
          my( $req ) = @_;
          # Fix up some values
          $req->{headers}->{'Content-Length'} = 666;
      },
  );
  while( my $r = $g->()) {
      send_request( $r );
  };

This function creates data structures that are suitable for sending off a mass of similar but different HTTP requests. All array references are expanded into the cartesian product of their contents. The above example would create two requests:

      url => '/profiles/Mark,
      url => '/profiles/John',

generate_requests returns an iterator in scalar context. In list context, it returns the complete list of requests.

There are helper functions that will turn that data into a data structure suitable for your HTTP framework of choice.

  {
    method => 'GET',
    url => '/profiles/Mark',
    protocol => 'http',
    port => 80,
    headers => {},
    body_params => {},
    query_params => {},
  }

As a shorthand for creating lists, you can use the pattern option, which will expand a string into a set of requests. {} will expand into alternatives while [xx..yy] will expand into the range xx to yy. Note that these lists will be expanded in memory.

Options

pattern

Generate URLs from this pattern instead of query_params, url_params and url.

url

URL template to use.

url_params

Parameters to replace in the url template.

body_params

Parameters to replace in the POST body.

query_params

Parameters to replace in the GET request.

host

Hostname(s) to use.

port

Port(s) to use.

headers

Headers to use. Currently, no templates are generated for the headers. You have to specify complete sets of headers for each alternative.

limit

Limit the number of requests generated.

as_http_request

    generate_requests(
        method => 'POST',
        url    => '/feedback/:item',
        wrap => \&HTTP::Request::Generator::as_http_request,
    )

Converts the request data to a HTTP::Request object.

as_dancer

    generate_requests(
        method => 'POST',
        url    => '/feedback/:item',
        wrap => \&HTTP::Request::Generator::as_dancer,
    )

Converts the request data to a Dancer::Request object.

as_plack

    generate_requests(
        method => 'POST',
        url    => '/feedback/:item',
        wrap => \&HTTP::Request::Generator::as_plack,
    )

Converts the request data to a Plack::Request object.

SEE ALSO

The Curl Manpage for the pattern syntax