| <HTML> |
| <HEAD> |
| <TITLE>Apache::Request - Methods for dealing with client request data</TITLE> |
| <LINK REV="made" HREF="mailto:hackers@FreeBSD.org"> |
| </HEAD> |
| |
| <BODY> |
| |
| <!-- INDEX BEGIN --> |
| |
| <UL> |
| |
| <LI><A HREF="#NAME">NAME</A> |
| <LI><A HREF="#SYNOPSIS">SYNOPSIS</A> |
| <LI><A HREF="#DESCRIPTION">DESCRIPTION</A> |
| <LI><A HREF="#Apache_Request_METHODS">Apache::Request METHODS</A> |
| <UL> |
| |
| <LI><A HREF="#new">new</A> |
| <LI><A HREF="#instance">instance</A> |
| <LI><A HREF="#parse">parse</A> |
| <LI><A HREF="#param">param</A> |
| <LI><A HREF="#parms">parms</A> |
| <LI><A HREF="#upload">upload</A> |
| </UL> |
| |
| <LI><A HREF="#Apache_Upload_METHODS">Apache::Upload METHODS</A> |
| <UL> |
| |
| <LI><A HREF="#name">name</A> |
| <LI><A HREF="#filename">filename</A> |
| <LI><A HREF="#fh">fh</A> |
| <LI><A HREF="#size">size</A> |
| <LI><A HREF="#info">info</A> |
| <LI><A HREF="#type">type</A> |
| <LI><A HREF="#next">next</A> |
| <LI><A HREF="#tempname">tempname</A> |
| <LI><A HREF="#link">link</A> |
| </UL> |
| |
| <LI><A HREF="#SEE_ALSO">SEE ALSO</A> |
| <LI><A HREF="#CREDITS">CREDITS</A> |
| <LI><A HREF="#AUTHOR">AUTHOR</A> |
| </UL> |
| <!-- INDEX END --> |
| |
| <HR> |
| <P> |
| <H1><A NAME="NAME">NAME</A></H1> |
| <P> |
| Apache::Request - Methods for dealing with client request data |
| |
| <P> |
| <HR> |
| <H1><A NAME="SYNOPSIS">SYNOPSIS</A></H1> |
| <P> |
| <PRE> use Apache::Request (); |
| my $apr = Apache::Request->new($r); |
| </PRE> |
| <P> |
| <HR> |
| <H1><A NAME="DESCRIPTION">DESCRIPTION</A></H1> |
| <P> |
| <EM>Apache::Request</EM> is a subclass of the <EM>Apache</EM> class, which adds methods for parsing <STRONG>GET</STRONG> requests and <STRONG>POST</STRONG> requests where <EM>Content-type</EM> |
| is one of <EM>application/x-www-form-urlencoded</EM> or |
| <EM>multipart/form-data</EM>. See the <CODE>libapreq(3)</CODE> manpage for more details. |
| |
| <P> |
| <HR> |
| <H1><A NAME="Apache_Request_METHODS">Apache::Request METHODS</A></H1> |
| <P> |
| The interface is designed to mimic CGI.pm 's routines for parsing query |
| parameters. The main differences are |
| |
| <UL> |
| <LI><STRONG><A NAME="item_Apache">Apache::Request::new takes an Apache object as (second) argument.</A></STRONG> |
| <LI><STRONG><A NAME="item_The">The query parameters are stored as Apache::Table objects, |
| and are therefore parsed using case-insensitive keys.</A></STRONG> |
| <LI><STRONG><A NAME="item__attr_gt_val_type_arguments_a">-attr =gt $val -type arguments are not supported.</A></STRONG> |
| <LI><STRONG><A NAME="item_The">The query string is always parsed, even for POST requests.</A></STRONG> |
| </UL> |
| <H2><A NAME="new">new</A></H2> |
| <P> |
| Create a new <EM>Apache::Request</EM> object with an <EM>Apache</EM> request_rec object: |
| |
| <P> |
| <PRE> my $apr = Apache::Request->new($r); |
| </PRE> |
| <P> |
| All methods from the <EM>Apache</EM> class are inherited. |
| |
| <P> |
| The following attributes are optional: |
| |
| <DL> |
| <DT><STRONG><A NAME="item_POST_MAX">POST_MAX</A></STRONG><DD> |
| <P> |
| Limit the size of POST data (in bytes). <EM>Apache::Request::parse</EM> will return an error code if the size is exceeded: |
| |
| <P> |
| <PRE> my $apr = Apache::Request->new($r, POST_MAX => 1024); |
| my $status = $apr->parse; |
| </PRE> |
| <P> |
| <PRE> if ($status) { |
| my $errmsg = $apr->notes("error-notes"); |
| ... |
| return $status; |
| } |
| </PRE> |
| <DT><STRONG><A NAME="item_DISABLE_UPLOADS">DISABLE_UPLOADS</A></STRONG><DD> |
| <P> |
| Disable file uploads. <EM>Apache::Request::parse</EM> will return an error code if a file upload is attempted: |
| |
| <P> |
| <PRE> my $apr = Apache::Request->new($r, DISABLE_UPLOADS => 1); |
| my $status = $apr->parse; |
| </PRE> |
| <P> |
| <PRE> if ($status) { |
| my $errmsg = $apr->notes("error-notes"); |
| ... |
| return $status; |
| } |
| </PRE> |
| <DT><STRONG><A NAME="item_TEMP_DIR">TEMP_DIR</A></STRONG><DD> |
| <P> |
| Sets the directory where upload files are spooled. On a *nix-like that |
| supports <CODE>link(2),</CODE> the TEMP_DIR should be located on the same |
| file system as the final destination file: |
| |
| <P> |
| <PRE> my $apr = Apache::Request->new($r, TEMP_DIR => "/home/httpd/tmp"); |
| my $upload = $apr->upload('file'); |
| $upload->link("/home/user/myfile") || warn "link failed: $!"; |
| </PRE> |
| <DT><STRONG><A NAME="item_HOOK_DATA">HOOK_DATA</A></STRONG><DD> |
| <P> |
| Extra configuration info passed to an upload hook. See the description for |
| the next item, <EM>UPLOAD_HOOK</EM>. |
| |
| <DT><STRONG><A NAME="item_UPLOAD_HOOK">UPLOAD_HOOK</A></STRONG><DD> |
| <P> |
| 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. |
| |
| <P> |
| <PRE> my $transparent_hook = sub { |
| my ($upload, $buf, $len, $hook_data) = @_; |
| warn "$hook_data: got $len bytes for " . $upload->name; |
| }; |
| </PRE> |
| <P> |
| <PRE> my $apr = Apache::Request->new($r, |
| HOOK_DATA => "Note", |
| UPLOAD_HOOK => $transparent_hook, |
| ); |
| $apr->parse; |
| </PRE> |
| |
| <H2><A NAME="instance">instance</A></H2> |
| <P> |
| The <CODE>instance()</CODE> class method allows Apache::Request to be a |
| singleton. This means that whenever you call Apache::Request->instance() |
| within a single request you always get the same Apache::Request object |
| back. This solves the problem with creating the Apache::Request object |
| twice within the same request - the symptoms being that the second |
| Apache::Request object will not contain the form parameters because they |
| have already been read and parsed. |
| |
| <P> |
| <PRE> my $apr = Apache::Request->instance($r, DISABLE_UPLOADS => 1); |
| </PRE> |
| <P> |
| Note that <CODE>instance()</CODE> call will take the same parameters as the above call to <CODE>new()</CODE>, however the parameters will only have an effect the first time <CODE>instance()</CODE> is called within a single request. Extra parameters will be ignored on |
| subsequent calls to <CODE>instance()</CODE> within the same request. |
| |
| <P> |
| Subrequests receive a new Apache::Request object when they call |
| <CODE>instance()</CODE> - the parent request's Apache::Request object is |
| not copied into the subrequest. |
| |
| <P> |
| Also note that it is unwise to use the <CODE>parse()</CODE> method when using |
| <CODE>instance()</CODE> because you may end up trying to call it twice, and detecting errors where |
| there are none. |
| |
| <H2><A NAME="parse">parse</A></H2> |
| <P> |
| The <EM>parse</EM> method does the actual work of parsing the request. It is called for you by |
| the accessor methods, so it is not required but can be useful to provide a |
| more user-friendly message should an error occur: my <CODE>$r</CODE> = |
| shift; my <CODE>$apr</CODE> = Apache::Request->new($r); my |
| <CODE>$status</CODE> = $apr->parse; unless ($status == OK) { |
| $apr->custom_response($status, $apr->notes(``error-notes'')); return |
| $status; } |
| |
| <H2><A NAME="param">param</A></H2> |
| <P> |
| Get or set request parameters (using case-insensitive keys) by mimicing the |
| OO interface of <CODE>CGI::param</CODE>. Unlike the CGI.pm version, Apache::Request's param method is <EM>very</EM> fast- it's now quicker than even mod_perl's native Apache->args method. |
| However, CGI.pm's |
| <CODE>-attr =&gt; $val</CODE> type arguments are not supported. |
| |
| <P> |
| <PRE> # similar to CGI.pm |
| </PRE> |
| <P> |
| <PRE> my $value = $apr->param('foo'); |
| my @values = $apr->param('foo'); |
| my @params = $apr->param; |
| </PRE> |
| <P> |
| <PRE> # the following differ slightly from CGI.pm |
| </PRE> |
| <P> |
| <PRE> # assigns multiple values to 'foo' |
| $apr->param('foo' => [qw(one two three)]); |
| </PRE> |
| <P> |
| <PRE> # returns ref to underlying apache table object |
| my $table = $apr->param; # identical to $apr->parms - see below |
| </PRE> |
| <H2><A NAME="parms">parms</A></H2> |
| <P> |
| Get or set the underlying apache parameter table of the <EM>Apache::Request</EM> |
| object. When invoked without arguments, <CODE>parms</CODE> returns a reference to an <EM>Apache::Table</EM> object that is tied to the Apache::Request object's parameter table. If |
| called with an Apache::Table reference as as argument, the Apache::Request |
| object's parameter table is replaced by the argument's table. |
| |
| <P> |
| <PRE> # $apache_table references an Apache::Table object |
| $apr->parms($apache_table); # sets $apr's parameter table |
| </PRE> |
| <P> |
| <PRE> # returns ref to Apache::Table object provided by $apache_table |
| my $table = $apr->parms; |
| </PRE> |
| <H2><A NAME="upload">upload</A></H2> |
| <P> |
| Returns a single <EM>Apache::Upload</EM> object in a scalar context or all <EM>Apache::Upload</EM> objects in a list context: |
| |
| <P> |
| <PRE> my $upload = $apr->upload; |
| my $fh = $upload->fh; |
| my $lines = 0; |
| while(<$fh>) { |
| ++$lines; |
| ... |
| } |
| </PRE> |
| <P> |
| An optional name parameter can be passed to return the <EM>Apache::Upload</EM> |
| object associated with the given name: |
| |
| <P> |
| <PRE> my $upload = $apr->upload($name); |
| </PRE> |
| |
| <P> |
| <HR> |
| <H1><A NAME="Apache_Upload_METHODS">Apache::Upload METHODS</A></H1> |
| <H2><A NAME="name">name</A></H2> |
| <P> |
| The name of the filefield parameter: |
| |
| <P> |
| <PRE> my $name = $upload->name; |
| </PRE> |
| <H2><A NAME="filename">filename</A></H2> |
| <P> |
| The filename of the uploaded file: |
| |
| <P> |
| <PRE> my $filename = $upload->filename; |
| </PRE> |
| <H2><A NAME="fh">fh</A></H2> |
| <P> |
| The filehandle pointing to the uploaded file: |
| |
| <P> |
| <PRE> my $fh = $upload->fh; |
| while (<$fh>) { |
| ... |
| } |
| </PRE> |
| <H2><A NAME="size">size</A></H2> |
| <P> |
| The size of the file in bytes: |
| |
| <P> |
| <PRE> my $size = $upload->size; |
| </PRE> |
| <H2><A NAME="info">info</A></H2> |
| <P> |
| The additional header information for the uploaded file. Returns a hash |
| reference tied to the <EM>Apache::Table</EM> class. An optional <EM>key</EM> argument can be passed to return the value of a given header rather than a |
| hash reference. Examples: |
| |
| <P> |
| <PRE> my $info = $upload->info; |
| while (my($key, $val) = each %$info) { |
| ... |
| } |
| </PRE> |
| <P> |
| <PRE> my $val = $upload->info("Content-type"); |
| </PRE> |
| <H2><A NAME="type">type</A></H2> |
| <P> |
| Returns the <EM>Content-Type</EM> for the given <EM>Apache::Upload</EM> object: |
| |
| <P> |
| <PRE> my $type = $upload->type; |
| #same as |
| my $type = $upload->info("Content-Type"); |
| </PRE> |
| <H2><A NAME="next">next</A></H2> |
| <P> |
| Upload objects are implemented as a linked list by libapreq; the |
| <EM>next</EM> method provides an alternative to using the <EM>Apache::Request</EM> |
| |
| <EM>upload</EM> method in a list context: |
| |
| <P> |
| <PRE> for (my $upload = $apr->upload; $upload; $upload = $upload->next) { |
| ... |
| } |
| </PRE> |
| <P> |
| <PRE> #functionally the same as: |
| </PRE> |
| <P> |
| <PRE> for my $upload ($apr->upload) { |
| ... |
| } |
| </PRE> |
| <H2><A NAME="tempname">tempname</A></H2> |
| <P> |
| 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. |
| |
| <H2><A NAME="link">link</A></H2> |
| <P> |
| To avoid recopying the spool file on a *nix-like system, |
| <EM>link</EM> will create a hard link to it: |
| |
| <P> |
| <PRE> my $upload = $apr->upload('file'); |
| $upload->link("/path/to/newfile") or |
| die sprintf "link from '%s' failed: $!", $upload->tempname; |
| </PRE> |
| <P> |
| Typically the new name must lie on the same file system as the spool file. |
| Check your system's <CODE>link(2)</CODE> manpage for details. |
| |
| |
| <P> |
| <HR> |
| <H1><A NAME="SEE_ALSO">SEE ALSO</A></H1> |
| <P> |
| <CODE>libapreq(3),</CODE> Apache::Table(3) |
| |
| <P> |
| <HR> |
| <H1><A NAME="CREDITS">CREDITS</A></H1> |
| <P> |
| This interface is based on the original pure Perl version by Lincoln Stein. |
| |
| <P> |
| <HR> |
| <H1><A NAME="AUTHOR">AUTHOR</A></H1> |
| <P> |
| Doug MacEachern, updated for v1.0 by Joe Schaefer |
| </BODY> |
| |
| </HTML> |