NAME
Apache2::SubRequest - Perl API for Apache subrequests
Synopsis
use
Apache2::SubRequest ();
# run internal redirects at once
$r
->internal_redirect(
$new_uri
);
$r
->internal_redirect_handler(
$new_uri
);
# create internal redirect objects
$subr
=
$r
->lookup_uri(
"/foo"
);
$subr
=
$r
->lookup_method_uri(
"GET"
,
"/tmp/bar"
)
$subr
=
$r
->lookup_file(
"/tmp/bar"
);
# optionally manipulate the output through main request filters
$subr
=
$r
->lookup_uri(
"/foo"
,
$r
->output_filters);
# now run them
my
$rc
=
$subr
->run;
Description
Apache2::SubRequest
contains API for creating and running of Apache sub-requests.
Apache2::SubRequest
is a sub-class of Apache2::RequestRec object
.
API
Apache2::SubRequest
provides the following functions and/or methods:
DESTROY
Free the memory associated with a sub request:
undef
$subr
;
# but normally don't do that
- obj:
$subr
(Apache2::SubRequest object
) -
The sub request to finish
- ret: no return value
- since: 2.0.00
DESTROY
is called automatically when $subr
goes out of scope.
If you want to free the memory earlier than that (for example if you run several subrequests), you can undef
the object as:
undef
$subr
;
but never call DESTROY
explicitly, since it'll result in ap_destroy_sub_req
being called more than once, resulting in multiple brain injuries and certain hair loss.
internal_redirect
Redirect the current request to some other uri internally
$r
->internal_redirect(
$new_uri
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$new_uri
( string ) -
The URI to replace the current request with
- ret: no return value
- since: 2.0.00
In case that you want some other request to be served as the top-level request instead of what the client requested directly, call this method from a handler, and then immediately return Apache2::Const::OK
. The client will be unaware the a different request was served to her behind the scenes.
internal_redirect_handler
Identical to internal_redirect
, plus automatically sets $r->content_type
is of the sub-request to be the same as of the main request, if $r->handler
is true.
$r
->internal_redirect_handler(
$new_uri
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$new_uri
( string ) -
The URI to replace the current request with.
- ret: no return value
- since: 2.0.00
This function is designed for things like actions or CGI scripts, when using AddHandler
, and you want to preserve the content type across an internal redirect.
lookup_file
Create a subrequest for the given file. This sub request can be inspected to find information about the requested file
$ret
=
$r
->lookup_file(
$new_file
);
$ret
=
$r
->lookup_file(
$new_file
,
$next_filter
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$new_file
( string ) -
The file to lookup
- opt arg2:
$next_filter
(Apache2::Filter
) -
See
$r->lookup_uri
for details. - ret:
$ret
(Apache2::SubRequest object
) -
The sub request record.
- since: 2.0.00
See $r->lookup_uri
for further discussion.
lookup_method_uri
Create a sub request for the given URI using a specific method. This sub request can be inspected to find information about the requested URI
$ret
=
$r
->lookup_method_uri(
$method
,
$new_uri
);
$ret
=
$r
->lookup_method_uri(
$method
,
$new_uri
,
$next_filter
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$method
( string ) -
The method to use in the new sub request (e.g.
"GET"
) - arg2:
$new_uri
( string ) -
The URI to lookup
- opt arg3:
$next_filter
(Apache2::Filter object
) -
See
$r->lookup_uri
for details. - ret:
$ret
(Apache2::SubRequest object
) -
The sub request record.
- since: 2.0.00
See $r->lookup_uri
for further discussion.
lookup_uri
Create a sub request from the given URI. This sub request can be inspected to find information about the requested URI.
$ret
=
$r
->lookup_uri(
$new_uri
);
$ret
=
$r
->lookup_uri(
$new_uri
,
$next_filter
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$new_uri
( string ) -
The URI to lookup
- opt arg2:
$next_filter
(Apache2::Filter object
) -
The first filter the subrequest should pass the data through. If not specified it defaults to the first connection output filter for the main request
$r->proto_output_filters
. So if the subrequest sends any output it will be filtered only once. If for example you desire to apply the main request's output filters to the sub-request output as well pass$r->output_filters
as an argument. - ret:
$ret
(Apache2::SubRequest object
) -
The sub request record
- since: 2.0.00
Here is an example of a simple subrequest which serves uri /new_uri:
sub
handler {
my
$r
=
shift
;
my
$subr
=
$r
->lookup_uri(
"/new_uri"
);
$subr
->run;
return
Apache2::Const::OK;
}
If let's say you have three request output filters registered to run for the main request:
PerlOutputFilterHandler MyApache2::SubReqExample::filterA
PerlOutputFilterHandler MyApache2::SubReqExample::filterB
PerlOutputFilterHandler MyApache2::SubReqExample::filterC
and you wish to run them all, the code needs to become:
my
$subr
=
$r
->lookup_uri(
"/new_uri"
,
$r
->output_filters);
and if you wish to run them all, but the first one (filterA
), the code needs to be adjusted to be:
my
$subr
=
$r
->lookup_uri(
"/new_uri"
,
$r
->output_filters->
next
);
run
Run a sub-request
$rc
=
$subr
->run();
- obj:
$subr
(Apache2::RequestRec object
) -
The sub-request (e.g. returned by
lookup_uri
) - ret:
$rc
( integer ) -
The return code of the handler (
Apache2::Const::OK
,Apache2::Const::DECLINED
, etc.) - since: 2.0.00
Unsupported API
Apache2::SubRequest
also provides auto-generated Perl interface for a few other methods which aren't tested at the moment and therefore their API is a subject to change. These methods will be finalized later as a need arises. If you want to rely on any of the following methods please contact the the mod_perl development mailing list so we can help each other take the steps necessary to shift the method to an officially supported API.
internal_fast_redirect
META: Autogenerated - needs to be reviewed/completed
Redirect the current request to a sub_req, merging the pools
$r
->internal_fast_redirect(
$sub_req
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$sub_req
( string ) -
A subrequest created from this request
- ret: no return value
- since: 2.0.00
META: httpd-2.0/modules/http/http_request.c declares this function as:
/* XXX: Is this function is so bogus and fragile that we deep-6 it? */
do we really want to expose it to mod_perl users?
lookup_dirent
META: Autogenerated - needs to be reviewed/completed
Create a sub request for the given apr_dir_read result. This sub request can be inspected to find information about the requested file
$lr
=
$r
->lookup_dirent(
$finfo
);
$lr
=
$r
->lookup_dirent(
$finfo
,
$subtype
);
$lr
=
$r
->lookup_dirent(
$finfo
,
$subtype
,
$next_filter
);
- obj:
$r
(Apache2::RequestRec object
) -
The current request
- arg1:
$finfo
(APR::Finfo object
) -
The apr_dir_read result to lookup
- arg2:
$subtype
( integer ) -
What type of subrequest to perform, one of;
Apache2::SUBREQ_NO_ARGS ignore r->args and r->path_info
Apache2::SUBREQ_MERGE_ARGS merge r->args and r->path_info
- arg3:
$next_filter
( integer ) -
The first filter the sub_request should use. If this is NULL, it defaults to the first filter for the main request
- ret:
$lr
(Apache2::RequestRec object
) -
The new request record
- since: 2.0.00
META: where do we take the apr_dir_read result from?
See Also
Copyright
mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0.