=head1 NAME

Apache::Request - Methods for dealing with client request data

=head1 SYNOPSIS

    use Apache::Request;
    my $req = Apache::Request->new($r);

=head1 DESCRIPTION

I<Apache::Request> adds methods for parsing B<GET> requests and B<POST> 
requests where I<Content-type> is one of I<application/x-www-form-urlencoded> or 
I<multipart/form-data>.

=head1 Apache::Request METHODS

The interface is designed to mimic CGI.pm 's routines for parsing
query parameters. The main differences are 

=over 4

=item * C<Apache::Request::new> takes an environment-specific
object as (second) argument.

=item * The query parameters are stored as Apache::Table objects,
and are therefore parsed using case-insensitive keys.

=item * The query string is always parsed, even for POST requests.

=back

=head2 new  

creates a new I<Apache::Request> object with an environment object $r:

    my $req = Apache::Request->new($r);

With mod_perl2, the environment object must be an I<Apache::RequestRec>
object.  All methods from the environment class are inherited.

The following attributes are optional:

=over 4

=item POST_MAX

Limit the size of POST data (in bytes).

=item DISABLE_UPLOADS

Disable file uploads.

=item TEMP_DIR

Sets the directory where upload files are spooled.  On a *nix-like
that supports link(2), the TEMP_DIR should be located on the same
file system as the final destination file:

 my $req = Apache::Request->new($r, TEMP_DIR => "/home/httpd/tmp");
 my $upload = $req->upload('file');
 $upload->link("/home/user/myfile") || warn "link failed: $!";

=item HOOK_DATA [TODO]

Extra configuration info passed to an upload hook.
See the description for the next item, I<UPLOAD_HOOK>.

=item UPLOAD_HOOK [TODO]

Sets up a callback to run whenever file upload data is read. This
can be used to provide an upload progress meter during file uploads.
Apache will automatically continue writing the original data to
$upload->fh after the hook exits.

 my $transparent_hook = sub {
   my ($upload, $buf, $len, $hook_data) = @_;
   warn "$hook_data: got $len bytes for " . $upload->name;
 };

 my $apr = Apache::Request->new($r, 
                                HOOK_DATA => "Note",
                                UPLOAD_HOOK => $transparent_hook,
                               );

=back

=head2 param

Get or set (TODO) the request parameters (using case-insensitive keys) by
mimicing the OO interface of C<CGI::param>.

    # similar to CGI.pm

    my $value = $req->param('foo');
    my @values = $req->param('foo');
    my @params = $req->param;

    # the following differ slightly from CGI.pm

    # assigns multiple values to 'foo'
    $req->param('foo' => [qw(one two three)]); # TODO

    # returns ref to underlying apache table object
    my $table = $req->param; # identical to $apr->parms - see below

=head2 parms, params

Get the full parameter table of the I<Apache::Request> object.

   # returns ref to Apache::Request::Table object provided by $apache_table
   my $table = $req->parms;

An optional name parameter can be passed to return the parameter
associated with the given name:

   my $param = $req->parms($name);

=head2 args

Returns an I<Apache::Request::Table> object containing the query-string 
parameters of the I<Apache::Request> object.

   my $args = $req->args;

An optional name parameter can be passed to return the query string
parameter associated with the given name:

   my $arg = $req->args($name);

=head2 body

Returns an I<Apache::Request::Table> object containing the POST data 
parameters of the I<Apache::Request> object.

   my $body = $req->body;

An optional name parameter can be passed to return the POST data
parameter associated with the given name:

   my $param = $req->body($name);


=head2 upload

With no arguments, this returns an I<Apache::Upload::Table> object in 
scalar context, or the names of all I<Apache::Upload> objects in
list context.

An optional name parameter can be passed to return the I<Apache::Upload>
object associated with the given name:

    my $upload = $apr->upload($name);

=head1 SUBCLASSING Apache::Request

If the instances of your subclass are hash references then you can actually
inherit from Apache::Request as long as the Apache::Request object is stored in
an attribute called "r" or "_r". (The Apache::Request class effectively does the
delegation for you automagically, as long as it knows where to find the
Apache::Request object to delegate to.)  For example:

	package MySubClass;
	use Apache::Request;
	our @ISA = qw(Apache::Request);
	sub new {
		my($class, @args) = @_;
		return bless { r => Apache::Request->new(@args) }, $class;
	}

=head1 Apache::Upload METHODS

=head2 name

The name of the filefield parameter:

    my $name = $upload->name;

=head2 filename

The filename of the uploaded file:

    my $filename = $upload->filename;

=head2 bb [replaces fh]

The APR::Brigade containing the contents of the uploaded file.

=head2 size [TODO]

The size of the file in bytes:

    my $size = $upload->size;

=head2 info

The additional header information for the uploaded file.
Returns a hash reference tied to the I<Apache::Table> class.
An optional I<key> argument can be passed to return the value of 
a given header rather than a hash reference.  Examples:

    my $info = $upload->info;
    while (my($key, $val) = each %$info) {
	...
    }

    my $val = $upload->info("Content-type");

=head2 type [TODO]

Returns the I<Content-Type> for the given I<Apache::Upload> object:

    my $type = $upload->type;
    #same as
    my $type = $upload->info("Content-Type");

=head2 tempname [XXX- Does this mesh with brigade API?]

Provides the name of the spool file. This method is reserved for
debugging purposes, and is possibly subject to change in a future
version of Apache::Request.

=head2 link

To avoid recopying the upload's internal tempfile brigade on a 
*nix-like system, I<link> will create a hard link to it:

  my $upload = $apr->upload('file');
  $upload->link("/path/to/newfile") or
      die sprintf "link from '%s' failed: $!", $upload->tempname;

Typically the new name must lie on the same file system as the
brigade's tempfile. Check your system's link(2) manpage for details.

=head1 SEE ALSO

APR::Table(3)

=head1 CREDITS

This interface is based on the original pure Perl version by Lincoln Stein.

=head1 AUTHORS

Doug MacEachern, Joe Schaefer, Steve Hay.

=head1 MISSING DOCS

$req->config, Apache::Request::Table, Apache::Upload::Table.