stas 2004/08/13 22:10:32 Modified: src/docs/2.0/api/Apache SubRequest.pod Log: finish the manpage Revision Changes Path 1.5 +255 -91 modperl-docs/src/docs/2.0/api/Apache/SubRequest.pod Index: SubRequest.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/2.0/api/Apache/SubRequest.pod,v retrieving revision 1.4 retrieving revision 1.5 diff -u -u -r1.4 -r1.5 --- SubRequest.pod 22 May 2004 02:03:27 -0000 1.4 +++ SubRequest.pod 14 Aug 2004 05:10:31 -0000 1.5 @@ -8,15 +8,35 @@ =head1 Synopsis use Apache::SubRequest (); - -META: to be completed + + # 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; + # optional + $subr->DESTROY; =head1 Description -META: to be completed +C<Apache::SubRequest> contains API for creating and running of Apache +sub-requests. + +C<Apache::SubRequest> is a sub-class of C<L<Apache::RequestRec +object|docs::2.0::api::Apache::RequestRec>>. + + + @@ -28,255 +48,399 @@ -=head2 C<DESTROY> -META: Autogenerated - needs to be reviewed/completed +=head2 C<DESTROY> Free the memory associated with a sub request - $r->DESTROY(); + $subr->DESTROY(); =over 4 -=item obj: C<$r> (C<L<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$subr> ( C<L<Apache::SubRequest +object|docs::2.0::api::Apache::SubRequest/Description>> ) The sub request to finish =item ret: no return value +=item since: 1.99_12 + =back +This method will be called automatically when C<$subr> goes out of +scope, so there is no need to call it explicitly, unless you want to +free the memory earlier than that (for example if you run several +subrequests). + + + + -=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); + +=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<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$sub_req> (string) +=item arg1: C<$new_uri> ( string ) -A subrequest created from this request +The URI to replace the current request with =item ret: no return value +=item since: 1.99_12 + =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<Apache::OK>. The +client will be unaware the a different request was served to her +behind the scenes. -=head2 C<internal_redirect> -META: Autogenerated - needs to be reviewed/completed -Then there's the case that you want some other request to be served as -the top-level request INSTEAD of what the client requested directly. -If so, call this from a handler, and then immediately return OK. -Redirect the current request to some other uri - $r->internal_redirect($new_uri); +=head2 C<internal_redirect_handler> + +Identical to C<internal_redirect|/C_internal_redirect_>, plus +automatically sets +C<L<$r-E<gt>content_type|docs::2.0::api::Apache::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::Apache::RequestRec/C_handler_>> is +true. + + $r->internal_redirect_handler($new_uri); =over 4 -=item obj: C<$r> (C<L<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$new_uri> (string) +=item arg1: C<$new_uri> ( string ) -The URI to replace the current request with +The URI to replace the current request with. =item ret: no return value +=item since: 1.99_12 + =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<internal_redirect_handler> -META: Autogenerated - needs to be reviewed/completed -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. - $r->internal_redirect_handler($new_uri); + + + +=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<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$new_uri> (string) +=item arg1: C<$new_file> ( string ) -The URI to replace the current request with. +The file to lookup -=item ret: no return value +=item opt arg2: C<$next_filter> +( C<L<Apache::Filter|docs::2.0::api::Apache::Filter>> ) -=back +See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for details. +=item ret: C<$ret> ( C<L<Apache::SubRequest +object|docs::2.0::api::Apache::SubRequest/Description>> ) +The sub request record. +=item since: 1.99_15 +=back -=head2 C<lookup_dirent> +See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for further discussion. -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, $subtype, $next_filter); + +=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<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$finfo> (C<L<APR::Finfo|docs::2.0::api::APR::Finfo>>) +=item arg1: C<$method> ( string ) -The apr_dir_read result to lookup +The method to use in the new sub request (e.g. C<"GET">) -=item arg2: C<$subtype> (integer) +=item arg2: C<$new_uri> ( string ) -What type of subrequest to perform, one of; +The URI to lookup - Apache::SUBREQ_NO_ARGS ignore r->args and r->path_info - Apache::SUBREQ_MERGE_ARGS merge r->args and r->path_info +=item opt arg3: C<$next_filter> +( C<L<Apache::Filter object|docs::2.0::api::Apache::Filter>> ) -=item arg3: C<$next_filter> (integer) +See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for details. -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<$ret> ( C<L<Apache::SubRequest +object|docs::2.0::api::Apache::SubRequest/Description>> ) -=item ret: C<$lr> (C<L<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +The sub request record. -The new request record +=item since: 1.99_15 =back +See C<L<$r-E<gt>lookup_uri|/C_lookup_uri_>> for further discussion. -=head2 C<lookup_file> -META: Autogenerated - needs to be reviewed/completed +=head2 C<lookup_uri> -Create a sub request for the given file. This sub request can be -inspected to find information about the requested file +Create a sub request from the given URI. This sub request can be +inspected to find information about the requested URI. - $ret = $r->lookup_file($new_file, $next_filter); + $ret = $r->lookup_uri($new_uri); + $ret = $r->lookup_uri($new_uri, $next_filter); =over 4 -=item obj: C<$r> (C<L<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$new_file> (string) +=item arg1: C<$new_uri> ( string ) The URI to lookup -=item arg2: C<$next_filter> (C<L<Apache::Filter|docs::2.0::api::Apache::Filter>>) +=item opt arg2: C<$next_filter> +( C<L<Apache::Filter object|docs::2.0::api::Apache::Filter>> ) -The first filter the sub_request should use. If this is NULL, it -defaults to the first filter for the main request +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::Apache::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::Apache::RequestRec/C_output_filters_>> +as an argument. -=item ret: C<$ret> (C<L<Apache::SubRequest|docs::2.0::api::Apache::SubRequest>>) +=item ret: C<$ret> ( C<L<Apache::SubRequest +object|docs::2.0::api::Apache::SubRequest/Description>> ) -The new request record +The sub request record + +=item since: 1.99_15 =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 Apache::OK; + } +If let's say you have three request output filters registered to run +for the main request: + + PerlOutputFilterHandler MyApache::SubReqExample::filterA + PerlOutputFilterHandler MyApache::SubReqExample::filterB + PerlOutputFilterHandler MyApache::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<Apache::RequestRec object|docs::2.0::api::Apache::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<Apache::OK>, C<Apache::DECLINED>, +etc.) + +=item since: 1.99_12 + +=back + + + + + + +=head1 Unsupported API + +C<Apache::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<lookup_uri> + + + + +=head2 C<internal_fast_redirect> META: Autogenerated - needs to be reviewed/completed -Create a sub request from the given URI. This sub request can be -inspected to find information about the requested URI. +Redirect the current request to a sub_req, merging the pools - $ret = $r->lookup_uri($new_file, $next_filter); + $r->internal_fast_redirect($sub_req); =over 4 -=item obj: C<$r> (C<L<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$new_file> (string) +=item arg1: C<$sub_req> ( string ) -The URI to lookup +A subrequest created from this request -=item arg2: C<$next_filter> (C<L<Apache::Filter|docs::2.0::api::Apache::Filter>>) +=item ret: no return value -The first filter the sub_request should use. If this is NULL, it -defaults to the first filter for the main request +=item since: 1.99_12 -=item ret: C<$ret> (C<L<Apache::SubRequest|docs::2.0::api::Apache::SubRequest>>) +=back -The new request record -=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_method_uri> + + +=head2 C<lookup_dirent> META: Autogenerated - needs to be reviewed/completed -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 +Create a sub request for the given apr_dir_read result. This sub request +can be inspected to find information about the requested file - $ret = $r->lookup_method_uri($method, $new_file, $next_filter); + $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<Apache::RequestRec|docs::2.0::api::Apache::RequestRec>>) +=item obj: C<$r> +( C<L<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The current request -=item arg1: C<$method> (string) +=item arg1: C<$finfo> +( C<L<APR::Finfo object|docs::2.0::api::APR::Finfo>> ) -The method to use in the new sub request +The apr_dir_read result to lookup -=item arg2: C<$new_file> (string) +=item arg2: C<$subtype> ( integer ) -The URI to lookup +What type of subrequest to perform, one of; -=item arg3: C<$next_filter> (C<L<Apache::Filter|docs::2.0::api::Apache::Filter>>) + Apache::SUBREQ_NO_ARGS ignore r->args and r->path_info + Apache::SUBREQ_MERGE_ARGS merge r->args and r->path_info -The first filter the sub_request should use. If this is NULL, it -defaults to the first filter for the main request +=item arg3: C<$next_filter> ( integer ) -=item ret: C<$ret> (C<L<Apache::SubRequest|docs::2.0::api::Apache::SubRequest>>) +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<Apache::RequestRec object|docs::2.0::api::Apache::RequestRec>> ) The new request record +=item since: 1.99_12 + =back + +META: where do we take the apr_dir_read result from? +
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]