=head1 NAME Apache2::SubRequest - Perl API for Apache subrequests =head1 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; =head1 Description C<Apache2::SubRequest> contains API for creating and running of Apache sub-requests. C<Apache2::SubRequest> is a sub-class of C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>>. =head1 API C<Apache2::SubRequest> provides the following functions and/or methods: =head2 C<DESTROY> Free the memory associated with a sub request: undef $subr; # but normally don't do that =over 4 =item obj: C<$subr> ( C<L<Apache2::SubRequest object|docs::2.0::api::Apache2::SubRequest/Description>> ) The sub request to finish =item ret: no return value =item since: 2.0.00 =back C<DESTROY> is called automatically when C<$subr> goes out of scope. If you want to free the memory earlier than that (for example if you run several subrequests), you can C<undef> the object as: undef $subr; but never call C<DESTROY> explicitly, since it'll result in C<ap_destroy_sub_req> being called more than once, resulting in multiple brain injuries and certain hair loss. =head2 C<internal_redirect> Redirect the current request to some other uri internally $r->internal_redirect($new_uri); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$new_uri> ( string ) The URI to replace the current request with =item ret: no return value =item since: 2.0.00 =back 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 C<Apache2::Const::OK>. The client will be unaware the a different request was served to her behind the scenes. =head2 C<internal_redirect_handler> Identical to C<L<internal_redirect|/C_internal_redirect_>>, plus automatically sets C<L<$r-E<gt>content_type|docs::2.0::api::Apache2::RequestRec/C_content_type_>> is of the sub-request to be the same as of the main request, if C<L<$r-E<gt>handler|docs::2.0::api::Apache2::RequestRec/C_handler_>> is true. $r->internal_redirect_handler($new_uri); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$new_uri> ( string ) The URI to replace the current request with. =item ret: no return value =item since: 2.0.00 =back This function is designed for things like actions or CGI scripts, when using C<AddHandler>, and you want to preserve the content type across an internal redirect. =head2 C<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); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$new_file> ( string ) The file to lookup =item opt arg2: C<$next_filter> ( C<L<Apache2::Filter|docs::2.0::api::Apache2::Filter>> ) See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for details. =item ret: C<$ret> ( C<L<Apache2::SubRequest object|docs::2.0::api::Apache2::SubRequest/Description>> ) The sub request record. =item since: 2.0.00 =back See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for further discussion. =head2 C<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); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$method> ( string ) The method to use in the new sub request (e.g. C<"GET">) =item arg2: C<$new_uri> ( string ) The URI to lookup =item opt arg3: C<$next_filter> ( C<L<Apache2::Filter object|docs::2.0::api::Apache2::Filter>> ) See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for details. =item ret: C<$ret> ( C<L<Apache2::SubRequest object|docs::2.0::api::Apache2::SubRequest/Description>> ) The sub request record. =item since: 2.0.00 =back See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for further discussion. =head2 C<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); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$new_uri> ( string ) The URI to lookup =item opt arg2: C<$next_filter> ( C<L<Apache2::Filter object|docs::2.0::api::Apache2::Filter>> ) 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 C<L<$r-E<gt>proto_output_filters|docs::2.0::api::Apache2::RequestRec/C_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 C<L<$r-E<gt>output_filters|docs::2.0::api::Apache2::RequestRec/C_output_filters_>> as an argument. =item ret: C<$ret> ( C<L<Apache2::SubRequest object|docs::2.0::api::Apache2::SubRequest/Description>> ) The sub request record =item since: 2.0.00 =back Here is an example of a simple subrequest which serves uri I</new_uri>: sub handler { my $r = shift; my $subr = $r->lookup_uri("/new_uri"); $sub->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 (C<filterA>), the code needs to be adjusted to be: my $subr = $r->lookup_uri("/new_uri", $r->output_filters->next); =head2 C<run> Run a sub-request $rc = $subr->run(); =over 4 =item obj: C<$subr> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The sub-request (e.g. returned by C<L<lookup_uri|/C_lookup_uri_>>) =item ret: C<$rc> ( integer ) The return code of the handler (C<Apache2::Const::OK>, C<Apache2::Const::DECLINED>, etc.) =item since: 2.0.00 =back =head1 Unsupported API C<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 L<the mod_perl development mailing list|maillist::dev> so we can help each other take the steps necessary to shift the method to an officially supported API. =head2 C<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); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$sub_req> ( string ) A subrequest created from this request =item ret: no return value =item since: 2.0.00 =back 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? =head2 C<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); =over 4 =item obj: C<$r> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The current request =item arg1: C<$finfo> ( C<L<APR::Finfo object|docs::2.0::api::APR::Finfo>> ) The apr_dir_read result to lookup =item arg2: C<$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 =item arg3: C<$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 =item ret: C<$lr> ( C<L<Apache2::RequestRec object|docs::2.0::api::Apache2::RequestRec>> ) The new request record =item since: 2.0.00 =back META: where do we take the apr_dir_read result from? =head1 See Also L<mod_perl 2.0 documentation|docs::2.0::index>. =head1 Copyright mod_perl 2.0 and its core modules are copyrighted under The Apache Software License, Version 2.0. =head1 Authors L<The mod_perl development team and numerous contributors|about::contributors::people>. =cut